Add YAML reader
This commit is contained in:
parent
357bcc19c0
commit
b4327303ee
4 changed files with 271 additions and 1 deletions
|
@ -21,6 +21,7 @@ files = [
|
||||||
'object.cc',
|
'object.cc',
|
||||||
'object_sphere.cc',
|
'object_sphere.cc',
|
||||||
'object_plane.cc',
|
'object_plane.cc',
|
||||||
|
'reader_yaml.cc',
|
||||||
'scene.cc',
|
'scene.cc',
|
||||||
'writer_png.cc',
|
'writer_png.cc',
|
||||||
]
|
]
|
||||||
|
@ -30,7 +31,7 @@ for f in files:
|
||||||
objs.append(env.Object(f))
|
objs.append(env.Object(f))
|
||||||
|
|
||||||
lib = env.Library('charles', files)
|
lib = env.Library('charles', files)
|
||||||
prog = env.Program('charles', ['charles.cc'], LIBS=[lib, 'png'])
|
prog = env.Program('charles', ['charles.cc'], LIBS=[lib, 'png', 'yaml'])
|
||||||
env.Alias('charles', prog)
|
env.Alias('charles', prog)
|
||||||
|
|
||||||
env.Default('charles')
|
env.Default('charles')
|
||||||
|
|
32
src/reader.hh
Normal file
32
src/reader.hh
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/* reader.hh
|
||||||
|
* vim: set tw=80:
|
||||||
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Interface for an input file reader.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __READER_HH__
|
||||||
|
#define __READER_HH__
|
||||||
|
|
||||||
|
#include "scene.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct Reader
|
||||||
|
{
|
||||||
|
Reader(Scene& scene)
|
||||||
|
: mScene(scene)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual
|
||||||
|
~Reader()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual ssize_t read_file(const std::string& filename) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Scene& mScene;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __READER_HH__ */
|
208
src/reader_yaml.cc
Normal file
208
src/reader_yaml.cc
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
/* reader_yaml.cc
|
||||||
|
* vim: set tw=80:
|
||||||
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* An input file reader for YAML files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
|
#include "yaml.h"
|
||||||
|
|
||||||
|
#include "reader_yaml.hh"
|
||||||
|
|
||||||
|
|
||||||
|
struct Parser;
|
||||||
|
typedef std::stack<Parser *> ParserStack;
|
||||||
|
|
||||||
|
|
||||||
|
struct Parser
|
||||||
|
{
|
||||||
|
Parser(Scene& scene,
|
||||||
|
ParserStack& parsers)
|
||||||
|
: mScene(scene),
|
||||||
|
mParsers(parsers)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual
|
||||||
|
~Parser()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
handle_start_event(yaml_event_t& event)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
handle_end_event(yaml_event_t& event)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
virtual void
|
||||||
|
handle_event(yaml_event_t& event)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Scene& mScene;
|
||||||
|
ParserStack &mParsers;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Parser();
|
||||||
|
Parser(Parser& other);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct DocumentParser
|
||||||
|
: public Parser
|
||||||
|
{
|
||||||
|
DocumentParser(Scene& scene,
|
||||||
|
ParserStack& parsers)
|
||||||
|
: Parser(scene, parsers)
|
||||||
|
{
|
||||||
|
printf("DocumentParser\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
~DocumentParser()
|
||||||
|
{
|
||||||
|
printf("~DocumentParser\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
handle_event(yaml_event_t& event)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct StreamParser
|
||||||
|
: public Parser
|
||||||
|
{
|
||||||
|
StreamParser(Scene& scene,
|
||||||
|
ParserStack& parsers)
|
||||||
|
: Parser(scene, parsers)
|
||||||
|
{
|
||||||
|
printf("StreamParser\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
~StreamParser()
|
||||||
|
{
|
||||||
|
printf("~StreamParser\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
handle_start_event(yaml_event_t& event)
|
||||||
|
{
|
||||||
|
printf("Stream start\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
handle_end_event(yaml_event_t& event)
|
||||||
|
{
|
||||||
|
switch (event.type) {
|
||||||
|
case YAML_DOCUMENT_START_EVENT:
|
||||||
|
mParsers.push(new DocumentParser(mScene, mParsers));
|
||||||
|
mParsers.top()->handle_start_event(event);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* TODO: Error out, somehow. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
handle_event(yaml_event_t& event)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
private:
|
||||||
|
StreamParser();
|
||||||
|
StreamParser(StreamParser& other);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct SceneDocumentParser
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
YAMLReader::read_file(const std::string& filename)
|
||||||
|
{
|
||||||
|
|
||||||
|
FILE *yaml_infile = fopen(filename.c_str(), "rb");
|
||||||
|
if (!yaml_infile) {
|
||||||
|
fprintf(stderr, "Couldn't open file: %s\n", filename.c_str());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
yaml_parser_t parser;
|
||||||
|
yaml_parser_initialize(&parser);
|
||||||
|
|
||||||
|
printf("Reading file: %s\n", filename.c_str());
|
||||||
|
yaml_parser_set_input_file(&parser, yaml_infile);
|
||||||
|
|
||||||
|
ParserStack parsers;
|
||||||
|
bool success = true;
|
||||||
|
bool done = false;
|
||||||
|
yaml_event_t event;
|
||||||
|
while (!done) {
|
||||||
|
if (!yaml_parser_parse(&parser, &event)) {
|
||||||
|
success = false;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (event.type) {
|
||||||
|
case YAML_NO_EVENT:
|
||||||
|
printf("YAML_NO_EVENT\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case YAML_STREAM_START_EVENT:
|
||||||
|
printf("YAML_STREAM_START_EVENT\n");
|
||||||
|
parsers.push(new StreamParser(mScene, parsers));
|
||||||
|
parsers.top()->handle_start_event(event);
|
||||||
|
break;
|
||||||
|
case YAML_STREAM_END_EVENT:
|
||||||
|
printf("YAML_STREAM_END_EVENT\n");
|
||||||
|
parsers.top()->handle_end_event(event);
|
||||||
|
delete parsers.top();
|
||||||
|
parsers.pop();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case YAML_DOCUMENT_START_EVENT:
|
||||||
|
printf("YAML_DOCUMENT_START_EVENT\n");
|
||||||
|
break;
|
||||||
|
case YAML_DOCUMENT_END_EVENT:
|
||||||
|
printf("YAML_DOCUMENT_END_EVENT\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case YAML_ALIAS_EVENT:
|
||||||
|
printf("YAML_ALIAS_EVENT\n");
|
||||||
|
break;
|
||||||
|
case YAML_SCALAR_EVENT:
|
||||||
|
printf("YAML_SCALAR_EVENT\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case YAML_SEQUENCE_START_EVENT:
|
||||||
|
printf("YAML_SEQUENCE_START_EVENT\n");
|
||||||
|
break;
|
||||||
|
case YAML_SEQUENCE_END_EVENT:
|
||||||
|
printf("YAML_SEQUENCE_END_EVENT\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case YAML_MAPPING_START_EVENT:
|
||||||
|
printf("YAML_MAPPING_START_EVENT\n");
|
||||||
|
break;
|
||||||
|
case YAML_MAPPING_END_EVENT:
|
||||||
|
printf("YAML_MAPPING_END_EVENT\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
done = (event.type == YAML_STREAM_END_EVENT);
|
||||||
|
yaml_event_delete(&event);
|
||||||
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
|
yaml_parser_delete(&parser);
|
||||||
|
return success;
|
||||||
|
}
|
29
src/reader_yaml.hh
Normal file
29
src/reader_yaml.hh
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/* reader_yaml.hh
|
||||||
|
* vim: set tw=80:
|
||||||
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* An input file reader for YAML files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __READER_YAML_HH__
|
||||||
|
#define __READER_YAML_HH__
|
||||||
|
|
||||||
|
#include "reader.hh"
|
||||||
|
#include "scene.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct YAMLReader
|
||||||
|
: public Reader
|
||||||
|
{
|
||||||
|
YAMLReader(Scene& scene)
|
||||||
|
: Reader(scene)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
~YAMLReader() { }
|
||||||
|
|
||||||
|
ssize_t read_file(const std::string& filename);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __READER_YAML_HH__ */
|
Loading…
Add table
Add a link
Reference in a new issue