X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinarywriter.cpp;h=09e36c0085be33c8ad7c0ff0eb5c8a611ca33a95;hb=a582163d380833b1370ba067a1fd0ad5c2984723;hp=98dd2a9635317d56986ebff812867c263e25d5b9;hpb=d84673be1c2fe8bd32ddaa7877529855cad6daa0;p=libs%2Fdatafile.git diff --git a/source/binarywriter.cpp b/source/binarywriter.cpp index 98dd2a9..09e36c0 100644 --- a/source/binarywriter.cpp +++ b/source/binarywriter.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of libmspdatafile -Copyright © 2006 Mikko Rasa, Mikkosoft Productions +Copyright © 2007-2008, 2010 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ @@ -18,8 +18,8 @@ BinaryWriter::BinaryWriter(IO::Base &o): next_kwd_id(3), next_str_id(1) { - dict[DictEntry("__kwd", "iss")]=1; - dict[DictEntry("__str", "is")]=2; + dict[DictEntry("__kwd", "iss")] = 1; + dict[DictEntry("__str", "is")] = 2; } void BinaryWriter::write(const Statement &st) @@ -30,80 +30,76 @@ void BinaryWriter::write(const Statement &st) void BinaryWriter::write_(const Statement &st) { - Dictionary::iterator i=dict.find(create_entry(st)); + Dictionary::iterator i = dict.find(DictEntry(st.keyword, st.get_signature())); if(i==dict.end()) throw InvalidParameterValue("Unknown statement"); write_int(i->second); - for(ValueArray::const_iterator j=st.args.begin(); j!=st.args.end(); ++j) - switch(j->get_type()) + for(Statement::Arguments::const_iterator j = st.args.begin(); j!=st.args.end(); ++j) + switch(j->get_signature()) { - case INTEGER: write_int (j->get()); break; - case STRING: write_string(j->get()); break; - case BOOLEAN: write_int (j->get()); break; - case FLOAT: write_float (j->get()); break; - case ENUM: write_enum (j->get_raw()); break; + case IntType::signature: write_int (j->get()); break; + case StringType::signature: write_string(j->get()); break; + case BoolType::signature: write_int (j->get()); break; + case FloatType::signature: write_float (j->get()); break; + case SymbolType::signature: write_enum (j->get()); break; } write_int(st.sub.size()); - for(list::const_iterator j=st.sub.begin(); j!=st.sub.end(); ++j) + for(list::const_iterator j = st.sub.begin(); j!=st.sub.end(); ++j) write(*j); } -DictEntry BinaryWriter::create_entry(const Statement &st) -{ - static const char types[]="ifsbe"; - - string args; - for(ValueArray::const_iterator i=st.args.begin(); i!=st.args.end(); ++i) - { - if(i->get_type()>=5) - throw InvalidParameterValue("Invalid argument type"); - args+=types[i->get_type()]; - } - - return DictEntry(st.keyword, args); -} - void BinaryWriter::collect_keywords(const Statement &st) { - DictEntry de=create_entry(st); + DictEntry de(st.keyword, st.get_signature()); if(!dict.count(de)) { Statement kst; - kst.keyword="__kwd"; + 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_kwd_id++; + dict[de] = next_kwd_id++; } - for(ValueArray::const_iterator i=st.args.begin(); i!=st.args.end(); ++i) + for(ValueArray::const_iterator i = st.args.begin(); i!=st.args.end(); ++i) { - const Type t=i->get_type(); - const string &r=i->get_raw(); - if((t==ENUM || (t==STRING && r.size()<32)) && !strings.count(r)) + char sig = i->get_signature(); + string str; + if(sig==SymbolType::signature) + str = i->get().name; + else if(sig==StringType::signature) { - Statement sst; - sst.keyword="__str"; - sst.args.push_back(next_str_id); - sst.args.push_back(r); - write_(sst); - - strings[r]=next_str_id++; + str = i->get(); + if(str.size()>32) + continue; } + else + continue; + + if(strings.count(str)) + continue; + + Statement sst; + sst.keyword = "__str"; + sst.args.push_back(next_str_id); + sst.args.push_back(str); + write_(sst); + + strings[str] = next_str_id++; } - for(list::const_iterator i=st.sub.begin(); i!=st.sub.end(); ++i) + for(list::const_iterator i = st.sub.begin(); i!=st.sub.end(); ++i) collect_keywords(*i); } void BinaryWriter::write_int(long long n) { - unsigned i=sizeof(long long)-1; + unsigned i = sizeof(long long)-1; if(n>=0) for(; (i>0 && (n>>(i*7-1))==0); --i) ; @@ -116,7 +112,7 @@ void BinaryWriter::write_int(long long n) void BinaryWriter::write_string(const string &s) { - StringMap::const_iterator i=strings.find(s); + StringMap::const_iterator i = strings.find(s); if(i!=strings.end()) write_int(-static_cast(i->second)); else @@ -134,19 +130,19 @@ void BinaryWriter::write_float(float f) char d[sizeof(float)]; }; - v=f; + v = f; #if BYTE_ORDER == LITTLE_ENDIAN - for(unsigned i=sizeof(float); i--;) + for(unsigned i = sizeof(float); i--;) out.put(d[i]); #else - for(unsigned i=0; isecond);