]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/binaryparser.cpp
Restructure control statement processing
[libs/datafile.git] / source / binaryparser.cpp
index 7d1591de77105264a3d59fc2506c4bd0c03a9739..25edd63a15060d96bb5bcc95775cc3241dc9ce36 100644 (file)
@@ -32,45 +32,7 @@ BinaryParser::BinaryParser(Input &i, const string &s):
        dict[-3] = StatementKey("__flt", "i");
 }
 
-Statement BinaryParser::parse(bool raw)
-{
-       while(1)
-       {
-               Statement st = parse_statement(raw);
-               if(st.keyword=="__kwd")
-               {
-                       int id = st.args[0].get<int>();
-                       if(id<=0)
-                               throw bad_definition("__kwd");
-
-                       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] = StatementKey(kw, args);
-               }
-               else if(st.keyword=="__str")
-               {
-                       int id = st.args[0].get<int>();
-                       if(id<=0)
-                               throw bad_definition("__str");
-
-                       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(bool raw)
+Statement BinaryParser::parse()
 {
        while(first && in.peek()=='\n')
                in.get();
@@ -110,13 +72,42 @@ Statement BinaryParser::parse_statement(bool raw)
 
        unsigned nsub = parse_int();
        for(unsigned j = 0; j<nsub; ++j)
-               result.sub.push_back(parse(raw));
+               result.sub.push_back(parse());
 
        result.valid = true;
 
        return result;
 }
 
+void BinaryParser::process_control_statement(const Statement &st)
+{
+       if(st.keyword=="__kwd")
+       {
+               int id = st.args[0].get<int>();
+               if(id<=0)
+                       throw bad_definition("__kwd");
+
+               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] = StatementKey(kw, args);
+       }
+       else if(st.keyword=="__str")
+       {
+               int id = st.args[0].get<int>();
+               if(id<=0)
+                       throw bad_definition("__str");
+
+               strings[id] = st.args[1].get<const string &>();
+       }
+       else if(st.keyword=="__flt")
+               float_precision = st.args[0].get<unsigned>();
+}
+
 IntType::Store BinaryParser::parse_int()
 {
        IntType::Store result = 0;