diff options
Diffstat (limited to 'gdb/cli/cli-utils.c')
-rw-r--r-- | gdb/cli/cli-utils.c | 54 |
1 files changed, 35 insertions, 19 deletions
diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c index 34c368b..133ac53 100644 --- a/gdb/cli/cli-utils.c +++ b/gdb/cli/cli-utils.c @@ -21,14 +21,15 @@ #include "cli/cli-utils.h" #include "gdb_string.h" #include "value.h" +#include "gdb_assert.h" #include <ctype.h> /* *PP is a string denoting a number. Get the number of the. Advance *PP after the string and any trailing whitespace. - Currently the string can either be a number or "$" followed by the - name of a convenience variable. + Currently the string can either be a number, or "$" followed by the + name of a convenience variable, or ("$" or "$$") followed by digits. TRAILER is a character which can be found after the number; most commonly this is `-'. If you don't want a trailer, use \0. */ @@ -41,24 +42,39 @@ get_number_trailer (char **pp, int trailer) if (*p == '$') { - /* Make a copy of the name, so we can null-terminate it - to pass to lookup_internalvar(). */ - char *varname; - char *start = ++p; - LONGEST val; - - while (isalnum (*p) || *p == '_') - p++; - varname = (char *) alloca (p - start + 1); - strncpy (varname, start, p - start); - varname[p - start] = '\0'; - if (get_internalvar_integer (lookup_internalvar (varname), &val)) - retval = (int) val; - else + struct value *val = value_from_history_ref (p, &p); + + if (val) /* Value history reference */ { - printf_filtered (_("Convenience variable must " - "have integer value.\n")); - retval = 0; + if (TYPE_CODE (value_type (val)) == TYPE_CODE_INT) + retval = value_as_long (val); + else + { + printf_filtered (_("History value must have integer type.")); + retval = 0; + } + } + else /* Convenience variable */ + { + /* Internal variable. Make a copy of the name, so we can + null-terminate it to pass to lookup_internalvar(). */ + char *varname; + char *start = ++p; + LONGEST val; + + while (isalnum (*p) || *p == '_') + p++; + varname = (char *) alloca (p - start + 1); + strncpy (varname, start, p - start); + varname[p - start] = '\0'; + if (get_internalvar_integer (lookup_internalvar (varname), &val)) + retval = (int) val; + else + { + printf_filtered (_("Convenience variable must " + "have integer value.\n")); + retval = 0; + } } } else |