diff --git a/src/rpn.cpp b/src/rpn.cpp index ea1c86b..a6bf2d4 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<>"; } }; -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(string& value, cmd_type_t type = cmd_symbol) : ostring(value, type), _auto_eval(false) { } + symbol(const char* value, cmd_type_t type = cmd_symbol) : ostring(value, type), _auto_eval(false) { } bool _auto_eval; }; @@ -227,7 +192,6 @@ class keyword : public symbol public: keyword(program_fn_t fn, string& value, cmd_type_t type = cmd_keyword) : symbol(value, type) { _fn = fn; } program_fn_t _fn; - virtual void show(ostream& stream = cout) { stream << *_value; } }; class branch : public keyword @@ -246,6 +210,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) { } @@ -699,7 +713,7 @@ int _tmain(int argc, _TCHAR* argv[]) // apply default configuration apply_default(); - // run with interactive prompt + // run with interactive prompt if (argc == 1) { //