]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/binaryparser.cpp
Add a flag to return also internal statements
[libs/datafile.git] / source / binaryparser.cpp
index fa99a7e47708ba3c1d4991c16d605d9ae77c7b28..796a592d3e84d05a70e2e8316abdcccbe543f3bf 100644 (file)
@@ -32,37 +32,45 @@ BinaryParser::BinaryParser(Input &i, const string &s):
        dict[-3] = DictEntry("__flt", "i");
 }
 
-Statement BinaryParser::parse()
+Statement BinaryParser::parse(bool raw)
 {
        while(1)
        {
-               Statement st = parse_statement();
+               Statement st = parse_statement(raw);
                if(st.keyword=="__kwd")
                {
-                       if(st.args.size()!=3)
+                       int id = st.args[0].get<int>();
+                       if(id<=0)
                                throw bad_definition("__kwd");
 
-                       const int id = st.args[0].get<unsigned>();
                        const string &kw = st.args[1].get<const string &>();
                        const string &args = st.args[2].get<const string &>();
+                       for(string::const_iterator i=args.begin(); i!=args.end(); ++i)
+                               for(unsigned j=0; valid_signatures[j]!=*i; ++j)
+                                       if(!valid_signatures[j])
+                                               throw bad_definition("__kwd");
+
                        dict[id] = DictEntry(kw, args);
                }
                else if(st.keyword=="__str")
                {
-                       if(st.args.size()!=2)
+                       int id = st.args[0].get<int>();
+                       if(id<=0)
                                throw bad_definition("__str");
 
-                       const unsigned id = st.args[0].get<unsigned>();
                        strings[id] = st.args[1].get<const string &>();
                }
                else if(st.keyword=="__flt")
                        float_precision = st.args[0].get<unsigned>();
                else
                        return st;
+
+               if(raw)
+                       return st;
        }
 }
 
-Statement BinaryParser::parse_statement()
+Statement BinaryParser::parse_statement(bool raw)
 {
        while(first && in.peek()=='\n')
                in.get();
@@ -102,7 +110,7 @@ Statement BinaryParser::parse_statement()
 
        unsigned nsub = parse_int();
        for(unsigned j = 0; j<nsub; ++j)
-               result.sub.push_back(parse());
+               result.sub.push_back(parse(raw));
 
        result.valid = true;