-/* $Id: statement.h 19 2007-08-21 14:11:23Z tdb $
-
-This file is part of libmspdatafile
-Copyright © 2006 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#include <msp/strings/formatter.h>
+#include <msp/strings/format.h>
#include "statement.h"
+#include "token.h"
+#include "type.h"
+
+using namespace std;
namespace Msp {
namespace DataFile {
-std::string Statement::get_location() const
+Statement::Statement():
+ valid(false),
+ control(false),
+ line(0)
+{ }
+
+Statement::Statement(const string &kw):
+ keyword(kw),
+ valid(true),
+ control(!kw.compare(0, 2, "__")),
+ line(0)
+{ }
+
+string Statement::get_location() const
{
- std::string result = source;
+ string result = source;
if(line)
result += format(":%d", line);
return result;
}
+string Statement::get_signature() const
+{
+ string result;
+ 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():
+ args_size(0)
+{ }
+
+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