summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/defs.h6
-rw-r--r--gdb/gdbtk/ChangeLog10
-rw-r--r--gdb/gdbtk/generic/gdbtk-cmds.c6
-rw-r--r--gdb/gdbtk/generic/gdbtk-stack.c4
-rw-r--r--gdb/gdbtk/generic/gdbtk-varobj.c2
-rw-r--r--gdb/utils.c44
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;
+}