2002-05-02 Pierre Muller <muller@ics.u-strasbg.fr>

* p-lang.h (is_pascal_string_type): Declaration changed,
	new sixth argument of type char ** added.
	* p-lang.c (is_pascal_string_type): Implementation
	changed. Args length_pos, length_size, string_pos, char_size
	can now be NULL. New argument arrayname set to the field
	name of the char array. Return value set to char array
	field index plus one.
	* p-valprint.c (pascal_val_print): Adapt to new declaration of
	is_pascal_string_type function.
This commit is contained in:
Pierre Muller
2002-05-02 11:18:07 +00:00
parent 805fc79928
commit e2625b330b
4 changed files with 41 additions and 15 deletions

View File

@ -1,3 +1,15 @@
2002-05-02 Pierre Muller <muller@ics.u-strasbg.fr>
* p-lang.h (is_pascal_string_type): Declaration changed,
new sixth argument of type char ** added.
* p-lang.c (is_pascal_string_type): Implementation
changed. Args length_pos, length_size, string_pos, char_size
can now be NULL. New argument arrayname set to the field
name of the char array. Return value set to char array
field index plus one.
* p-valprint.c (pascal_val_print): Adapt to new declaration of
is_pascal_string_type function.
2002-05-02 Andrew Cagney <cagney@redhat.com> 2002-05-02 Andrew Cagney <cagney@redhat.com>
* gdbarch.sh (gdbarch_update_p): Revert 2002-05-02 Andrew Cagney * gdbarch.sh (gdbarch_update_p): Revert 2002-05-02 Andrew Cagney

View File

@ -44,7 +44,8 @@ extern void _initialize_pascal_language (void);
but this does not happen for Free Pascal nor for GPC. */ but this does not happen for Free Pascal nor for GPC. */
int int
is_pascal_string_type (struct type *type,int *length_pos, 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, int *char_size,
char **arrayname)
{ {
if (TYPE_CODE (type) == TYPE_CODE_STRUCT) if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
{ {
@ -54,11 +55,17 @@ is_pascal_string_type (struct type *type,int *length_pos,
&& strcmp (TYPE_FIELDS (type)[0].name, "length") == 0 && strcmp (TYPE_FIELDS (type)[0].name, "length") == 0
&& strcmp (TYPE_FIELDS (type)[1].name, "st") == 0) && strcmp (TYPE_FIELDS (type)[1].name, "st") == 0)
{ {
*length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT; if (length_pos)
*length_size = TYPE_FIELD_TYPE (type, 0)->length; *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
*string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; if (length_size)
*char_size = 1; *length_size = TYPE_FIELD_TYPE (type, 0)->length;
return 1; if (string_pos)
*string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
if (char_size)
*char_size = 1;
if (arrayname)
*arrayname = TYPE_FIELDS (type)[1].name;
return 2;
}; };
/* GNU pascal strings. */ /* GNU pascal strings. */
/* Three fields: Capacity, length and schema$ or _p_schema. */ /* Three fields: Capacity, length and schema$ or _p_schema. */
@ -66,12 +73,18 @@ is_pascal_string_type (struct type *type,int *length_pos,
&& strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0 && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0
&& strcmp (TYPE_FIELDS (type)[1].name, "length") == 0) && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0)
{ {
*length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; if (length_pos)
*length_size = TYPE_FIELD_TYPE (type, 1)->length; *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
*string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT; if (length_size)
*length_size = TYPE_FIELD_TYPE (type, 1)->length;
if (string_pos)
*string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
/* FIXME: how can I detect wide chars in GPC ?? */ /* FIXME: how can I detect wide chars in GPC ?? */
*char_size = 1; if (char_size)
return 1; *char_size = 1;
if (arrayname)
*arrayname = TYPE_FIELDS (type)[2].name;
return 3;
}; };
} }
return 0; return 0;

View File

@ -38,7 +38,8 @@ extern void pascal_type_print_method_args (char *, char *,
/* These are in p-lang.c: */ /* These are in p-lang.c: */
extern int is_pascal_string_type (struct type *, int *, int *, int *, int*); extern int
is_pascal_string_type (struct type *, int *, int *, int *, int *, char **);
extern void pascal_printchar (int, struct ui_file *); extern void pascal_printchar (int, struct ui_file *);

View File

@ -190,8 +190,8 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset,
as GDB does not recognize stabs pascal strings as GDB does not recognize stabs pascal strings
Pascal strings are mapped to records Pascal strings are mapped to records
with lowercase names PM */ with lowercase names PM */
if (is_pascal_string_type (elttype, &length_pos, if (is_pascal_string_type (elttype, &length_pos, &length_size,
&length_size, &string_pos, &char_size) &string_pos, &char_size, NULL)
&& addr != 0) && addr != 0)
{ {
ULONGEST string_length; ULONGEST string_length;
@ -320,7 +320,7 @@ pascal_val_print (struct type *type, char *valaddr, int embedded_offset,
else else
{ {
if (is_pascal_string_type (type, &length_pos, &length_size, if (is_pascal_string_type (type, &length_pos, &length_size,
&string_pos, &char_size)) &string_pos, &char_size, NULL))
{ {
len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size); len = extract_unsigned_integer (valaddr + embedded_offset + length_pos, length_size);
LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0); LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);