This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[PATH] Change is_pascal_string_type args
- From: Pierre Muller <muller at cerbere dot u-strasbg dot fr>
- To: gdb-patches at sources dot redhat dot com
- Date: Thu, 02 May 2002 13:13:40 +0200
- Subject: [PATH] Change is_pascal_string_type args
The following patch is only to prepare for the
next patch for p-exp.y that will enhance the field
search for pascal expressions.
It adds a new argument that can contain
a pointer to the name of the field containing the
chars of the string.
If the type is a pascal string the retruned value is now
the char array field index plus one.
(to avoid a zero if some new pascal compiler
use the first field to contain the char array one day...)
ChangeLog entry:
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.
Index: p-lang.c
===================================================================
RCS file: /cvs/src/src/gdb/p-lang.c,v
retrieving revision 1.5
diff -u -p -r1.5 p-lang.c
--- p-lang.c 13 Feb 2002 18:49:30 -0000 1.5
+++ p-lang.c 2 May 2002 11:12:00 -0000
@@ -44,7 +44,8 @@ extern void _initialize_pascal_language
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, int *char_size,
+ char **arrayname)
{
if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
{
@@ -54,11 +55,17 @@ is_pascal_string_type (struct type *type
&& strcmp (TYPE_FIELDS (type)[0].name, "length") == 0
&& strcmp (TYPE_FIELDS (type)[1].name, "st") == 0)
{
- *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
- *length_size = TYPE_FIELD_TYPE (type, 0)->length;
- *string_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
- *char_size = 1;
- return 1;
+ if (length_pos)
+ *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT;
+ if (length_size)
+ *length_size = TYPE_FIELD_TYPE (type, 0)->length;
+ 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. */
/* Three fields: Capacity, length and schema$ or _p_schema. */
@@ -66,12 +73,18 @@ is_pascal_string_type (struct type *type
&& strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0
&& strcmp (TYPE_FIELDS (type)[1].name, "length") == 0)
{
- *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT;
- *length_size = TYPE_FIELD_TYPE (type, 1)->length;
- *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT;
+ if (length_pos)
+ *length_pos = TYPE_FIELD_BITPOS (type, 1) / 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 ?? */
- *char_size = 1;
- return 1;
+ if (char_size)
+ *char_size = 1;
+ if (arrayname)
+ *arrayname = TYPE_FIELDS (type)[2].name;
+ return 3;
};
}
return 0;
Index: p-lang.h
===================================================================
RCS file: /cvs/src/src/gdb/p-lang.h,v
retrieving revision 1.3
diff -u -p -r1.3 p-lang.h
--- p-lang.h 9 Nov 2001 09:48:09 -0000 1.3
+++ p-lang.h 2 May 2002 11:12:00 -0000
@@ -38,7 +38,8 @@ extern void pascal_type_print_method_arg
/* 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 *);
Index: p-valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/p-valprint.c,v
retrieving revision 1.9
diff -u -p -r1.9 p-valprint.c
--- p-valprint.c 8 Jan 2002 02:09:31 -0000 1.9
+++ p-valprint.c 2 May 2002 11:12:01 -0000
@@ -190,8 +190,8 @@ pascal_val_print (struct type *type, cha
as GDB does not recognize stabs pascal strings
Pascal strings are mapped to records
with lowercase names PM */
- if (is_pascal_string_type (elttype, &length_pos,
- &length_size, &string_pos, &char_size)
+ if (is_pascal_string_type (elttype, &length_pos, &length_size,
+ &string_pos, &char_size, NULL)
&& addr != 0)
{
ULONGEST string_length;
@@ -320,7 +320,7 @@ pascal_val_print (struct type *type, cha
else
{
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);
LA_PRINT_STRING (stream, valaddr + embedded_offset + string_pos, len, char_size, 0);
Pierre Muller
Institut Charles Sadron
6,rue Boussingault
F 67083 STRASBOURG CEDEX (France)
mailto:muller@ics.u-strasbg.fr
Phone : (33)-3-88-41-40-07 Fax : (33)-3-88-41-40-99