diff options
author | Pierre Muller <muller@sourceware.org> | 2001-11-09 09:48:09 +0000 |
---|---|---|
committer | Pierre Muller <muller@sourceware.org> | 2001-11-09 09:48:09 +0000 |
commit | 5598ce11711078da0c7d490d11cc14cfdc421436 (patch) | |
tree | 2ea4ac92707ba0d1999dff87b24bfdd6a737d225 /gdb/p-valprint.c | |
parent | 94a716bf572725eb2c6517833853a77ca3165362 (diff) | |
download | gdb-5598ce11711078da0c7d490d11cc14cfdc421436.zip gdb-5598ce11711078da0c7d490d11cc14cfdc421436.tar.gz gdb-5598ce11711078da0c7d490d11cc14cfdc421436.tar.bz2 |
2001-11-06 Pierre Muller <muller@ics.u-strasbg.fr>
* p-lang.c (is_pascal_string_type): New function to determine if a
type is a string type.
* p-lang.h: Add prototype for is_pascal_string_type.
* p-valprint.c (pascal_val_print) : Use is_pascal_string_type function
to display strings nicely.
Diffstat (limited to 'gdb/p-valprint.c')
-rw-r--r-- | gdb/p-valprint.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c index 275427b..78b941a 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -63,6 +63,8 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset, unsigned len; struct type *elttype; unsigned eltlen; + int length_pos, length_size, string_pos; + int char_size; LONGEST val; CORE_ADDR addr; @@ -187,16 +189,17 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset, as GDB does not recognize stabs pascal strings Pascal strings are mapped to records with lowercase names PM */ - /* I don't know what GPC does :( PM */ - if (TYPE_CODE (elttype) == TYPE_CODE_STRUCT && - TYPE_NFIELDS (elttype) == 2 && - strcmp (TYPE_FIELDS (elttype)[0].name, "length") == 0 && - strcmp (TYPE_FIELDS (elttype)[1].name, "st") == 0 && - addr != 0) + if (is_pascal_string_type (elttype, &length_pos, + &length_size, &string_pos, &char_size) + && addr != 0) { - char bytelength; - read_memory (addr, &bytelength, 1); - i = val_print_string (addr + 1, bytelength, 1, stream); + ULONGEST string_length; + void *buffer; + buffer = xmalloc (length_size); + read_memory (addr + length_pos, buffer, length_size); + string_length = extract_unsigned_integer (buffer, length_size); + xfree (buffer); + i = val_print_string (addr + string_pos, string_length, char_size, stream); } else if (pascal_object_is_vtbl_member (type)) { @@ -205,8 +208,8 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset, struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (vt_address); - if ((msymbol != NULL) && - (vt_address == SYMBOL_VALUE_ADDRESS (msymbol))) + if ((msymbol != NULL) + && (vt_address == SYMBOL_VALUE_ADDRESS (msymbol))) { fputs_filtered (" <", stream); fputs_filtered (SYMBOL_SOURCE_NAME (msymbol), stream); @@ -315,12 +318,11 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset, } else { - if ((TYPE_NFIELDS (type) == 2) && - (strcmp (TYPE_FIELDS (type)[0].name, "length") == 0) && - (strcmp (TYPE_FIELDS (type)[1].name, "st") == 0)) + if (is_pascal_string_type (type, &length_pos, &length_size, + &string_pos, &char_size)) { - len = (*(valaddr + embedded_offset)) & 0xff; - LA_PRINT_STRING (stream, valaddr + embedded_offset + 1, len, /* width ?? */ 0, 0); + len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size); + LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0); } else pascal_object_print_value_fields (type, valaddr + embedded_offset, address, stream, format, |