This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]