1 #include <msp/core/maputils.h>
2 #include "binarywriter.h"
10 BinaryWriter::BinaryWriter(IO::Base &o):
15 dict[DictEntry("__kwd", "iss")] = 1;
16 dict[DictEntry("__str", "is")] = 2;
19 void BinaryWriter::write(const Statement &st)
25 void BinaryWriter::write_(const Statement &st)
27 unsigned id = get_item(dict, DictEntry(st.keyword, st.get_signature()));
30 for(Statement::Arguments::const_iterator j = st.args.begin(); j!=st.args.end(); ++j)
31 switch(j->get_signature())
33 case IntType::signature: write_int (j->get<IntType::Store>()); break;
34 case StringType::signature: write_string(j->get<StringType::Store>()); break;
35 case BoolType::signature: write_int (j->get<BoolType::Store>()); break;
36 case FloatType::signature: write_float (j->get<FloatType::Store>()); break;
37 case SymbolType::signature: write_symbol(j->get<SymbolType::Store>()); break;
40 write_int(st.sub.size());
41 for(list<Statement>::const_iterator j = st.sub.begin(); j!=st.sub.end(); ++j)
45 void BinaryWriter::collect_keywords(const Statement &st)
47 DictEntry de(st.keyword, st.get_signature());
52 kst.keyword = "__kwd";
53 kst.args.push_back(next_kwd_id);
54 kst.args.push_back(de.keyword);
55 kst.args.push_back(de.args);
58 dict[de] = next_kwd_id++;
61 for(ValueArray::const_iterator i = st.args.begin(); i!=st.args.end(); ++i)
63 char sig = i->get_signature();
65 if(sig==SymbolType::signature)
66 str = i->get<Symbol>().name;
67 else if(sig==StringType::signature)
69 str = i->get<string>();
76 if(strings.count(str))
80 sst.keyword = "__str";
81 sst.args.push_back(next_str_id);
82 sst.args.push_back(str);
85 strings[str] = next_str_id++;
88 for(list<Statement>::const_iterator i = st.sub.begin(); i!=st.sub.end(); ++i)
92 void BinaryWriter::write_int(IntType::Store n)
94 unsigned i = sizeof(IntType::Store)-1;
97 for(; (i>0 && (n>>(i*7-1))==0); --i) ;
99 for(; (i>0 && (n>>(i*7-1))==-1); --i) ;
102 out.put((n>>(i*7) & 0x7F) | (i?0x80:0));
105 void BinaryWriter::write_string(const StringType::Store &s)
107 StringMap::const_iterator i = strings.find(s);
109 write_int(-static_cast<int>(i->second));
113 out.write(s.data(), s.size());
117 void BinaryWriter::write_float(FloatType::Store f)
122 char d[sizeof(float)];
126 #if BYTE_ORDER == LITTLE_ENDIAN
127 for(unsigned i = sizeof(float); i--;)
130 for(unsigned i = 0; i<sizeof(float); ++i)
135 void BinaryWriter::write_symbol(const SymbolType::Store &s)
137 write_int(get_item(strings, s.name));
140 } // namespace DataFile