1 #include "binarywriter.h"
9 BinaryWriter::BinaryWriter(IO::Base &o):
14 dict[DictEntry("__kwd", "iss")] = 1;
15 dict[DictEntry("__str", "is")] = 2;
18 void BinaryWriter::write(const Statement &st)
24 void BinaryWriter::write_(const Statement &st)
26 Dictionary::iterator i = dict.find(DictEntry(st.keyword, st.get_signature()));
28 throw InvalidParameterValue("Unknown statement");
31 for(Statement::Arguments::const_iterator j = st.args.begin(); j!=st.args.end(); ++j)
32 switch(j->get_signature())
34 case IntType::signature: write_int (j->get<IntType::Store>()); break;
35 case StringType::signature: write_string(j->get<StringType::Store>()); break;
36 case BoolType::signature: write_int (j->get<BoolType::Store>()); break;
37 case FloatType::signature: write_float (j->get<FloatType::Store>()); break;
38 case SymbolType::signature: write_enum (j->get<SymbolType::Store>()); break;
41 write_int(st.sub.size());
42 for(list<Statement>::const_iterator j = st.sub.begin(); j!=st.sub.end(); ++j)
46 void BinaryWriter::collect_keywords(const Statement &st)
48 DictEntry de(st.keyword, st.get_signature());
53 kst.keyword = "__kwd";
54 kst.args.push_back(next_kwd_id);
55 kst.args.push_back(de.keyword);
56 kst.args.push_back(de.args);
59 dict[de] = next_kwd_id++;
62 for(ValueArray::const_iterator i = st.args.begin(); i!=st.args.end(); ++i)
64 char sig = i->get_signature();
66 if(sig==SymbolType::signature)
67 str = i->get<Symbol>().name;
68 else if(sig==StringType::signature)
70 str = i->get<string>();
77 if(strings.count(str))
81 sst.keyword = "__str";
82 sst.args.push_back(next_str_id);
83 sst.args.push_back(str);
86 strings[str] = next_str_id++;
89 for(list<Statement>::const_iterator i = st.sub.begin(); i!=st.sub.end(); ++i)
93 void BinaryWriter::write_int(long long n)
95 unsigned i = sizeof(long long)-1;
98 for(; (i>0 && (n>>(i*7-1))==0); --i) ;
100 for(; (i>0 && (n>>(i*7-1))==-1); --i) ;
103 out.put((n>>(i*7) & 0x7F) | (i?0x80:0));
106 void BinaryWriter::write_string(const string &s)
108 StringMap::const_iterator i = strings.find(s);
110 write_int(-static_cast<int>(i->second));
114 out.write(s.data(), s.size());
118 void BinaryWriter::write_float(float f)
123 char d[sizeof(float)];
127 #if BYTE_ORDER == LITTLE_ENDIAN
128 for(unsigned i = sizeof(float); i--;)
131 for(unsigned i = 0; i<sizeof(float); ++i)
136 void BinaryWriter::write_enum(const string &e)
138 StringMap::const_iterator i = strings.find(e);
140 throw InvalidParameterValue("Unknown enum");
141 write_int(i->second);
144 } // namespace DataFile