From cad7297e805c8c4ed5c45196f0c8c0ee1b7b0bfa Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Wed, 10 Sep 1997 22:47:12 +0000 Subject: [PATCH] o Wordwrap usage messages from sim-options o Clarify how to use alias options o use in sim-watch (better usage message) o Don't pass something on the stack into the watch-point interrupt hander. --- sim/common/ChangeLog | 17 +++++++++++++++++ sim/common/sim-options.c | 29 ++++++++++++++++++++++------- sim/common/sim-watch.c | 43 ++++++++++++++++++++++++++++++++++--------- sim/v850/ChangeLog | 5 +++++ sim/v850/interp.c | 4 +++- 5 files changed, 81 insertions(+), 17 deletions(-) diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog index e9c399b..5598ee2 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,3 +1,20 @@ +Thu Sep 11 08:44:52 1997 Andrew Cagney + + * sim-watch.c (handle_watchpoint): Pass a char** index into the + interrupt_names array as the data. + (sim-watch.h): Document. + +Wed Sep 10 16:15:22 1997 Andrew Cagney + + * sim-options.c (sim_print_help): When the doc string is to long + word wrap it. + + * sim-watch.c (sim_watchpoint_install): Use option.doc_name so + that only the first few the watch options are listed. Generate + meanginful usage messages. + + * sim-options.h (struct OPTION): Clarify use of doc_name field + Wed Sep 10 13:23:24 1997 Andrew Cagney * sim-options.c (OPTION_ARCHITECTURE_INFO): New option. diff --git a/sim/common/sim-options.c b/sim/common/sim-options.c index 17c1402..96e1dba 100644 --- a/sim/common/sim-options.c +++ b/sim/common/sim-options.c @@ -464,6 +464,7 @@ sim_print_help (sd, is_command) for (ol = STATE_OPTIONS (sd); ol != NULL; ol = ol->next) for (opt = ol->options; opt->opt.name != NULL; ++opt) { + const int indent = 30; int comma, len; const OPTION *o; @@ -546,16 +547,30 @@ sim_print_help (sd, is_command) } while (o->opt.name != NULL && o->doc == NULL); - if (len >= 30) + if (len >= indent) { - sim_io_printf (sd, "\n"); - len = 0; + sim_io_printf (sd, "\n%*s", indent, ""); } + else + sim_io_printf (sd, "%*s", indent - len, ""); - for (; len < 30; len++) - sim_io_printf (sd, " "); - - sim_io_printf (sd, "%s\n", opt->doc); + { + const char *chp = opt->doc; + int doc_width = 80 - indent; + while (strlen (chp) >= doc_width) /* some slack */ + { + const char *end = chp + doc_width - 1; + while (end > chp && !isspace (*end)) + end --; + if (end == chp) + end = chp + doc_width - 1; + sim_io_printf (sd, "%.*s\n%*s", end - chp, chp, indent, ""); + chp = end; + while (isspace (*chp) && *chp != '\0') + chp++; + } + sim_io_printf (sd, "%s\n", chp); + } } sim_io_printf (sd, "\n"); diff --git a/sim/common/sim-watch.c b/sim/common/sim-watch.c index 5df898b..d1643b6 100644 --- a/sim/common/sim-watch.c +++ b/sim/common/sim-watch.c @@ -228,7 +228,7 @@ handle_watchpoint (SIM_DESC sd, void *data) if (point->interrupt_nr == watch->nr_interrupts) sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_stopped, SIGINT); else - watch->interrupt_handler (sd, &interrupt_nr); + watch->interrupt_handler (sd, &watch->interrupt_names[interrupt_nr]); } @@ -388,12 +388,6 @@ static const OPTION watchpoint_options[] = { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL } }; -static const OPTION template_int_option = { - { NULL, required_argument, NULL, 0 }, - '\0', "VALUE", "Create the specified watchpoint", - watchpoint_option_handler, -}; - static char *default_interrupt_names[] = { "int", 0, }; @@ -421,17 +415,48 @@ sim_watchpoint_install (SIM_DESC sd) watchpoint_type type; for (type = 0; type < nr_watchpoint_types; type++) { + char *name; int nr = interrupt_nr * nr_watchpoint_types + type; OPTION *option = &int_options[nr]; - char *name; - *option = template_int_option; asprintf (&name, "watch-%s-%s", watchpoint_type_to_str (sd, type), interrupt_nr_to_str (sd, interrupt_nr)); option->opt.name = name; + option->opt.has_arg = required_argument; option->opt.val = type_to_option (sd, type, interrupt_nr); + option->doc = ""; + option->doc_name = ""; } } + /* adjust first few entries so that they contain real + documentation, the first entry includes a list of actions. */ + { + char *prefix = + "Watch the simulator, take ACTION in COUNT cycles (`+' for every COUNT cycles), ACTION is"; + char *doc; + int len = strlen (prefix) + 1; + for (interrupt_nr = 0; interrupt_nr <= watch->nr_interrupts; interrupt_nr++) + len += strlen (interrupt_nr_to_str (sd, interrupt_nr)) + 1; + doc = NZALLOC (char, len); + strcpy (doc, prefix); + for (interrupt_nr = 0; interrupt_nr <= watch->nr_interrupts; interrupt_nr++) + { + strcat (doc, " "); + strcat (doc, interrupt_nr_to_str (sd, interrupt_nr)); + } + int_options[0].doc_name = "watch-cycles-ACTION"; + int_options[0].arg = "[+]COUNT"; + int_options[0].doc = doc; + } + int_options[1].doc_name = "watch-pc-ACTION"; + int_options[1].arg = "[!]ADDRESS"; + int_options[1].doc = + "Watch the PC, take ACTION when matches ADDRESS (in range ADDRESS,ADDRESS), `!' negates test"; + int_options[2].doc_name = "watch-clock-ACTION"; + int_options[2].arg = "[+]MILLISECONDS"; + int_options[2].doc = + "Watch the clock, take ACTION after MILLISECONDS (`+' for every MILLISECONDS)"; + sim_add_option_table (sd, int_options); } return SIM_RC_OK; diff --git a/sim/v850/ChangeLog b/sim/v850/ChangeLog index a2c3f1b..b330611 100644 --- a/sim/v850/ChangeLog +++ b/sim/v850/ChangeLog @@ -1,3 +1,8 @@ +Thu Sep 11 08:40:03 1997 Andrew Cagney + + * interp.c: Compute inttype from the interrupt_names index that + was passed in. + Wed Sep 10 10:25:40 1997 Andrew Cagney * simops.c (trace_input): Use trace_printf instead of diff --git a/sim/v850/interp.c b/sim/v850/interp.c index e77cb48..753996f 100644 --- a/sim/v850/interp.c +++ b/sim/v850/interp.c @@ -63,7 +63,9 @@ do_interrupt (sd, data) SIM_DESC sd; void *data; { - enum interrupt_type inttype = *(int*)data; + char **interrupt_name = (char**)data; + enum interrupt_type inttype; + inttype = (interrupt_name - STATE_WATCHPOINTS (sd)->interrupt_names); /* Disable further interrupts. */ PSW |= PSW_ID; /* Indicate that we're doing interrupt not exception processing. */ -- 2.7.4