]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/parser.cpp
Implement a parser mode for JSON files
[libs/datafile.git] / source / parser.cpp
index 9ad70d8742884bfdfa40d5bebbc467b9e289afe7..7e4d3dd7f93942b9d4c9c3b69f2715d93b25b492 100644 (file)
@@ -1,6 +1,7 @@
 #include <msp/strings/format.h>
 #include "binaryparser.h"
-#include "dataerror.h"
+#include "except.h"
+#include "jsonparser.h"
 #include "parser.h"
 #include "statement.h"
 #include "textparser.h"
@@ -14,9 +15,14 @@ Parser::Parser(IO::Base &i, const string &s):
        in(i),
        main_src(s),
        src(s),
-       good(true),
-       mode(new TextParser(in, src))
-{ }
+       good(true)
+{
+       char c = in.peek();
+       if(c=='{' || c=='[')
+               mode = new JsonParser(in, src);
+       else
+               mode = new TextParser(in, src);
+}
 
 Parser::~Parser()
 {
@@ -88,7 +94,7 @@ void Parser::process_control_statement(const Statement &st)
 
 const StatementKey *Parser::peek(unsigned level)
 {
-       while(1)
+       while(good)
        {
                const StatementKey *key = mode->peek(level);
                if(key && !key->keyword.compare(0, 2, "__"))
@@ -96,6 +102,8 @@ const StatementKey *Parser::peek(unsigned level)
                else
                        return key;
        }
+
+       return 0;
 }
 
 bool Parser::parse_and_load(unsigned level, Loader &ldr, const LoaderAction &act)