X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinarywriter.cpp;h=98dd2a9635317d56986ebff812867c263e25d5b9;hb=d84673be1c2fe8bd32ddaa7877529855cad6daa0;hp=95526bbae84666b6b02997ec68c724a1a357e6d8;hpb=505042fcda16151f5ace243c243d34af3efcf677;p=libs%2Fdatafile.git diff --git a/source/binarywriter.cpp b/source/binarywriter.cpp index 95526bb..98dd2a9 100644 --- a/source/binarywriter.cpp +++ b/source/binarywriter.cpp @@ -13,13 +13,13 @@ using namespace std; namespace Msp { namespace DataFile { -BinaryWriter::BinaryWriter(ostream &o): +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")]=1; + dict[DictEntry("__kwd", "iss")]=1; + dict[DictEntry("__str", "is")]=2; } void BinaryWriter::write(const Statement &st) @@ -72,26 +72,30 @@ void BinaryWriter::collect_keywords(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.insert(Dictionary::value_type(de, next_st_id++)).first; + 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::const_iterator i=st.sub.begin(); i!=st.sub.end(); ++i) collect_keywords(*i); @@ -99,16 +103,27 @@ void BinaryWriter::collect_keywords(const Statement &st) void BinaryWriter::write_int(long long n) { - unsigned i=1; - for(; n>>(i*7); ++i); - for(; i--;) - out.put(n>>(i*7) & 0x7F | (i?0x80:0)); + unsigned i=sizeof(long long)-1; + + if(n>=0) + for(; (i>0 && (n>>(i*7-1))==0); --i) ; + else + for(; (i>0 && (n>>(i*7-1))==-1); --i) ; + + for(++i; i--;) + out.put((n>>(i*7) & 0x7F) | (i?0x80:0)); } 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(i->second)); + else + { + write_int(s.size()); + out.write(s.data(), s.size()); + } } void BinaryWriter::write_float(float f) @@ -131,8 +146,8 @@ 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); }