Fix gcc -Wall warnings. See ChangeLog for details.
[deliverable/binutils-gdb.git] / gdb / ch-typeprint.c
index cd3dd367d4a13ba8f0f41b322ff7c5df6ecdbc2a..a6b1944d3870f8886ec06a3d75a22792e0ad57a0 100644 (file)
@@ -15,7 +15,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "obstack.h"
@@ -31,49 +31,28 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "language.h"
 #include "demangle.h"
 #include "ch-lang.h"
+#include "typeprint.h"
 
-#include <string.h>
+#include "gdb_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 *, GDB_FILE *, int, int));
 
 void
 chill_print_type (type, varstring, stream, show, level)
      struct type *type;
      char *varstring;
-     FILE *stream;
+     GDB_FILE *stream;
      int show;
      int level;
 {
-  struct type *index_type;
-  struct type *range_type;
-  LONGEST low_bound;
-  LONGEST high_bound;
-
   if (varstring != NULL && *varstring != '\0')
     {
       fputs_filtered (varstring, stream);
       fputs_filtered (" ", stream);
     }
-  switch (TYPE_CODE (type))
-    {
-      case TYPE_CODE_ARRAY:
-       range_type = TYPE_FIELD_TYPE (type, 0);
-       index_type = TYPE_TARGET_TYPE (range_type);
-       low_bound = TYPE_FIELD_BITPOS (range_type, 0);
-       high_bound = TYPE_FIELD_BITPOS (range_type, 1);
-        fputs_filtered ("array (", stream);
-       print_type_scalar (index_type, low_bound, stream);
-       fputs_filtered (":", stream);
-       print_type_scalar (index_type, high_bound, stream);
-       fputs_filtered (") ", stream);
-       chill_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
-       break;
-      default:
-        chill_print_type_base (type, stream, show, level);
-       break;
-    }
+  chill_type_print_base (type, stream, show, level);
 }
 
 /* Print the name of the type (or the ultimate pointer target,
@@ -88,13 +67,20 @@ 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;
+     GDB_FILE *stream;
      int show;
      int level;
 {
+  register int len;
+  register int i;
+  struct type *index_type;
+  struct type *range_type;
+  LONGEST low_bound;
+  LONGEST high_bound;
+
   QUIT;
 
   wrap_here ("    ");
@@ -113,25 +99,230 @@ chill_print_type_base (type, stream, show, level)
       return;
     }
 
+  if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF)
+    CHECK_TYPEDEF (type);
+
   switch (TYPE_CODE (type))
     {
-      case TYPE_CODE_ARRAY:
+      case TYPE_CODE_TYPEDEF:
+        chill_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
+       break;
       case TYPE_CODE_PTR:
+       if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_VOID)
+         {
+           fprintf_filtered (stream,
+                             TYPE_NAME (type) ? TYPE_NAME (type) : "PTR");
+           break;
+         }
+       fprintf_filtered (stream, "REF ");
+       chill_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
+       break;
+
+      case TYPE_CODE_BOOL:
+       /* FIXME: we should probably just print the TYPE_NAME, in case
+          anyone ever fixes the compiler to give us the real names
+          in the presence of the chill equivalent of typedef (assuming
+          there is one).  */
+       fprintf_filtered (stream,
+                         TYPE_NAME (type) ? TYPE_NAME (type) : "BOOL");
+       break;
+
+      case TYPE_CODE_ARRAY:
+        fputs_filtered ("ARRAY (", stream);
+       range_type = TYPE_FIELD_TYPE (type, 0);
+       if (TYPE_CODE (range_type) != TYPE_CODE_RANGE)
+         chill_print_type (range_type, "", stream, 0, level);
+       else
+         {
+           index_type = TYPE_TARGET_TYPE (range_type);
+           low_bound = TYPE_FIELD_BITPOS (range_type, 0);
+           high_bound = TYPE_FIELD_BITPOS (range_type, 1);
+           print_type_scalar (index_type, low_bound, stream);
+           fputs_filtered (":", stream);
+           print_type_scalar (index_type, high_bound, stream);
+         }
+       fputs_filtered (") ", stream);
+       chill_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, level);
+       break;
+
+      case TYPE_CODE_BITSTRING:
+        fprintf_filtered (stream, "BOOLS (%d)",
+                         TYPE_FIELD_BITPOS (TYPE_FIELD_TYPE(type,0), 1) + 1);
+       break;
+
+      case TYPE_CODE_SET:
+        fputs_filtered ("POWERSET ", stream);
+       chill_print_type (TYPE_INDEX_TYPE (type), "", stream,
+                         show - 1, level);
+       break;
+
+      case TYPE_CODE_STRING:
+       range_type = TYPE_FIELD_TYPE (type, 0);
+       index_type = TYPE_TARGET_TYPE (range_type);
+       high_bound = TYPE_FIELD_BITPOS (range_type, 1);
+        fputs_filtered ("CHARS (", stream);
+       print_type_scalar (index_type, high_bound + 1, stream);
+       fputs_filtered (")", stream);
+       break;
+
       case TYPE_CODE_MEMBER:
+       fprintf_filtered (stream, "MEMBER ");
+        chill_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
+       break;
       case TYPE_CODE_REF:
+       fprintf_filtered (stream, "/*LOC*/ ");
+        chill_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
+       break;
       case TYPE_CODE_FUNC:
-        chill_print_type_base (TYPE_TARGET_TYPE (type), stream, show, level);
+       fprintf_filtered (stream, "PROC (");
+       len = TYPE_NFIELDS (type);
+       for (i = 0; i < len; i++)
+         {
+           struct type *param_type = TYPE_FIELD_TYPE (type, i);
+           if (i > 0)
+             {
+               fputs_filtered (", ", stream);
+               wrap_here ("    ");
+             }
+           if (TYPE_CODE (param_type) == TYPE_CODE_REF)
+             {
+               chill_type_print_base (TYPE_TARGET_TYPE (param_type),
+                                      stream, 0, level);
+               fputs_filtered (" LOC", stream);
+             }
+           else
+             chill_type_print_base (param_type, stream, show, level);
+         }
+       fprintf_filtered (stream, ")");
+       if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
+         {
+           fputs_filtered (" RETURNS (", stream);
+           chill_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
+           fputs_filtered (")", stream);
+         }
+       break;
+
+      case TYPE_CODE_STRUCT:
+       if (chill_varying_type (type))
+         {
+           chill_type_print_base (TYPE_FIELD_TYPE (type, 1),
+                                  stream, 0, level);
+           fputs_filtered (" VARYING", stream);
+         }
+       else
+         {
+           fprintf_filtered (stream, "STRUCT ");
+
+           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++)
+                 {
+                   struct type *field_type = TYPE_FIELD_TYPE (type, i);
+                   QUIT;
+                   print_spaces_filtered (level + 4, stream);
+                   if (TYPE_CODE (field_type) == TYPE_CODE_UNION)
+                     { int j; /* variant number */
+                       fputs_filtered ("CASE OF\n", stream);
+                       for (j = 0; j < TYPE_NFIELDS (field_type); j++)
+                         { int k; /* variant field index */
+                           struct type *variant_type
+                             = TYPE_FIELD_TYPE (field_type, j);
+                           int var_len = TYPE_NFIELDS (variant_type);
+                           print_spaces_filtered (level + 4, stream);
+                           if (strcmp (TYPE_FIELD_NAME (field_type, j),
+                                       "else") == 0)
+                             fputs_filtered ("ELSE\n", stream);
+                           else
+                             fputs_filtered (":\n", stream);
+                           if (TYPE_CODE (variant_type) != TYPE_CODE_STRUCT)
+                             error ("variant record confusion");
+                           for (k = 0; k < var_len; k++)
+                             {
+                               print_spaces_filtered (level + 8, stream);
+                               chill_print_type (TYPE_FIELD_TYPE (variant_type, k),
+                                                 TYPE_FIELD_NAME (variant_type, k),
+                                                 stream, show - 1, level + 8);
+                               if (k < (var_len - 1))
+                                 fputs_filtered (",", stream);
+                               fputs_filtered ("\n", stream);
+                             }
+                         }
+                       print_spaces_filtered (level + 4, stream);
+                       fputs_filtered ("ESAC", stream);
+                     }
+                   else
+                     chill_print_type (field_type,
+                                       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_RANGE:
+         {
+           struct type *target = TYPE_TARGET_TYPE (type);
+           if (target && TYPE_NAME (target))
+             fputs_filtered (TYPE_NAME (target), stream);
+           else
+             fputs_filtered ("RANGE", stream);
+           if (target == NULL)
+             target = builtin_type_long;
+           fputs_filtered (" (", stream);
+           print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
+           fputs_filtered (":", stream);
+           print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
+           fputs_filtered (")", stream);
+         }
+       break;
+
+      case TYPE_CODE_ENUM:
+       {
+         register int lastval = 0;
+         fprintf_filtered (stream, "SET (");
+         len = TYPE_NFIELDS (type);
+         for (i = 0; i < len; i++)
+           {
+             QUIT;
+             if (i) fprintf_filtered (stream, ", ");
+             wrap_here ("    ");
+             fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
+             if (lastval != TYPE_FIELD_BITPOS (type, i))
+               {
+                 fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
+                 lastval = TYPE_FIELD_BITPOS (type, i);
+               }
+             lastval++;
+           }
+         fprintf_filtered (stream, ")");
+       }
        break;
 
       case TYPE_CODE_VOID:
       case TYPE_CODE_UNDEF:
       case TYPE_CODE_ERROR:
-      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:
This page took 0.027165 seconds and 4 git commands to generate.