X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinarywriter.cpp;h=98dd2a9635317d56986ebff812867c263e25d5b9;hb=d84673be1c2fe8bd32ddaa7877529855cad6daa0;hp=dd63d3dcefa03e32efd83af1f30b096e9ba54718;hpb=08576b49c8bfb6cd841724dc5124d40af9475eb8;p=libs%2Fdatafile.git diff --git a/source/binarywriter.cpp b/source/binarywriter.cpp index dd63d3d..98dd2a9 100644 --- a/source/binarywriter.cpp +++ b/source/binarywriter.cpp @@ -15,11 +15,11 @@ namespace DataFile { 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) @@ -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[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::const_iterator i=st.sub.begin(); i!=st.sub.end(); ++i) collect_keywords(*i); @@ -112,8 +116,14 @@ void BinaryWriter::write_int(long long n) 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) @@ -136,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); }