X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Foption.cc;h=01b7db0ce383f6f4aa463dc5ddff2a22d15a0b8c;hb=90f4aedaef8a2310573eef905f95c671f84e5cde;hp=1c9ad202912d4d9c2aa14b241721cf6826ab38ee;hpb=0e1bba0730e55b3d40c1c644d94befc99c87270d;p=fw%2Fsdcc diff --git a/sim/ucsim/option.cc b/sim/ucsim/option.cc index 1c9ad202..01b7db0c 100644 --- a/sim/ucsim/option.cc +++ b/sim/ucsim/option.cc @@ -7,22 +7,24 @@ * */ -/* This file is part of microcontroller simulator: ucsim. - -UCSIM is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -UCSIM is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with UCSIM; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +/* + This file is part of microcontroller simulator: ucsim. + + UCSIM is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + UCSIM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with UCSIM; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ /*@1@*/ #include "ddconfig.h" @@ -42,6 +44,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "simcl.h" +/*struct id_element option_type_names[]= { + { non_opt , "non" }, + { integer_opt , "integer" }, + { float_opt , "float" }, + { bool_opt , "boolean" }, + { string_opt , "string" }, + { pointer_opt , "pointer" }, + { 0, 0 } + };*/ + /* * Base class for option's objects *____________________________________________________________________________ @@ -54,8 +66,12 @@ cl_option::cl_option(class cl_base *the_creator, char *aname, char *Ihelp): creator= the_creator; set_name(aname); help= strdup(Ihelp); - users= new cl_list(2, 2); + char *s= (char*)malloc(strlen(aname)+100); + sprintf(s, "users of option \"%s\"", aname); + users= new cl_list(2, 2, s); + free(s); memset(&value, 0, sizeof(value)); + show(); } class cl_option & @@ -153,6 +169,51 @@ cl_option::set_value(char *opt) } +void +cl_option::get_value(void **val) +{ + if (val) + *val= value.pval; +} + +void +cl_option::set_value(void *opt) +{ + value.pval= opt; + inform_users(); +} + + +void +cl_option::get_value(long *val) +{ + if (val) + *val= value.ival; +} + +void +cl_option::set_value(long opt) +{ + value.ival= opt; + inform_users(); +} + + +void +cl_option::get_value(double *val) +{ + if (val) + *val= value.fval; +} + +void +cl_option::set_value(double opt) +{ + value.fval= opt; + inform_users(); +} + + /* * List of options */ @@ -214,24 +275,24 @@ cl_options::get_option(char *the_name, class cl_base *creator) idx--; o= (class cl_option *)(at(idx)); while (compare(the_name, key_of(o)) == 0 && - idx > 0) - { - idx--; - o= (class cl_option *)(at(idx)); - } + idx > 0) + { + idx--; + o= (class cl_option *)(at(idx)); + } if (compare(the_name, key_of(o)) != 0) - idx++; + idx++; } o= (class cl_option *)(at(idx)); while (compare(the_name, key_of(o)) == 0 && - o->get_creator() != creator && - idx < count) + o->get_creator() != creator && + idx < count) { idx++; o= (class cl_option *)(at(idx)); if (compare(the_name, key_of(o)) == 0 && - o->get_creator() == creator) - return(o); + o->get_creator() == creator) + return(o); } if (compare(the_name, key_of(o)) == 0 && o->get_creator() == creator) @@ -252,24 +313,24 @@ cl_options::get_option(char *the_name, char *creator) idx--; o= (class cl_option *)(at(idx)); while (compare(the_name, key_of(o)) == 0 && - idx > 0) - { - idx--; - o= (class cl_option *)(at(idx)); - } + idx > 0) + { + idx--; + o= (class cl_option *)(at(idx)); + } if (compare(the_name, key_of(o)) != 0) - idx++; + idx++; } o= (class cl_option *)(at(idx)); while (compare(the_name, key_of(o)) == 0 && - strcmp(object_name(o->get_creator()), creator) != 0 && - idx < count) + strcmp(object_name(o->get_creator()), creator) != 0 && + idx < count) { idx++; o= (class cl_option *)(at(idx)); if (compare(the_name, key_of(o)) == 0 && - strcmp(object_name(o->get_creator()), creator) == 0) - return(o); + strcmp(object_name(o->get_creator()), creator) == 0) + return(o); } if (compare(the_name, key_of(o)) == 0 && strcmp(object_name(o->get_creator()), creator) == 0) @@ -294,7 +355,7 @@ cl_options::nuof_options(char *the_name) { class cl_option *o= (class cl_option *)(at(i)); if (strcmp(the_name, o->get_name()) == 0) - n++; + n++; } return(n); } @@ -308,8 +369,8 @@ cl_options::nuof_options(char *the_name, char *creator) { class cl_option *o= (class cl_option *)(at(i)); if (strcmp(the_name, o->get_name()) == 0 && - strcmp(creator, object_name(o->get_creator())) == 0) - n++; + strcmp(creator, object_name(o->get_creator())) == 0) + n++; } return(n); } @@ -334,6 +395,36 @@ cl_options::set_value(char *the_name, cl_base *creator, char *value) return(o); } +class cl_option * +cl_options::set_value(char *the_name, cl_base *creator, void *value) +{ + class cl_option *o= get_option(the_name, creator); + + if (o) + o->set_value(value); + return(o); +} + +class cl_option * +cl_options::set_value(char *the_name, cl_base *creator, long value) +{ + class cl_option *o= get_option(the_name, creator); + + if (o) + o->set_value(value); + return(o); +} + +class cl_option * +cl_options::set_value(char *the_name, cl_base *creator, double value) +{ + class cl_option *o= get_option(the_name, creator); + + if (o) + o->set_value(value); + return(o); +} + /* * Reference to an option @@ -363,14 +454,14 @@ cl_optref::~cl_optref(void) { option->del_reference(this); if (option->get_creator() == owner) - application->options->del_option(option); + application->options->del_option(option); } } class cl_option * cl_optref::create(class cl_base *creator, - enum option_type type, - char *the_name, char *help) + enum option_type type, + char *the_name, char *help) { if (option) option->del_reference(this); @@ -379,21 +470,21 @@ cl_optref::create(class cl_base *creator, case non_opt: option= 0; break; - /*case integer_opt: - option= new cl_option(creator, the_name, help); - break;*/ - /*case float_opt: - option= new cl_option(creator, the_name, help); - break;*/ + case integer_opt: + option= new cl_number_option(creator, the_name, help); + break; + case float_opt: + option= new cl_float_option(creator, the_name, help); + break; case bool_opt: option= new cl_bool_option(creator, the_name, help); break; case string_opt: option= new cl_string_option(creator, the_name, help); break; - /*case pointer_opt: - option= new cl_option(creator, the_name, help); - break;*/ + case pointer_opt: + option= new cl_pointer_option(creator, the_name, help); + break; default: option= 0; break; @@ -461,7 +552,7 @@ cl_optref::get_value(bool) if (!option) { fprintf(stderr, "Warning: \"%s\" is sdereferencing a non-existent " - "bool option: %s\n", object_name(owner), get_name()); + "bool option: %s\n", object_name(owner), get_name()); return(DD_FALSE); } else @@ -478,7 +569,7 @@ cl_optref::get_value(char *) if (!option) { fprintf(stderr, "Warning: \"%s\" is sdereferencing a non-existent " - "string option: %s\n", object_name(owner), get_name()); + "string option: %s\n", object_name(owner), get_name()); return(0); } else @@ -489,6 +580,57 @@ cl_optref::get_value(char *) } } +void * +cl_optref::get_value(void *) +{ + if (!option) + { + fprintf(stderr, "Warning: \"%s\" is sdereferencing a non-existent " + "pointer option: %s\n", object_name(owner), get_name()); + return(NIL); + } + else + { + void *p= NIL; + option->get_value(&p); + return(p); + } +} + +long +cl_optref::get_value(long) +{ + if (!option) + { + fprintf(stderr, "Warning: \"%s\" is sdereferencing a non-existent " + "number option: %s\n", object_name(owner), get_name()); + return(0); + } + else + { + long l= 0; + option->get_value(&l); + return(l); + } +} + +double +cl_optref::get_value(double) +{ + if (!option) + { + fprintf(stderr, "Warning: \"%s\" is sdereferencing a non-existent " + "float option: %s\n", object_name(owner), get_name()); + return(0); + } + else + { + double d= 0; + option->get_value(&d); + return(d); + } +} + /* * BOOL type of option @@ -497,12 +639,12 @@ cl_optref::get_value(char *) */ cl_bool_option::cl_bool_option(class cl_base *the_creator, - char *aname, char *Ihelp): + char *aname, char *Ihelp): cl_option(the_creator, aname, Ihelp) {} void -cl_bool_option::print(class cl_console *con) +cl_bool_option::print(class cl_console_base *con) { if (/**(bool *)option*/value.bval) con->dd_printf("TRUE"); @@ -519,11 +661,11 @@ cl_bool_option::set_value(char *s) { c= toupper(*s); if (c == '1' || - c == 'T' || - c == 'Y') - /**(bool *)option=*/ value.bval= DD_TRUE; + c == 'T' || + c == 'Y') + /**(bool *)option=*/ value.bval= DD_TRUE; else - /**(bool *)option=*/ value.bval= DD_FALSE; + /**(bool *)option=*/ value.bval= DD_FALSE; } inform_users(); } @@ -536,7 +678,7 @@ cl_bool_option::set_value(char *s) */ cl_string_option::cl_string_option(class cl_base *the_creator, - char *aname, char *Ihelp): + char *aname, char *Ihelp): cl_option(the_creator, aname, Ihelp) {} @@ -550,7 +692,7 @@ cl_string_option::operator=(class cl_option &o) } void -cl_string_option::print(class cl_console *con) +cl_string_option::print(class cl_console_base *con) { if (/**(bool *)option*/value.sval) con->dd_printf("\"%s\"", value.sval); @@ -558,23 +700,51 @@ cl_string_option::print(class cl_console *con) con->dd_printf("(null)"); } + /* - * Debug on console + * PONITER type of option + *____________________________________________________________________________ + * */ +cl_pointer_option::cl_pointer_option(class cl_base *the_creator, + char *aname, char *Ihelp): + cl_option(the_creator, aname, Ihelp) +{} + +class cl_option & +cl_pointer_option::operator=(class cl_option &o) +{ + set_value((o.get_value())->pval); + return(*this); +} + +void +cl_pointer_option::print(class cl_console_base *con) +{ + if (value.pval) + con->dd_printf("\"%p\"", value.pval); + else + con->dd_printf("(null)"); +} + + +/* + * Debug on console + */ +/* cl_cons_debug_opt::cl_cons_debug_opt(class cl_app *the_app, - char *Iid, - char *Ihelp): + char *Iid, + char *Ihelp): cl_option(0, Iid, Ihelp) { app= the_app; } void -cl_cons_debug_opt::print(class cl_console *con) +cl_cons_debug_opt::print(class cl_console_base *con) { - if (/*sim->cmd->actual_console && - sim->cmd->actual_console*/con->flags & CONS_DEBUG) + if (con->flags & CONS_DEBUG) con->dd_printf("TRUE"); else con->dd_printf("FALSE"); @@ -594,9 +764,9 @@ cl_cons_debug_opt::set_value(bool opt) if (app->get_commander()->actual_console) { if (opt) - app->get_commander()->actual_console->flags|= CONS_DEBUG; + app->get_commander()->actual_console->flags|= CONS_DEBUG; else - app->get_commander()->actual_console->flags&= ~CONS_DEBUG; + app->get_commander()->actual_console->flags&= ~CONS_DEBUG; } inform_users(); } @@ -611,15 +781,65 @@ cl_cons_debug_opt::set_value(char *s) { c= toupper(*s); if (c == '1' || - c == 'T' || - c == 'Y') - //app->get_commander()->actual_console->flags|= CONS_DEBUG; - set_value(1); + c == 'T' || + c == 'Y') + set_value(1); else - //app->get_commander()->actual_console->flags&= ~CONS_DEBUG; - set_value(0); + set_value(0); } } +*/ + +/* + * NUMBER type of option + *____________________________________________________________________________ + * + */ + +cl_number_option::cl_number_option(class cl_base *the_creator, + char *aname, char *Ihelp): + cl_option(the_creator, aname, Ihelp) +{} + +void +cl_number_option::print(class cl_console_base *con) +{ + con->dd_printf("%ld", value.ival); +} + +void +cl_number_option::set_value(char *s) +{ + if (s) + value.ival= strtol(s, NIL, 0); + inform_users(); +} + + +/* + * FLOAT type of option + *____________________________________________________________________________ + * + */ + +cl_float_option::cl_float_option(class cl_base *the_creator, + char *aname, char *Ihelp): + cl_option(the_creator, aname, Ihelp) +{} + +void +cl_float_option::print(class cl_console_base *con) +{ + con->dd_printf("%.3f", value.fval); +} + +void +cl_float_option::set_value(char *s) +{ + if (s) + value.fval= strtod(s, NIL); + inform_users(); +} /* End of option.cc */