]> git.tdb.fi Git - libs/datafile.git/blob - source/statement.cpp
Use automatic base detection when parsing integers
[libs/datafile.git] / source / statement.cpp
1 #include <msp/strings/format.h>
2 #include "statement.h"
3 #include "token.h"
4 #include "type.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace DataFile {
10
11 Statement::Statement():
12         valid(false),
13         control(false),
14         line(0)
15 { }
16
17 Statement::Statement(const string &kw):
18         keyword(kw),
19         valid(true),
20         control(!kw.compare(0, 2, "__")),
21         line(0)
22 { }
23
24 string Statement::get_location() const
25 {
26         string result = source;
27         if(line)
28                 result += format(":%d", line);
29         return result;
30 }
31
32 string Statement::get_signature() const
33 {
34         string result;
35         for(Arguments::const_iterator i = args.begin(); i!=args.end(); ++i)
36                 result += i->get_signature();
37         return result;
38 }
39
40 Statement &Statement::append_from_token(const Token &token)
41 {
42         if(token.type==Token::INTEGER)
43                 return append(lexical_cast<IntType::Store>(token.str, Fmt().autobase()));
44         else if(token.type==Token::FLOAT)
45                 return append(lexical_cast<FloatType::Store>(token.str));
46         else if(token.type==Token::STRING)
47                 return append(token.str);
48         else if(token.type==Token::IDENTIFIER)
49         {
50                 if(token.str=="true")
51                         return append(true);
52                 else if(token.str=="false")
53                         return append(false);
54                 else
55                         return append(Symbol(token.str));
56         }
57         else
58                 throw invalid_argument("Statement::append_from_token");
59 }
60
61
62 StatementInfo::StatementInfo():
63         args_size(0)
64 { }
65
66 StatementInfo::StatementInfo(const string &k, const string &s):
67         key(k, s),
68         args_size(0)
69 {
70         for(string::const_iterator i=key.signature.begin(); i!=key.signature.end(); ++i)
71         {
72                 arg_offsets.push_back(args_size);
73                 switch(*i)
74                 {
75                 case IntType::signature:
76                         args_size += sizeof(IntType::Store);
77                         break;
78                 case FloatType::signature:
79                         args_size += sizeof(FloatType::Store);
80                         break;
81                 case BoolType::signature:
82                         args_size += sizeof(BoolType::Store);
83                         break;
84                 case StringType::signature:
85                         args_size += sizeof(StringType::Store);
86                         break;
87                 case SymbolType::signature:
88                         args_size += sizeof(SymbolType::Store);
89                         break;
90                 }
91         }
92 }
93
94 } // namespace DataFile
95 } // namespace Msp