#include <limits>
-#include <sys/param.h>
#include <msp/core/maputils.h>
#include <msp/strings/format.h>
#include "argumentstore.h"
#include "binaryparser.h"
#include "binfloat.h"
+#include "except.h"
#include "input.h"
#include "loaderaction.h"
namespace Msp {
namespace DataFile {
-class bad_definition: public runtime_error
-{
-public:
- bad_definition(const std::string &w):
- runtime_error(w)
- { }
-
- virtual ~bad_definition() throw() { }
-};
-
-class nesting_error: public logic_error
-{
-public:
- nesting_error(const std::string &w):
- logic_error(w)
- { }
-
- virtual ~nesting_error() throw() { }
-};
-
-
BinaryParser::BinaryParser(Input &i, const string &s):
ParserMode(i, s),
float_precision(32),
{
const StatementKey *key;
if(cur_info)
+ {
key = &cur_info->key;
+ cur_info = 0;
+ }
else
{
int id = parse_int();
result.args.push_back(parse_bool());
break;
case SymbolType::signature:
- result.args.push_back(parse_symbol());
+ result.args.push_back(Value(parse_symbol()));
break;
}
}
- if(!sub_remaining.empty())
- --sub_remaining.back();
+ unsigned upper_nsub = (sub_remaining.empty() ? 0 : sub_remaining.back());
unsigned nsub = parse_int();
for(unsigned j = 0; j<nsub; ++j)
result.sub.push_back(parse());
+ if(upper_nsub>0)
+ sub_remaining.back() = upper_nsub-1;
+
result.valid = true;
- cur_info = 0;
return result;
}
const string &kw = st.args[1].get<const string &>();
const string &args = st.args[2].get<const string &>();
- for(string::const_iterator i=args.begin(); i!=args.end(); ++i)
- for(unsigned j=0; valid_signatures[j]!=*i; ++j)
+ for(char c: args)
+ for(unsigned j=0; valid_signatures[j]!=c; ++j)
if(!valid_signatures[j])
throw bad_definition("__kwd");
FloatType::Store BinaryParser::parse_float()
{
- UInt64 encoded = 0;
+ uint64_t encoded = 0;
for(unsigned i=0; i<float_precision; i+=8)
{
int c = in.get();