BinaryWriter::BinaryWriter(IO::Base &o):
WriterMode(o),
- next_st_id(3),
- next_enum_id(1)
+ next_kwd_id(3),
+ next_str_id(1)
{
- dict[DictEntry("__st", "iss")]=1;
- dict[DictEntry("__enum", "is")]=2;
+ dict[DictEntry("__kwd", "iss")]=1;
+ dict[DictEntry("__str", "is")]=2;
}
void BinaryWriter::write(const Statement &st)
if(!dict.count(de))
{
Statement kst;
- kst.keyword="__st";
- kst.args.push_back(next_st_id);
+ kst.keyword="__kwd";
+ kst.args.push_back(next_kwd_id);
kst.args.push_back(de.keyword);
kst.args.push_back(de.args);
write_(kst);
- dict[de]=next_st_id++;
+ dict[de]=next_kwd_id++;
}
for(ValueArray::const_iterator i=st.args.begin(); i!=st.args.end(); ++i)
- if(i->get_type()==ENUM && !enums.count(i->get_raw()))
+ {
+ const Type t=i->get_type();
+ const string &r=i->get_raw();
+ if((t==ENUM || (t==STRING && r.size()<32)) && !strings.count(r))
{
- Statement est;
- est.keyword="__enum";
- est.args.push_back(next_enum_id);
- est.args.push_back(i->get_raw());
- write_(est);
+ Statement sst;
+ sst.keyword="__str";
+ sst.args.push_back(next_str_id);
+ sst.args.push_back(r);
+ write_(sst);
- enums[i->get_raw()]=next_enum_id++;
+ strings[r]=next_str_id++;
}
+ }
for(list<Statement>::const_iterator i=st.sub.begin(); i!=st.sub.end(); ++i)
collect_keywords(*i);
void BinaryWriter::write_string(const string &s)
{
- write_int(s.size());
- out.write(s.data(), s.size());
+ StringMap::const_iterator i=strings.find(s);
+ if(i!=strings.end())
+ write_int(-static_cast<int>(i->second));
+ else
+ {
+ write_int(s.size());
+ out.write(s.data(), s.size());
+ }
}
void BinaryWriter::write_float(float f)
void BinaryWriter::write_enum(const string &e)
{
- EnumMap::const_iterator i=enums.find(e);
- if(i==enums.end())
+ StringMap::const_iterator i=strings.find(e);
+ if(i==strings.end())
throw InvalidParameterValue("Unknown enum");
write_int(i->second);
}