diff options
Diffstat (limited to 'gdb/p-lang.c')
-rw-r--r-- | gdb/p-lang.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 41da3e0..e743a6f 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -97,7 +97,8 @@ pascal_main_name (void) but this does not happen for Free Pascal nor for GPC. */ int is_pascal_string_type (struct type *type,int *length_pos, - int *length_size, int *string_pos, int *char_size, + int *length_size, int *string_pos, + struct type **char_type, char **arrayname) { if (TYPE_CODE (type) == TYPE_CODE_STRUCT) @@ -114,8 +115,8 @@ is_pascal_string_type (struct type *type,int *length_pos, *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 0)); if (string_pos) *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; - if (char_size) - *char_size = 1; + if (char_type) + *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 1)); if (arrayname) *arrayname = TYPE_FIELDS (type)[1].name; return 2; @@ -126,7 +127,6 @@ is_pascal_string_type (struct type *type,int *length_pos, && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0 && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0) { - struct type *char_type; if (length_pos) *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; if (length_size) @@ -134,13 +134,12 @@ is_pascal_string_type (struct type *type,int *length_pos, if (string_pos) *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT; /* FIXME: how can I detect wide chars in GPC ?? */ - char_type = TYPE_FIELD_TYPE (type,2); - if (char_size && TYPE_CODE (char_type) == TYPE_CODE_ARRAY) + if (char_type) { - *char_size = TYPE_LENGTH (TYPE_TARGET_TYPE (char_type)); + *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 2)); + if (TYPE_CODE (*char_type) == TYPE_CODE_ARRAY) + *char_type = TYPE_TARGET_TYPE (*char_type); } - else if (char_size) - *char_size = 1; if (arrayname) *arrayname = TYPE_FIELDS (type)[2].name; return 3; @@ -182,14 +181,15 @@ pascal_one_char (int c, struct ui_file *stream, int *in_quotes) } } -static void pascal_emit_char (int c, struct ui_file *stream, int quoter); +static void pascal_emit_char (int c, struct type *type, + struct ui_file *stream, int quoter); /* Print the character C on STREAM as part of the contents of a literal string whose delimiter is QUOTER. Note that that format for printing characters and strings is language specific. */ static void -pascal_emit_char (int c, struct ui_file *stream, int quoter) +pascal_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) { int in_quotes = 0; pascal_one_char (c, stream, &in_quotes); @@ -198,7 +198,7 @@ pascal_emit_char (int c, struct ui_file *stream, int quoter) } void -pascal_printchar (int c, struct ui_file *stream) +pascal_printchar (int c, struct type *type, struct ui_file *stream) { int in_quotes = 0; pascal_one_char (c, stream, &in_quotes); @@ -212,14 +212,16 @@ pascal_printchar (int c, struct ui_file *stream) had to stop before printing LENGTH characters, or if FORCE_ELLIPSES. */ void -pascal_printstr (struct ui_file *stream, const gdb_byte *string, - unsigned int length, int width, int force_ellipses, +pascal_printstr (struct ui_file *stream, struct type *type, + const gdb_byte *string, unsigned int length, + int force_ellipses, const struct value_print_options *options) { unsigned int i; unsigned int things_printed = 0; int in_quotes = 0; int need_comma = 0; + int width = TYPE_LENGTH (type); /* If the string was not truncated due to `set print elements', and the last byte of it is a null, we don't print that, in traditional C @@ -273,7 +275,7 @@ pascal_printstr (struct ui_file *stream, const gdb_byte *string, fputs_filtered ("', ", stream); in_quotes = 0; } - pascal_printchar (current_char, stream); + pascal_printchar (current_char, type, stream); fprintf_filtered (stream, " <repeats %u times>", reps); i = rep1 - 1; things_printed += options->repeat_count_threshold; |