**** start-sanitize-chill ****
authorFred Fish <fnf@specifix.com>
Wed, 24 Feb 1993 15:49:47 +0000 (15:49 +0000)
committerFred Fish <fnf@specifix.com>
Wed, 24 Feb 1993 15:49:47 +0000 (15:49 +0000)
* ch-typeprint.c (chill_print_type_base):  Name changed to
chill_type_print_base to match pattern for C and C++ names.
* ch-typeprint.c (chill_print_type):  Change "char" to "CHAR"
to be consistent with other usages.
* ch-typeprint.c (chill_type_print_base):  Add support for
printing Chill STRUCT types.
* ch-valprint.c:  Include values.h.
* ch-valprint.c (chill_print_value_fields):  New function and
prototype for printing Chill STRUCT values.
* ch-valprint.c (chill_val_print):  Fix call to val_print_string
that was being called with two args instead of three.
* ch-valprint.c (chill_val_print):  Call chill_print_value_fields
to print Chill STRUCT values.
**** end-sanitize-chill ****

gdb/ChangeLog
gdb/ch-typeprint.c
gdb/ch-valprint.c

index 31094585638b521cd0b4fb2d8c7736a051d7056f..a6e209bb992f54b7be4485e632a4ad4800319810 100644 (file)
@@ -1,3 +1,21 @@
+Wed Feb 24 07:41:15 1993  Fred Fish  (fnf@cygnus.com)
+
+       **** start-sanitize-chill ****
+       * ch-typeprint.c (chill_print_type_base):  Name changed to
+       chill_type_print_base to match pattern for C and C++ names.
+       * ch-typeprint.c (chill_print_type):  Change "char" to "CHAR"
+       to be consistent with other usages.
+       * ch-typeprint.c (chill_type_print_base):  Add support for
+       printing Chill STRUCT types.
+       * ch-valprint.c:  Include values.h.
+       * ch-valprint.c (chill_print_value_fields):  New function and
+       prototype for printing Chill STRUCT values.
+       * ch-valprint.c (chill_val_print):  Fix call to val_print_string
+       that was being called with two args instead of three.
+       * ch-valprint.c (chill_val_print):  Call chill_print_value_fields
+       to print Chill STRUCT values.
+       **** end-sanitize-chill ****
+
 Tue Feb 23 18:58:11 1993  Mike Werner  (mtw@poseidon.cygnus.com)
 
        * configure.in: added testsuite to configdirs.
index f4119ca149a3c8136df340b239b77521ee5f8885..e016baf1943ff7da31ffa9df24b64a25b392d05e 100644 (file)
@@ -35,8 +35,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <string.h>
 #include <errno.h>
 
-void
-chill_print_type_base PARAMS ((struct type *, FILE *, int, int));
+static void
+chill_type_print_base PARAMS ((struct type *, FILE *, int, int));
 
 void
 chill_print_type (type, varstring, stream, show, level)
@@ -75,13 +75,13 @@ chill_print_type (type, varstring, stream, show, level)
        range_type = TYPE_FIELD_TYPE (type, 0);
        index_type = TYPE_TARGET_TYPE (range_type);
        high_bound = TYPE_FIELD_BITPOS (range_type, 1);
-        fputs_filtered ("char (", stream);
+        fputs_filtered ("CHAR (", stream);
        print_type_scalar (index_type, high_bound + 1, stream);
-       fputs_filtered (") ", stream);
+       fputs_filtered (")", stream);
        break;
 
       default:
-        chill_print_type_base (type, stream, show, level);
+        chill_type_print_base (type, stream, show, level);
        break;
     }
 }
@@ -98,13 +98,17 @@ chill_print_type (type, varstring, stream, show, level)
    LEVEL is the depth to indent by.
    We increase it for some recursive calls.  */
 
-void
-chill_print_type_base (type, stream, show, level)
+static void
+chill_type_print_base (type, stream, show, level)
      struct type *type;
      FILE *stream;
      int show;
      int level;
 {
+  char *name;
+  register int len;
+  register int i;
+
   QUIT;
 
   wrap_here ("    ");
@@ -130,7 +134,55 @@ chill_print_type_base (type, stream, show, level)
       case TYPE_CODE_MEMBER:
       case TYPE_CODE_REF:
       case TYPE_CODE_FUNC:
-        chill_print_type_base (TYPE_TARGET_TYPE (type), stream, show, level);
+        chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
+       break;
+
+      case TYPE_CODE_STRUCT:
+       fprintf_filtered (stream, "STRUCT ");
+       if ((name = type_name_no_tag (type)) != NULL)
+         {
+           fputs_filtered (name, stream);
+           fputs_filtered (" ", stream);
+           wrap_here ("    ");
+         }
+       if (show < 0)
+         {
+           fprintf_filtered (stream, "(...)");
+         }
+       else
+         {
+           check_stub_type (type);
+           fprintf_filtered (stream, "(\n");
+           if ((TYPE_NFIELDS (type) == 0) && (TYPE_NFN_FIELDS (type) == 0))
+             {
+               if (TYPE_FLAGS (type) & TYPE_FLAG_STUB)
+                 {
+                   fprintfi_filtered (level + 4, stream, "<incomplete type>\n");
+                 }
+               else
+                 {
+                   fprintfi_filtered (level + 4, stream, "<no data fields>\n");
+                 }
+             }
+           else
+             {
+               len = TYPE_NFIELDS (type);
+               for (i = TYPE_N_BASECLASSES (type); i < len; i++)
+                 {
+                   QUIT;
+                   print_spaces_filtered (level + 4, stream);
+                   chill_print_type (TYPE_FIELD_TYPE (type, i),
+                                     TYPE_FIELD_NAME (type, i),
+                                     stream, show - 1, level + 4);
+                   if (i < (len - 1))
+                     {
+                       fputs_filtered (",", stream);
+                     }
+                   fputs_filtered ("\n", stream);
+                 }
+             }
+           fprintfi_filtered (level, stream, ")");
+         }
        break;
 
       case TYPE_CODE_VOID:
@@ -139,9 +191,8 @@ chill_print_type_base (type, stream, show, level)
       case TYPE_CODE_RANGE:
       case TYPE_CODE_ENUM:
       case TYPE_CODE_UNION:
-      case TYPE_CODE_STRUCT:
       case TYPE_CODE_METHOD:
-       error ("missing language support in chill_print_type_base");
+       error ("missing language support in chill_type_print_base");
        break;
 
       default:
index 37730b4837ddfa8224fc786c65ec576284a3175c..40d1553f407cf0b1bf123837985aecf51f3cffa1 100644 (file)
@@ -23,8 +23,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "gdbtypes.h"
 #include "valprint.h"
 #include "expression.h"
+#include "value.h"
 #include "language.h"
 
+static void
+chill_print_value_fields PARAMS ((struct type *, char *, FILE *, int, int,
+                                 enum val_prettyprint, struct type **));
+
 \f
 /* Print data of type TYPE located at VALADDR (within GDB), which came from
    the inferior at address ADDRESS, onto stdio stream STREAM according to
@@ -164,7 +169,7 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
                In that case don't try to print the string.  */
          print_max < UINT_MAX)
          {
-           i = val_print_string (addr, stream);
+           i = val_print_string (addr, 0, stream);
          }
       /* Return number of characters printed, plus one for the
         terminating null if we have "reached the end".  */
@@ -188,10 +193,14 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
       return (i + (print_max && i != print_max));
       break;
 
+    case TYPE_CODE_STRUCT:
+      chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
+                               0);
+      break;
+
     case TYPE_CODE_MEMBER:
     case TYPE_CODE_REF:
     case TYPE_CODE_UNION:
-    case TYPE_CODE_STRUCT:
     case TYPE_CODE_ENUM:
     case TYPE_CODE_FUNC:
     case TYPE_CODE_VOID:
@@ -207,3 +216,83 @@ chill_val_print (type, valaddr, address, stream, format, deref_ref, recurse,
   fflush (stream);
   return (0);
 }
+
+/* Mutually recursive subroutines of cplus_print_value and c_val_print to
+   print out a structure's fields: cp_print_value_fields and cplus_print_value.
+
+   TYPE, VALADDR, STREAM, RECURSE, and PRETTY have the
+   same meanings as in cplus_print_value and c_val_print.
+
+   DONT_PRINT is an array of baseclass types that we
+   should not print, or zero if called from top level.  */
+
+static void
+chill_print_value_fields (type, valaddr, stream, format, recurse, pretty,
+                         dont_print)
+     struct type *type;
+     char *valaddr;
+     FILE *stream;
+     int format;
+     int recurse;
+     enum val_prettyprint pretty;
+     struct type **dont_print;
+{
+  int i, len;
+  int fields_seen = 0;
+
+  check_stub_type (type);
+
+  fprintf_filtered (stream, "(");
+  len = TYPE_NFIELDS (type);
+  if (len == 0)
+    {
+      fprintf_filtered (stream, "<No data fields>");
+    }
+  else
+    {
+      for (i = 0; i < len; i++)
+       {
+         if (fields_seen)
+           {
+             fprintf_filtered (stream, ", ");
+           }
+         fields_seen = 1;
+         if (pretty)
+           {
+             fprintf_filtered (stream, "\n");
+             print_spaces_filtered (2 + 2 * recurse, stream);
+           }
+         else 
+           {
+             wrap_here (n_spaces (2 + 2 * recurse));
+           }
+         fprint_symbol (stream, TYPE_FIELD_NAME (type, i));
+         fputs_filtered (" = ", stream);
+         if (TYPE_FIELD_PACKED (type, i))
+           {
+             value v;
+
+             /* Bitfields require special handling, especially due to byte
+                order problems.  */
+             v = value_from_longest (TYPE_FIELD_TYPE (type, i),
+                                     unpack_field_as_long (type, valaddr, i));
+
+             chill_val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0,
+                              stream, format, 0, recurse + 1, pretty);
+           }
+         else
+           {
+             chill_val_print (TYPE_FIELD_TYPE (type, i), 
+                              valaddr + TYPE_FIELD_BITPOS (type, i) / 8,
+                              0, stream, format, 0, recurse + 1, pretty);
+           }
+       }
+      if (pretty)
+       {
+         fprintf_filtered (stream, "\n");
+         print_spaces_filtered (2 * recurse, stream);
+       }
+    }
+  fprintf_filtered (stream, ")");
+}
+