X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbinarywriter.cpp;h=2ff96a457524c7a1e28a13c6e098de535bf0e006;hb=5c98c1f499413c41fd46ddf71a46b481338d7d6b;hp=0e118c9eb0ceb4542eda97752633e8f95848f9ef;hpb=cbd0ddd6ee033e46646bfb85d19232c816ea1eda;p=libs%2Fdatafile.git diff --git a/source/binarywriter.cpp b/source/binarywriter.cpp index 0e118c9..2ff96a4 100644 --- a/source/binarywriter.cpp +++ b/source/binarywriter.cpp @@ -1,10 +1,4 @@ -/* $Id$ - -This file is part of libmspdatafile -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - +#include #include "binarywriter.h" #include "statement.h" @@ -30,19 +24,17 @@ void BinaryWriter::write(const Statement &st) void BinaryWriter::write_(const Statement &st) { - Dictionary::iterator i = dict.find(create_entry(st)); - if(i==dict.end()) - throw InvalidParameterValue("Unknown statement"); + unsigned id = get_item(dict, DictEntry(st.keyword, st.get_signature())); - write_int(i->second); - for(ValueArray::const_iterator j = st.args.begin(); j!=st.args.end(); ++j) - switch(j->get_type()) + write_int(id); + 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()); @@ -50,24 +42,9 @@ void BinaryWriter::write_(const Statement &st) 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)) { @@ -83,18 +60,29 @@ void BinaryWriter::collect_keywords(const Statement &st) 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) @@ -146,10 +134,7 @@ void BinaryWriter::write_float(float f) void BinaryWriter::write_enum(const string &e) { - StringMap::const_iterator i = strings.find(e); - if(i==strings.end()) - throw InvalidParameterValue("Unknown enum"); - write_int(i->second); + write_int(get_item(strings, e)); } } // namespace DataFile