* c-typeprint.c (c_type_print_varspec_prefix,
[deliverable/binutils-gdb.git] / gdb / c-typeprint.c
index 31cb0c4eea74d40b7c164d1a48bf3a73ec2ad1c7..6d5a85a06d4458cb4d4a7392d5502785e73d54e0 100644 (file)
@@ -36,22 +36,20 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <string.h>
 #include <errno.h>
 
-extern int demangle;   /* whether to print C++ syms raw or source-form */
-
 static void
-c_type_print_args PARAMS ((struct type *, FILE *));
+c_type_print_args PARAMS ((struct type *, GDB_FILE *));
 
 static void
-c_type_print_varspec_suffix PARAMS ((struct type *, FILE *, int, int, int));
+c_type_print_varspec_suffix PARAMS ((struct type *, GDB_FILE *, int, int, int));
 
 static void
-cp_type_print_derivation_info PARAMS ((FILE *, struct type *));
+cp_type_print_derivation_info PARAMS ((GDB_FILE *, struct type *));
 
 void
-c_type_print_varspec_prefix PARAMS ((struct type *, FILE *, int, int));
+c_type_print_varspec_prefix PARAMS ((struct type *, GDB_FILE *, int, int));
 
 void
-c_type_print_base PARAMS ((struct type *, FILE *, int, int));
+c_type_print_base PARAMS ((struct type *, GDB_FILE *, int, int));
 
 \f
 /* Print a description of a type in the format of a 
@@ -62,7 +60,7 @@ void
 c_typedef_print (type, new, stream)
    struct type *type;
    struct symbol *new;
-   FILE *stream;
+   GDB_FILE *stream;
 {
    switch (current_language->la_language)
    {
@@ -89,7 +87,14 @@ c_typedef_print (type, new, stream)
 #endif
 #ifdef _LANG_chill
    case language_chill:
-      error ("Missing Chill support in function c_typedef_print."); /*FIXME*/
+      fprintf_filtered(stream, "SYNMODE ");
+      if(!TYPE_NAME(SYMBOL_TYPE(new)) ||
+        !STREQ (TYPE_NAME(SYMBOL_TYPE(new)), SYMBOL_NAME(new)))
+       fprintf_filtered(stream, "%s = ", SYMBOL_SOURCE_NAME(new));
+      else
+        fprintf_filtered(stream, "<builtin> = ");
+      type_print(type,"",stream,0);
+      break;
 #endif
    default:
       error("Language not supported.");
@@ -104,7 +109,7 @@ void
 c_print_type (type, varstring, stream, show, level)
      struct type *type;
      char *varstring;
-     FILE *stream;
+     GDB_FILE *stream;
      int show;
      int level;
 {
@@ -132,7 +137,7 @@ c_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 = strchr(varstring, '(') != NULL;
   c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
 
 }
@@ -145,7 +150,7 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream)
      char *prefix;
      char *varstring;
      int staticp;
-     FILE *stream;
+     GDB_FILE *stream;
 {
   int i;
 
@@ -199,7 +204,7 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream)
 
 static void
 cp_type_print_derivation_info (stream, type)
-     FILE *stream;
+     GDB_FILE *stream;
      struct type *type;
 {
   char *name;
@@ -231,7 +236,7 @@ cp_type_print_derivation_info (stream, type)
 void
 c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
      struct type *type;
-     FILE *stream;
+     GDB_FILE *stream;
      int show;
      int passed_a_ptr;
 {
@@ -266,7 +271,7 @@ c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
 
     case TYPE_CODE_METHOD:
       if (passed_a_ptr)
-       fprintf (stream, "(");
+       fprintf_unfiltered (stream, "(");
       c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
       if (passed_a_ptr)
        {
@@ -306,6 +311,10 @@ c_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_COMPLEX:
+    case TYPE_CODE_LITERAL_COMPLEX:
+    case TYPE_CODE_LITERAL_STRING:
       /* These types need no prefix.  They are listed here so that
         gcc -Wall will reveal any types that haven't been handled.  */
       break;
@@ -315,7 +324,7 @@ c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
 static void
 c_type_print_args (type, stream)
      struct type *type;
-     FILE *stream;
+     GDB_FILE *stream;
 {
   int i;
   struct type **args;
@@ -357,7 +366,7 @@ c_type_print_args (type, stream)
 static void
 c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
      struct type *type;
-     FILE *stream;
+     GDB_FILE *stream;
      int show;
      int passed_a_ptr;
      int demangled_args;
@@ -408,12 +417,12 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
       break;
 
     case TYPE_CODE_FUNC:
-      c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
-                                passed_a_ptr, 0);
       if (passed_a_ptr)
        fprintf_filtered (stream, ")");
       if (!demangled_args)
        fprintf_filtered (stream, "()");
+      c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
+                                  passed_a_ptr, 0);
       break;
 
     case TYPE_CODE_UNDEF:
@@ -429,6 +438,10 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
     case TYPE_CODE_SET:
     case TYPE_CODE_RANGE:
     case TYPE_CODE_STRING:
+    case TYPE_CODE_BITSTRING:
+    case TYPE_CODE_COMPLEX:
+    case TYPE_CODE_LITERAL_COMPLEX:
+    case TYPE_CODE_LITERAL_STRING:
       /* These types do not need a suffix.  They are listed so that
         gcc -Wall will report types that may not have been considered.  */
       break;
@@ -441,12 +454,12 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
 
    SHOW positive means print details about the type (e.g. enum values),
    and print structure elements passing SHOW - 1 for show.
-   SHOW zero means just print the type name or struct tag if there is one.
+   SHOW negative means just print the type name or struct tag if there is one.
    If there is no name, print something sensible but concise like
    "struct {...}".
-   SHOW negative means the same things as SHOW zero.  The difference is that
-   zero is used for printing structure elements and -1 is used for the
-   "whatis" command.  But I don't see any need to distinguish.
+   SHOW zero means just print the type name or struct tag if there is one.
+   If there is no name, print something sensible but not as concise like
+   "struct {int x; int y;}".
 
    LEVEL is the number of spaces to indent by.
    We increase it for some recursive calls.  */
@@ -454,7 +467,7 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
 void
 c_type_print_base (type, stream, show, level)
      struct type *type;
-     FILE *stream;
+     GDB_FILE *stream;
      int show;
      int level;
 {
@@ -486,6 +499,8 @@ c_type_print_base (type, stream, show, level)
       return;
     }
 
+  check_stub_type (type);
+         
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_ARRAY:
@@ -519,16 +534,14 @@ c_type_print_base (type, stream, show, level)
            fputs_filtered (" ", stream);
        }
       wrap_here ("    ");
-      if (show <= 0)
+      if (show < 0)
        {
          /* If we just printed a tag name, no need to print anything else.  */
          if (TYPE_TAG_NAME (type) == NULL)
            fprintf_filtered (stream, "{...}");
        }
-      else if (show > 0)
+      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
        {
-         check_stub_type (type);
-         
          cp_type_print_derivation_info (stream, type);
          
          fprintf_filtered (stream, "{\n");
@@ -663,7 +676,7 @@ c_type_print_base (type, stream, show, level)
                  if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
                    {
                      /* Keep GDB from crashing here.  */
-                     fprintf (stream, "<undefined type> %s;\n",
+                     fprintf_unfiltered (stream, "<undefined type> %s;\n",
                               TYPE_FN_FIELD_PHYSNAME (f, j));
                      break;
                    }
@@ -678,15 +691,24 @@ c_type_print_base (type, stream, show, level)
                      /* Build something we can demangle.  */
                      mangled_name = gdb_mangle_name (type, i, j);
                      demangled_name =
-                         cplus_demangle (mangled_name,
-                                         DMGL_ANSI | DMGL_PARAMS);
+                       cplus_demangle (mangled_name,
+                                       DMGL_ANSI | DMGL_PARAMS);
                      if (demangled_name == NULL)
                        fprintf_filtered (stream, "<badly mangled name %s>",
-                           mangled_name);
-                     else 
+                                         mangled_name);
+                     else
                        {
-                         fprintf_filtered (stream, "%s",
-                             strchr (demangled_name, ':') + 2);
+                         char *demangled_no_class =
+                           strchr (demangled_name, ':');
+
+                         if (demangled_no_class == NULL)
+                           demangled_no_class = demangled_name;
+                         else
+                           {
+                             if (*++demangled_no_class == ':')
+                               ++demangled_no_class;
+                           }
+                         fputs_filtered (demangled_no_class, stream);
                          free (demangled_name);
                        }
                      free (mangled_name);
@@ -719,13 +741,13 @@ c_type_print_base (type, stream, show, level)
        }
 
       wrap_here ("    ");
-      if (show <= 0)
+      if (show < 0)
        {
          /* If we just printed a tag name, no need to print anything else.  */
          if (TYPE_TAG_NAME (type) == NULL)
            fprintf_filtered (stream, "{...}");
        }
-      else if (show > 0)
+      else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
        {
          fprintf_filtered (stream, "{");
          len = TYPE_NFIELDS (type);
This page took 0.028319 seconds and 4 git commands to generate.