aboutsummaryrefslogtreecommitdiff
path: root/gdb/p-valprint.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/p-valprint.c')
-rw-r--r--gdb/p-valprint.c34
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,