diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/defs.h | 6 | ||||
-rw-r--r-- | gdb/gdbtk/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/gdbtk/generic/gdbtk-cmds.c | 6 | ||||
-rw-r--r-- | gdb/gdbtk/generic/gdbtk-stack.c | 4 | ||||
-rw-r--r-- | gdb/gdbtk/generic/gdbtk-varobj.c | 2 | ||||
-rw-r--r-- | gdb/utils.c | 44 |
7 files changed, 76 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aea9dc1b715..1cc56a5a6b7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2001-10-16 Andrew Cagney <ac131313@redhat.com> + + Based on code by John Moore <jmore@redhat.com>: + + * utils.c (core_addr_to_string): New function for conversion of + CORE_ADDR to string. + (string_to_core_addr): New function to convert from string to + CORE_ADDR. + * defs.h: Added extern statements for the above. + 2001-10-17 Jason Molenda (jason-cl@molenda.com) * symtab.c (lookup_block_symbol): Break out of linear search diff --git a/gdb/defs.h b/gdb/defs.h index a0d6d03e8d2..390600ff6ba 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -690,6 +690,12 @@ extern char *paddr_d (LONGEST addr); extern char *phex (ULONGEST l, int sizeof_l); extern char *phex_nz (ULONGEST l, int sizeof_l); +/* Like paddr() only print/scan raw CORE_ADDR. The output from + core_addr_to_string() can be passed direct to + string_to_core_addr(). */ +extern const char *core_addr_to_string (const CORE_ADDR addr); +extern CORE_ADDR string_to_core_addr (const char *my_string); + extern void fprintf_symbol_filtered (struct ui_file *, char *, enum language, int); diff --git a/gdb/gdbtk/ChangeLog b/gdb/gdbtk/ChangeLog index fd3affbfab7..8709364199a 100644 --- a/gdb/gdbtk/ChangeLog +++ b/gdb/gdbtk/ChangeLog @@ -1,3 +1,13 @@ +2001-10-16 Andrew Cagney <ac131313@redhat.com> + + From 2001-08-29 John Moore <jmoore@redhat.com>: + * gdbtk/generic/gdbtk-cmds.c (gdb_disassemble): Replaced + parse_and_eval_address() with string_to_core_addr(). + (gdb_load_disassembly): Same. + (gdb_set_mem): Ditto. + * gdbtk/generic/gdbtk-stack.c (gdb_block_vars): Ditto. + * gdbtk/generic/gdbtk-varobj.c (variable_create): Same. + 2001-10-17 Tom Tromey <tromey@cygnus.com> * console.itb (Console::_build_win): Handle bindings which diff --git a/gdb/gdbtk/generic/gdbtk-cmds.c b/gdb/gdbtk/generic/gdbtk-cmds.c index 71410050fbd..ddc6a1a4815 100644 --- a/gdb/gdbtk/generic/gdbtk-cmds.c +++ b/gdb/gdbtk/generic/gdbtk-cmds.c @@ -1599,7 +1599,7 @@ gdb_disassemble (clientData, interp, objc, objv) else error ("First arg must be 'source' or 'nosource'"); - low = parse_and_eval_address (Tcl_GetStringFromObj (objv[2], NULL)); + low = string_to_core_addr (Tcl_GetStringFromObj (objv[2], NULL)); if (objc == 3) { @@ -1607,7 +1607,7 @@ gdb_disassemble (clientData, interp, objc, objv) error ("No function contains specified address"); } else - high = parse_and_eval_address (Tcl_GetStringFromObj (objv[3], NULL)); + high = string_to_core_addr (Tcl_GetStringFromObj (objv[3], NULL)); return gdb_disassemble_driver (low, high, mixed_source_and_assembly, NULL, gdbtk_print_source, gdbtk_print_asm); @@ -2520,7 +2520,7 @@ gdb_set_mem (clientData, interp, objc, objv) } /* Address to write */ - addr = parse_and_eval_address (Tcl_GetStringFromObj (objv[1], NULL)); + addr = string_to_core_addr (Tcl_GetStringFromObj (objv[1], NULL)); /* String value to write: it's in hex */ hexstr = Tcl_GetStringFromObj (objv[2], NULL); diff --git a/gdb/gdbtk/generic/gdbtk-stack.c b/gdb/gdbtk/generic/gdbtk-stack.c index fee19867e49..498bc7c2a15 100644 --- a/gdb/gdbtk/generic/gdbtk-stack.c +++ b/gdb/gdbtk/generic/gdbtk-stack.c @@ -109,8 +109,8 @@ gdb_block_vars (clientData, interp, objc, objv) if (selected_frame == NULL) return TCL_OK; - start = parse_and_eval_address (Tcl_GetStringFromObj (objv[1], NULL)); - end = parse_and_eval_address (Tcl_GetStringFromObj (objv[2], NULL)); + start = string_to_core_addr (Tcl_GetStringFromObj (objv[1], NULL)); + end = string_to_core_addr (Tcl_GetStringFromObj (objv[2], NULL)); block = get_frame_block (selected_frame); diff --git a/gdb/gdbtk/generic/gdbtk-varobj.c b/gdb/gdbtk/generic/gdbtk-varobj.c index dd0359e22ca..b0f031aa2ff 100644 --- a/gdb/gdbtk/generic/gdbtk-varobj.c +++ b/gdb/gdbtk/generic/gdbtk-varobj.c @@ -364,7 +364,7 @@ variable_create (interp, objc, objv) { char *str; str = Tcl_GetStringFromObj (objv[1], NULL); - frame = parse_and_eval_address (str); + frame = string_to_core_addr (str); how_specified = USE_SPECIFIED_FRAME; objc--; objv++; diff --git a/gdb/utils.c b/gdb/utils.c index ba73d8d5734..d32957f7019 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -2490,3 +2490,47 @@ address_to_host_pointer (CORE_ADDR addr) ADDRESS_TO_POINTER (builtin_type_void_data_ptr, &ptr, addr); return ptr; } + +/* Convert a CORE_ADDR into a string. */ +const char * +core_addr_to_string (const CORE_ADDR addr) +{ + char *str = get_cell (); + strcpy (str, "0x"); + strcat (str, phex_nz (addr, sizeof (addr))); + return str; +} + +/* Convert a string back into a CORE_ADDR. */ +CORE_ADDR +string_to_core_addr (const char *my_string) +{ + CORE_ADDR addr = 0; + if (my_string[0] == '0' && tolower (my_string[1]) == 'x') + { + /* Assume that it is in decimal. */ + int i; + for (i = 2; my_string[i] != '\0'; i++) + { + if (isdigit (my_string[i])) + addr = (my_string[i] - '0') + (addr * 16); + else if (isxdigit (my_string[i])) + addr = (tolower (my_string[i]) - 'a' + 0xa) + (addr * 16); + else + internal_error (__FILE__, __LINE__, "invalid hex"); + } + } + else + { + /* Assume that it is in decimal. */ + int i; + for (i = 0; my_string[i] != '\0'; i++) + { + if (isdigit (my_string[i])) + addr = (my_string[i] - '0') + (addr * 10); + else + internal_error (__FILE__, __LINE__, "invalid decimal"); + } + } + return addr; +} |