X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fstatement.cpp;h=125c1d5ab5403af6fd2b1d96cd2108000559bc4f;hp=2df8b4cdde28e9019164977aa32b6771fbcd249f;hb=d93f320a4853afa6d1c25d9b546600807cfee37d;hpb=27630d44298cb67e075c166f4421288cc8ca117e diff --git a/source/statement.cpp b/source/statement.cpp index 2df8b4c..125c1d5 100644 --- a/source/statement.cpp +++ b/source/statement.cpp @@ -1,23 +1,95 @@ -/* $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 +#include #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); + result += format(":%d", line); + return result; +} + +string Statement::get_signature() const +{ + string result; + for(Arguments::const_iterator i = args.begin(); i!=args.end(); ++i) + result += i->get_signature(); return result; } +Statement &Statement::append_from_token(const Token &token) +{ + if(token.type==Token::INTEGER) + return append(lexical_cast(token.str, Fmt().autobase())); + else if(token.type==Token::FLOAT) + return append(lexical_cast(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(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(string::const_iterator i=key.signature.begin(); i!=key.signature.end(); ++i) + { + arg_offsets.push_back(args_size); + switch(*i) + { + 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