2000-03-22 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / f-typeprint.c
index 3540f48cb899af7035fbdd620fcdda3c2a8c88fa..db6e0017d6f89e3c975a39a5852b79d01e031620 100644 (file)
@@ -1,23 +1,24 @@
 /* Support for printing Fortran types for GDB, the GNU debugger.
-   Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
+   Copyright 1986, 1988, 1989, 1991, 1993, 1994, 2000 Free Software Foundation, Inc.
    Contributed by Motorola.  Adapted from the C version by Farooq Butt
    (fmbutt@engage.sps.mot.com).
 
-This file is part of GDB.
+   This file is part of GDB.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   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.  */
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "obstack.h"
@@ -34,28 +35,34 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "demangle.h"
 #include "f-lang.h"
 #include "typeprint.h"
-#include "frame.h"  /* ??? */
+#include "frame.h"             /* ??? */
 
-#include <string.h>
+#include "gdb_string.h"
 #include <errno.h>
 
-static void f_type_print_args PARAMS ((struct type *, FILE *));
+#if 0                          /* Currently unused */
+static void f_type_print_args (struct type *, struct ui_file *);
+#endif
 
-static void f_type_print_varspec_suffix PARAMS ((struct type *, FILE *,
-                                                int, int, int));
+static void print_equivalent_f77_float_type (struct type *,
+                                            struct ui_file *);
 
-void f_type_print_varspec_prefix PARAMS ((struct type *, FILE *, int, int));
+static void f_type_print_varspec_suffix (struct type *, struct ui_file *,
+                                        int, int, int);
 
-void f_type_print_base PARAMS ((struct type *, FILE *, int, int));
+void f_type_print_varspec_prefix (struct type *, struct ui_file *,
+                                 int, int);
 
+void f_type_print_base (struct type *, struct ui_file *, int, int);
 \f
+
 /* LEVEL is the depth to indent lines by.  */
 
 void
 f_print_type (type, varstring, stream, show, level)
      struct type *type;
      char *varstring;
-     FILE *stream;
+     struct ui_file *stream;
      int show;
      int level;
 {
@@ -66,8 +73,8 @@ f_print_type (type, varstring, stream, show, level)
   code = TYPE_CODE (type);
   if ((varstring != NULL && *varstring != '\0')
       ||
-      /* Need a space if going to print stars or brackets;
-        but not if we will print just a type name.  */
+  /* Need a space if going to print stars or brackets;
+     but not if we will print just a type name.  */
       ((show > 0 || TYPE_NAME (type) == 0)
        &&
        (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
@@ -83,7 +90,7 @@ f_print_type (type, varstring, stream, show, level)
   /* For demangled function names, we have the arglist as part of the name,
      so don't print an additional pair of ()'s */
 
-  demangled_args = varstring[strlen(varstring) - 1] == ')';
+  demangled_args = varstring[strlen (varstring) - 1] == ')';
   f_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
 }
 
@@ -98,11 +105,10 @@ f_print_type (type, varstring, stream, show, level)
 void
 f_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
      struct type *type;
-     FILE *stream;
+     struct ui_file *stream;
      int show;
      int passed_a_ptr;
 {
-  char *name;
   if (type == 0)
     return;
 
@@ -140,16 +146,24 @@ f_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
     case TYPE_CODE_SET:
     case TYPE_CODE_RANGE:
     case TYPE_CODE_STRING:
+    case TYPE_CODE_BITSTRING:
+    case TYPE_CODE_METHOD:
+    case TYPE_CODE_MEMBER:
+    case TYPE_CODE_REF:
+    case TYPE_CODE_COMPLEX:
+    case TYPE_CODE_TYPEDEF:
       /* These types need no prefix.  They are listed here so that
-        gcc -Wall will reveal any types that haven't been handled.  */
+         gcc -Wall will reveal any types that haven't been handled.  */
       break;
     }
 }
 
+#if 0                          /* Currently unused */
+
 static void
 f_type_print_args (type, stream)
      struct type *type;
-     FILE *stream;
+     struct ui_file *stream;
 {
   int i;
   struct type **args;
@@ -167,9 +181,9 @@ f_type_print_args (type, stream)
          for (i = 1; args[i] != NULL && args[i]->code != TYPE_CODE_VOID; i++)
            {
              f_print_type (args[i], "", stream, -1, 0);
-             if (args[i+1] == NULL)
+             if (args[i + 1] == NULL)
                fprintf_filtered (stream, "...");
-             else if (args[i+1]->code != TYPE_CODE_VOID)
+             else if (args[i + 1]->code != TYPE_CODE_VOID)
                {
                  fprintf_filtered (stream, ",");
                  wrap_here ("    ");
@@ -180,6 +194,8 @@ f_type_print_args (type, stream)
   fprintf_filtered (stream, ")");
 }
 
+#endif /* 0 */
+
 /* Print any array sizes, function arguments or close parentheses
    needed after the variable name (to describe its type).
    Args work like c_type_print_varspec_prefix.  */
@@ -187,13 +203,12 @@ f_type_print_args (type, stream)
 static void
 f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
      struct type *type;
-     FILE *stream;
+     struct ui_file *stream;
      int show;
      int passed_a_ptr;
      int demangled_args;
 {
-  CORE_ADDR current_frame_addr = 0;
-  int upper_bound,lower_bound;
+  int upper_bound, lower_bound;
   int lower_bound_was_default = 0;
   static int arrayprint_recurse_level = 0;
   int retcode;
@@ -212,57 +227,60 @@ f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
       arrayprint_recurse_level++;
 
       if (arrayprint_recurse_level == 1)
-       fprintf_filtered(stream,"(");
-      else
-       fprintf_filtered(stream,",");
+       fprintf_filtered (stream, "(");
 
-      retcode = f77_get_dynamic_lowerbound (type,&lower_bound);
+      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY)
+       f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
+
+      retcode = f77_get_dynamic_lowerbound (type, &lower_bound);
 
       lower_bound_was_default = 0;
 
       if (retcode == BOUND_FETCH_ERROR)
-       fprintf_filtered (stream,"???");
+       fprintf_filtered (stream, "???");
+      else if (lower_bound == 1)       /* The default */
+       lower_bound_was_default = 1;
       else
-       if (lower_bound == 1) /* The default */
-         lower_bound_was_default = 1;
-       else
-         fprintf_filtered (stream,"%d",lower_bound);
+       fprintf_filtered (stream, "%d", lower_bound);
 
       if (lower_bound_was_default)
        lower_bound_was_default = 0;
       else
-       fprintf_filtered(stream,":");
+       fprintf_filtered (stream, ":");
 
       /* Make sure that, if we have an assumed size array, we
-        print out a warning and print the upperbound as '*' */
+         print out a warning and print the upperbound as '*' */
 
-      if (TYPE_ARRAY_UPPER_BOUND_TYPE(type) == BOUND_CANNOT_BE_DETERMINED)
+      if (TYPE_ARRAY_UPPER_BOUND_TYPE (type) == BOUND_CANNOT_BE_DETERMINED)
        fprintf_filtered (stream, "*");
-       else
-        {
-          retcode = f77_get_dynamic_upperbound(type,&upper_bound);
+      else
+       {
+         retcode = f77_get_dynamic_upperbound (type, &upper_bound);
 
-          if (retcode == BOUND_FETCH_ERROR)
-            fprintf_filtered(stream,"???");
-          else
-            fprintf_filtered(stream,"%d",upper_bound);
-        }
+         if (retcode == BOUND_FETCH_ERROR)
+           fprintf_filtered (stream, "???");
+         else
+           fprintf_filtered (stream, "%d", upper_bound);
+       }
 
-      f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
+      if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY)
+       f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0);
       if (arrayprint_recurse_level == 1)
        fprintf_filtered (stream, ")");
+      else
+       fprintf_filtered (stream, ",");
       arrayprint_recurse_level--;
       break;
 
     case TYPE_CODE_PTR:
     case TYPE_CODE_REF:
       f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0);
-      fprintf_filtered(stream,")");
+      fprintf_filtered (stream, ")");
       break;
 
     case TYPE_CODE_FUNC:
       f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
-                                passed_a_ptr, 0);
+                                  passed_a_ptr, 0);
       if (passed_a_ptr)
        fprintf_filtered (stream, ")");
 
@@ -281,34 +299,28 @@ f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
     case TYPE_CODE_BOOL:
     case TYPE_CODE_SET:
     case TYPE_CODE_RANGE:
-    case TYPE_CODE_LITERAL_STRING:
     case TYPE_CODE_STRING:
+    case TYPE_CODE_BITSTRING:
+    case TYPE_CODE_METHOD:
+    case TYPE_CODE_MEMBER:
+    case TYPE_CODE_COMPLEX:
+    case TYPE_CODE_TYPEDEF:
       /* These types do not need a suffix.  They are listed so that
-        gcc -Wall will report types that may not have been considered.  */
+         gcc -Wall will report types that may not have been considered.  */
       break;
     }
 }
 
-
-void
+static void
 print_equivalent_f77_float_type (type, stream)
      struct type *type;
-     FILE *stream;
+     struct ui_file *stream;
 {
   /* Override type name "float" and make it the
      appropriate real. XLC stupidly outputs -12 as a type
      for real when it really should be outputting -18 */
 
-  switch (TYPE_LENGTH (type))
-    {
-    case 4:
-      fprintf_filtered (stream, "real*4");
-      break;
-
-    case 8:
-      fprintf_filtered(stream,"real*8");
-      break;
-    }
+  fprintf_filtered (stream, "real*%d", TYPE_LENGTH (type));
 }
 
 /* Print the name of the type (or the ultimate pointer target,
@@ -327,18 +339,13 @@ print_equivalent_f77_float_type (type, stream)
 void
 f_type_print_base (type, stream, show, level)
      struct type *type;
-     FILE *stream;
+     struct ui_file *stream;
      int show;
      int level;
 {
-  char *name;
-  register int i;
-  register int len;
-  register int lastval;
-  char *mangled_name;
-  char *demangled_name;
-  enum {s_none, s_public, s_private, s_protected} section_type;
-  int retcode,upper_bound;
+  int retcode;
+  int upper_bound;
+
   QUIT;
 
   wrap_here ("    ");
@@ -353,9 +360,6 @@ f_type_print_base (type, stream, show, level)
 
   if ((show <= 0) && (TYPE_NAME (type) != NULL))
     {
-      /* Damn builtin types on RS6000!  They call a float "float"
-         so we gotta translate to appropriate F77'isms */
-
       if (TYPE_CODE (type) == TYPE_CODE_FLT)
        print_equivalent_f77_float_type (type, stream);
       else
@@ -363,19 +367,23 @@ f_type_print_base (type, stream, show, level)
       return;
     }
 
+  if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF)
+    CHECK_TYPEDEF (type);
+
   switch (TYPE_CODE (type))
     {
-    case TYPE_CODE_ARRAY:
-      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
+    case TYPE_CODE_TYPEDEF:
+      f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
       break;
 
+    case TYPE_CODE_ARRAY:
     case TYPE_CODE_FUNC:
       f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
       break;
 
-   case TYPE_CODE_PTR:
+    case TYPE_CODE_PTR:
       fprintf_filtered (stream, "PTR TO -> ( ");
-      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
+      f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
       break;
 
     case TYPE_CODE_VOID:
@@ -405,49 +413,42 @@ f_type_print_base (type, stream, show, level)
          through as TYPE_CODE_INT since dbxstclass.h is so
          C-oriented, we must change these to "character" from "char".  */
 
-      if (STREQ(TYPE_NAME(type),"char"))
-       fprintf_filtered (stream,"character");
+      if (STREQ (TYPE_NAME (type), "char"))
+       fprintf_filtered (stream, "character");
       else
        goto default_case;
       break;
 
     case TYPE_CODE_COMPLEX:
-    case TYPE_CODE_LITERAL_COMPLEX:
-      fprintf_filtered (stream,"complex*");
-      fprintf_filtered (stream,"%d",TYPE_LENGTH(type));
+      fprintf_filtered (stream, "complex*%d", TYPE_LENGTH (type));
       break;
 
     case TYPE_CODE_FLT:
-      print_equivalent_f77_float_type(type,stream);
+      print_equivalent_f77_float_type (type, stream);
       break;
 
-    case TYPE_CODE_LITERAL_STRING:
-       fprintf_filtered (stream, "character*%d",
-                        TYPE_ARRAY_UPPER_BOUND_VALUE (type));
-       break;
-
     case TYPE_CODE_STRING:
-      /* Strings may have dynamic upperbounds (lengths) like arrays */
+      /* Strings may have dynamic upperbounds (lengths) like arrays. */
 
       if (TYPE_ARRAY_UPPER_BOUND_TYPE (type) == BOUND_CANNOT_BE_DETERMINED)
-       fprintf_filtered("character*(*)");
+       fprintf_filtered (stream, "character*(*)");
       else
        {
-         retcode = f77_get_dynamic_upperbound(type,&upper_bound);
+         retcode = f77_get_dynamic_upperbound (type, &upper_bound);
 
          if (retcode == BOUND_FETCH_ERROR)
-           fprintf_filtered(stream,"character*???");
+           fprintf_filtered (stream, "character*???");
          else
-           fprintf_filtered(stream,"character*%d",upper_bound);
+           fprintf_filtered (stream, "character*%d", upper_bound);
        }
       break;
 
     default_case:
     default:
       /* Handle types not explicitly handled by the other cases,
-        such as fundamental types.  For these, just print whatever
-        the type name is, as recorded in the type itself.  If there
-        is no type name, then complain. */
+         such as fundamental types.  For these, just print whatever
+         the type name is, as recorded in the type itself.  If there
+         is no type name, then complain. */
       if (TYPE_NAME (type) != NULL)
        fputs_filtered (TYPE_NAME (type), stream);
       else
This page took 0.029846 seconds and 4 git commands to generate.