From c8c38ac1cdb09046355f457dd0c22f10bb720d15 Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 26 Feb 2015 18:26:38 +0100 Subject: [PATCH] Changed ostring --- src/parse.h | 13 +++-- src/rpn.cpp | 163 ++++++++++++++++++++++++++-------------------------- 2 files changed, 91 insertions(+), 85 deletions(-) diff --git a/src/parse.h b/src/parse.h index 1b7f02c..dd035ce 100644 --- a/src/parse.h +++ b/src/parse.h @@ -205,26 +205,29 @@ static bool get_program(const string& entry, object*& obj) return ret; } +// care: not threadsafe static bool get_float(const string& entry, object*& obj) { + static number new_number(0); stringstream token; - floating_t val; bool ret = false; token<>val; + token>>new_number._value; if ( (!token.fail()) && (!token.bad()) ) { - obj = new number(val); + obj = &new_number; ret = true; } return ret; } +// care: not threadsafe static bool get_binary(const string& entry, object*& obj) { + static binary new_binary(0); integer_t val; bool ret = false; if ((entry.size() >= 2) && (entry[0] == '#')) @@ -252,10 +255,10 @@ static bool get_binary(const string& entry, object*& obj) break; } - token>>val; + token>>new_binary._value; if(syntax && !token.fail()) { - obj = new binary(val); + obj = &new_binary; ret = true; } } diff --git a/src/rpn.cpp b/src/rpn.cpp index ea1c86b..75fe29b 100644 --- a/src/rpn.cpp +++ b/src/rpn.cpp @@ -111,14 +111,14 @@ class object public: cmd_type_t _type;// object type object(cmd_type_t type = cmd_undef):_type(type) { } - virtual void show(ostream& stream = cout) { } + + void show(ostream& stream = cout); }; class number : public object { public: number(floating_t value) : object(cmd_number) { _value = value; } - virtual void show(ostream& stream = cout) { stream << _value; } floating_t _value; // representation mode @@ -142,32 +142,7 @@ int number::s_current_precision = number::s_default_precision; class binary : public object { public: - binary(integer_t value) : object(cmd_binary) { _value = value; } - - virtual void show(ostream& stream = cout) - { - cout << "# "; - switch(s_mode) - { - case dec: cout<=0; i--) - { - if (_value & (1 << i)) - mybin+='1'; - else - mybin+='0'; - } - cout<>"; } + oprogram(cmd_type_t type = cmd_program) : ostring(type) { } }; -class symbol : public object +class symbol : public ostring { public: - symbol(string& value, cmd_type_t type = cmd_symbol) : object(type), _auto_eval(false) - { - _value = new string(value); - } - symbol(const char* value, cmd_type_t type = cmd_symbol) : object(type), _auto_eval(false) - { - _value = new string(value); - } - virtual void show(ostream& stream = cout) { stream << "'" << *_value << "'"; } - string* _value; + symbol(cmd_type_t type = cmd_symbol) : ostring(type), _auto_eval(false) { } bool _auto_eval; }; class keyword : public symbol { public: - keyword(program_fn_t fn, string& value, cmd_type_t type = cmd_keyword) : symbol(value, type) { _fn = fn; } + keyword(program_fn_t fn, cmd_type_t type = cmd_keyword) : symbol(type) { _fn = fn; } program_fn_t _fn; - virtual void show(ostream& stream = cout) { stream << *_value; } }; class branch : public keyword { public: - branch(branch_fn_t fn, string& value) : keyword(NULL, value, cmd_branch), arg1(-1), arg2(-1), arg3(-1), arg_bool(false) + branch(branch_fn_t fn) : keyword(NULL, cmd_branch), arg1(-1), arg2(-1), arg3(-1), arg_bool(false) { _type = cmd_branch; _fn = fn; @@ -246,6 +214,56 @@ public: bool arg_bool; }; +void object::show(ostream& stream) +{ + switch(_type) + { + case cmd_number: + stream << ((number*)this)->_value; + break; + case cmd_binary: + { + cout << "# "; + switch(((binary*)this)->s_mode) + { + case binary::dec: cout<_value<<" d"; break; + case binary::hex: cout<_value<<" h"; break; + case binary::oct: cout<_value<<" o"; break; + case binary::bin: + { + string mybin; + for (int i = (int)(log((floating_t)((binary*)this)->_value) / log(2.)); i>=0; i--) + { + if (((binary*)this)->_value & (1 << i)) + mybin+='1'; + else + mybin+='0'; + } + cout<_value << "\""; + break; + case cmd_program: + stream << "<< " << *((oprogram*)this)->_value << " >>"; + break; + case cmd_symbol: + stream << "'" << *((symbol*)this)->_value << "'"; + break; + case cmd_keyword: + case cmd_branch: + stream << *((keyword*)this)->_value; + break; + default: + stream << "< unknown object representation >"; + break; + } +} + struct if_layout_t { if_layout_t():index_then(-1),index_else(-1),index_end(-1) { } @@ -366,7 +384,7 @@ public: if (type == cmd_keyword) { keyword* k = (keyword*)seq_obj(i); - if (k->_value->compare("end") == 0) + if (strncmp(k->_value, "end", 3) == 0) { int next = i + 1; if (next >= (int)size()) @@ -396,14 +414,14 @@ public: else if (type == cmd_branch) { branch* k = (branch*)seq_obj(i); - if (k->_value->compare("if") == 0) + if (strncmp(k->_value, "if", 2) == 0) { if_layout_t layout; layout.index_if = i; vlayout.push_back(layout); layout_index++; } - else if (k->_value->compare("then") == 0) + else if (strncmp(k->_value, "then", 4) == 0) { int next = i + 1; if (next >= (int)size()) @@ -432,7 +450,7 @@ public: k->arg1 = next; k->arg3 = vlayout[layout_index].index_if; } - else if (k->_value->compare("else") == 0) + else if (strncmp(k->_value, "else", 4) == 0) { int next = i + 1; if (next >= (int)size()) @@ -468,16 +486,16 @@ public: k->arg3 = vlayout[layout_index].index_if; ((branch*)seq_obj(vlayout[layout_index].index_then))->arg2 = next;// fill branch2 (if was false) of 'then' } - else if (k->_value->compare("start") == 0) + else if (strncmp(k->_value, "start", 5) == 0) { vstartindex.push_back(i); } - else if (k->_value->compare("for") == 0) + else if (strncmp(k->_value, "for", 3) == 0) { vstartindex.push_back(i); k->arg1 = i + 1;// arg1 points on symbol variable } - else if(k->_value->compare("next") == 0) + else if(strncmp(k->_value, "next", 4) == 0) { if (vstartindex.size() == 0) { @@ -488,7 +506,7 @@ public: k->arg1 = vstartindex[vstartindex.size() - 1];// fill 'next' branch1 = 'start' index vstartindex.pop_back(); } - else if (k->_value->compare("step") == 0) + else if (strncmp(k->_value, "step", 4) == 0) { if (vstartindex.size() == 0) { @@ -499,7 +517,7 @@ public: k->arg1 = vstartindex[vstartindex.size() - 1];// fill 'step' branch1 = 'start' index vstartindex.pop_back(); } - else if (k->_value->compare("->") == 0) + else if (strncmp(k->_value, "->", 2) == 0) { k->arg1 = i;// arg1 is '->' command index in program } @@ -630,21 +648,6 @@ private: _stack->push_back(&num, sizeof(binary), cmd_binary); } - string getn() - { - /* warning, caller must check object type before */ - string* a = ((symbol*)_stack->back())->_value; - _stack->pop_back(); - return *a; - } - - void putn(string& a) - { - /* warning, caller must check object type before */ - symbol sym(a); - _stack->push_back(&sym, sizeof(symbol), cmd_symbol); - } - int stack_size() { return _stack->size(); @@ -699,7 +702,7 @@ int _tmain(int argc, _TCHAR* argv[]) // apply default configuration apply_default(); - // run with interactive prompt + // run with interactive prompt if (argc == 1) { //