X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fbinaryparser.cpp;h=fa99a7e47708ba3c1d4991c16d605d9ae77c7b28;hp=53131289a851b04270e377e8abb5b61b49832b5c;hb=19179a622c1de88de5ed7047643eec79f285bf2a;hpb=5fd2c13c3036ea6a767802fdc9a2ab809ef8ec17 diff --git a/source/binaryparser.cpp b/source/binaryparser.cpp index 5313128..fa99a7e 100644 --- a/source/binaryparser.cpp +++ b/source/binaryparser.cpp @@ -1,7 +1,9 @@ +#include #include #include #include #include "binaryparser.h" +#include "binfloat.h" #include "input.h" using namespace std; @@ -22,10 +24,12 @@ public: BinaryParser::BinaryParser(Input &i, const string &s): ParserMode(i, s), - first(true) + first(true), + float_precision(32) { - dict[1] = DictEntry("__kwd", "iss"); - dict[2] = DictEntry("__str", "is"); + dict[-1] = DictEntry("__kwd", "iss"); + dict[-2] = DictEntry("__str", "is"); + dict[-3] = DictEntry("__flt", "i"); } Statement BinaryParser::parse() @@ -38,7 +42,7 @@ Statement BinaryParser::parse() if(st.args.size()!=3) throw bad_definition("__kwd"); - const unsigned id = st.args[0].get(); + const int id = st.args[0].get(); const string &kw = st.args[1].get(); const string &args = st.args[2].get(); dict[id] = DictEntry(kw, args); @@ -51,6 +55,8 @@ Statement BinaryParser::parse() const unsigned id = st.args[0].get(); strings[id] = st.args[1].get(); } + else if(st.keyword=="__flt") + float_precision = st.args[0].get(); else return st; } @@ -62,7 +68,7 @@ Statement BinaryParser::parse_statement() in.get(); first = false; - unsigned id = parse_int(); + int id = parse_int(); if(!in) return Statement(); @@ -127,21 +133,47 @@ IntType::Store BinaryParser::parse_int() FloatType::Store BinaryParser::parse_float() { - union + UInt64 encoded = 0; + for(unsigned i=0; i::is_iec559) + return bf.compose_iec559(); + else { - float f; - char d[sizeof(float)]; - }; - -#if BYTE_ORDER == LITTLE_ENDIAN - for(unsigned i = sizeof(float); i--;) - d[i] = in.get(); -#else - for(unsigned i = 0; i::has_infinity) + f = numeric_limits::infinity(); + else + f = numeric_limits::max(); + } + else + { + for(unsigned i=0; i<64; ++i) + { + f /= 2; + if(bf.mantissa&1) + f += 1; + bf.mantissa >>= 1; + } + for(int i=0; ibf.exponent; --i) + f /= 2; + } + if(bf.sign) + f = -f; + return f; + } } BoolType::Store BinaryParser::parse_bool()