]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/statement.cpp
Cosmetic changes
[libs/datafile.git] / source / statement.cpp
index 29961a963fcfa97ce6d8461c0a384a64ce465bcd..57364bbd4d1563e7c0f1f5753216d1cd7e1cacf5 100644 (file)
@@ -1,20 +1,17 @@
 #include <msp/strings/format.h>
 #include "statement.h"
+#include "token.h"
+#include "type.h"
 
 using namespace std;
 
 namespace Msp {
 namespace DataFile {
 
-Statement::Statement():
-       valid(false),
-       line(0)
-{ }
-
 Statement::Statement(const string &kw):
        keyword(kw),
        valid(true),
-       line(0)
+       control(!kw.compare(0, 2, "__"))
 { }
 
 string Statement::get_location() const
@@ -28,10 +25,60 @@ string Statement::get_location() const
 string Statement::get_signature() const
 {
        string result;
-       for(Arguments::const_iterator i = args.begin(); i!=args.end(); ++i)
-               result += i->get_signature();
+       for(const Value &a: args)
+               result += a.get_signature();
        return result;
 }
 
+Statement &Statement::append_from_token(const Token &token)
+{
+       if(token.type==Token::INTEGER)
+               return append(lexical_cast<IntType::Store>(token.str, Fmt().autobase()));
+       else if(token.type==Token::FLOAT)
+               return append(lexical_cast<FloatType::Store>(token.str));
+       else if(token.type==Token::STRING)
+               return append(token.str);
+       else if(token.type==Token::IDENTIFIER)
+       {
+               if(token.str=="true")
+                       return append(true);
+               else if(token.str=="false")
+                       return append(false);
+               else
+                       return append(Value(Symbol(token.str)));
+       }
+       else
+               throw invalid_argument("Statement::append_from_token");
+}
+
+
+StatementInfo::StatementInfo(const string &k, const string &s):
+       key(k, s),
+       args_size(0)
+{
+       for(char c: key.signature)
+       {
+               arg_offsets.push_back(args_size);
+               switch(c)
+               {
+               case IntType::signature:
+                       args_size += sizeof(IntType::Store);
+                       break;
+               case FloatType::signature:
+                       args_size += sizeof(FloatType::Store);
+                       break;
+               case BoolType::signature:
+                       args_size += sizeof(BoolType::Store);
+                       break;
+               case StringType::signature:
+                       args_size += sizeof(StringType::Store);
+                       break;
+               case SymbolType::signature:
+                       args_size += sizeof(SymbolType::Store);
+                       break;
+               }
+       }
+}
+
 } // namespace DataFile
 } // namespace Msp