* infrun.c (handle_inferior_event): Fixed typos in printf.
[platform/upstream/binutils.git] / gdb / f-valprint.c
index e4fcfc0..b83597c 100644 (file)
@@ -1,6 +1,8 @@
 /* Support for printing Fortran values for GDB, the GNU debugger.
-   Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003
+
+   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003, 2005, 2006
    Free Software Foundation, Inc.
+
    Contributed by Motorola.  Adapted from the C definitions by Farooq Butt
    (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
 
@@ -18,8 +20,8 @@
 
    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.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "gdb_string.h"
@@ -42,13 +44,6 @@ static int there_is_a_visible_common_named (char *);
 extern void _initialize_f_valprint (void);
 static void info_common_command (char *, int);
 static void list_all_visible_commons (char *);
-static void f77_print_array (struct type *, char *, CORE_ADDR,
-                            struct ui_file *, int, int, int,
-                            enum val_prettyprint);
-static void f77_print_array_1 (int, int, struct type *, char *,
-                              CORE_ADDR, struct ui_file *, int, int, int,
-                              enum val_prettyprint,
-                              int *elts);
 static void f77_create_arrayprint_offset_tbl (struct type *,
                                              struct ui_file *);
 static void f77_get_dynamic_length_of_aggregate (struct type *);
@@ -96,7 +91,7 @@ f77_get_dynamic_lowerbound (struct type *type, int *lower_bound)
       break;
 
     case BOUND_CANNOT_BE_DETERMINED:
-      error ("Lower bound may not be '*' in F77");
+      error (_("Lower bound may not be '*' in F77"));
       break;
 
     case BOUND_BY_REF_ON_STACK:
@@ -119,7 +114,7 @@ f77_get_dynamic_lowerbound (struct type *type, int *lower_bound)
     case BOUND_BY_REF_IN_REG:
     case BOUND_BY_VALUE_IN_REG:
     default:
-      error ("??? unhandled dynamic array bound type ???");
+      error (_("??? unhandled dynamic array bound type ???"));
       break;
     }
   return BOUND_FETCH_OK;
@@ -182,7 +177,7 @@ f77_get_dynamic_upperbound (struct type *type, int *upper_bound)
     case BOUND_BY_REF_IN_REG:
     case BOUND_BY_VALUE_IN_REG:
     default:
-      error ("??? unhandled dynamic array bound type ???");
+      error (_("??? unhandled dynamic array bound type ???"));
       break;
     }
   return BOUND_FETCH_OK;
@@ -213,11 +208,11 @@ f77_get_dynamic_length_of_aggregate (struct type *type)
   /* Recursion ends here, start setting up lengths.  */
   retcode = f77_get_dynamic_lowerbound (type, &lower_bound);
   if (retcode == BOUND_FETCH_ERROR)
-    error ("Cannot obtain valid array lower bound");
+    error (_("Cannot obtain valid array lower bound"));
 
   retcode = f77_get_dynamic_upperbound (type, &upper_bound);
   if (retcode == BOUND_FETCH_ERROR)
-    error ("Cannot obtain valid array upper bound");
+    error (_("Cannot obtain valid array upper bound"));
 
   /* Patch in a valid length value. */
 
@@ -245,11 +240,11 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
 
       retcode = f77_get_dynamic_upperbound (tmp_type, &upper);
       if (retcode == BOUND_FETCH_ERROR)
-       error ("Cannot obtain dynamic upper bound");
+       error (_("Cannot obtain dynamic upper bound"));
 
       retcode = f77_get_dynamic_lowerbound (tmp_type, &lower);
       if (retcode == BOUND_FETCH_ERROR)
-       error ("Cannot obtain dynamic lower bound");
+       error (_("Cannot obtain dynamic lower bound"));
 
       F77_DIM_SIZE (ndimen) = upper - lower + 1;
 
@@ -276,9 +271,11 @@ f77_create_arrayprint_offset_tbl (struct type *type, struct ui_file *stream)
 
 /* Actual function which prints out F77 arrays, Valaddr == address in 
    the superior.  Address == the address in the inferior.  */
+
 static void
-f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
-                  CORE_ADDR address, struct ui_file *stream, int format,
+f77_print_array_1 (int nss, int ndimensions, struct type *type,
+                  const gdb_byte *valaddr, CORE_ADDR address,
+                  struct ui_file *stream, int format,
                   int deref_ref, int recurse, enum val_prettyprint pretty,
                   int *elts)
 {
@@ -295,13 +292,13 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
                             stream, format, deref_ref, recurse, pretty, elts);
          fprintf_filtered (stream, ") ");
        }
-      if (*elts >= print_max && i < F77_DIM_SIZE (nss)) {
+      if (*elts >= print_max && i < F77_DIM_SIZE (nss)) 
        fprintf_filtered (stream, "...");
-      }
     }
   else
     {
-      for (i = 0; (i < F77_DIM_SIZE (nss) && (*elts) < print_max); i++, (*elts)++)
+      for (i = 0; i < F77_DIM_SIZE (nss) && (*elts) < print_max; 
+          i++, (*elts)++)
        {
          val_print (TYPE_TARGET_TYPE (type),
                     valaddr + i * F77_DIM_OFFSET (ndimensions),
@@ -312,7 +309,7 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
          if (i != (F77_DIM_SIZE (nss) - 1))
            fprintf_filtered (stream, ", ");
 
-         if ((( *elts) == print_max - 1) && (i != (F77_DIM_SIZE (nss) - 1)))
+         if ((*elts == print_max - 1) && (i != (F77_DIM_SIZE (nss) - 1)))
            fprintf_filtered (stream, "...");
        }
     }
@@ -322,8 +319,9 @@ f77_print_array_1 (int nss, int ndimensions, struct type *type, char *valaddr,
    stuff and then immediately call f77_print_array_1() */
 
 static void
-f77_print_array (struct type *type, char *valaddr, CORE_ADDR address,
-                struct ui_file *stream, int format, int deref_ref, int recurse,
+f77_print_array (struct type *type, const gdb_byte *valaddr,
+                CORE_ADDR address, struct ui_file *stream,
+                int format, int deref_ref, int recurse,
                 enum val_prettyprint pretty)
 {
   int ndimensions;
@@ -332,7 +330,7 @@ f77_print_array (struct type *type, char *valaddr, CORE_ADDR address,
   ndimensions = calc_f77_array_dims (type);
 
   if (ndimensions > MAX_FORTRAN_DIMS || ndimensions < 0)
-    error ("Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)",
+    error (_("Type node corrupt! F77 arrays cannot have %d subscripts (%d Max)"),
           ndimensions, MAX_FORTRAN_DIMS);
 
   /* Since F77 arrays are stored column-major, we set up an 
@@ -360,7 +358,7 @@ f77_print_array (struct type *type, char *valaddr, CORE_ADDR address,
    The PRETTY parameter controls prettyprinting.  */
 
 int
-f_val_print (struct type *type, char *valaddr, int embedded_offset,
+f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
             CORE_ADDR address, struct ui_file *stream, int format,
             int deref_ref, int recurse, enum val_prettyprint pretty)
 {
@@ -368,6 +366,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
   struct type *elttype;
   LONGEST val;
   CORE_ADDR addr;
+  int index;
 
   CHECK_TYPEDEF (type);
   switch (TYPE_CODE (type))
@@ -383,11 +382,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
                       deref_ref, recurse, pretty);
       fprintf_filtered (stream, ")");
       break;
-#if 0
-      /* Array of unspecified length: treat like pointer to first elt.  */
-      valaddr = (char *) &address;
-      /* FALL THROUGH */
-#endif
+
     case TYPE_CODE_PTR:
       if (format && format != 's')
        {
@@ -408,7 +403,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
            }
 
          if (addressprint && format != 's')
-           fprintf_filtered (stream, "0x%s", paddr_nz (addr));
+           deprecated_print_address_numeric (addr, 1, stream);
 
          /* For a pointer to char or unsigned char, also print the string
             pointed to, unless pointer is null.  */
@@ -418,9 +413,39 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
              && addr != 0)
            i = val_print_string (addr, -1, TYPE_LENGTH (elttype), stream);
 
-         /* Return number of characters printed, plus one for the
-            terminating null if we have "reached the end".  */
-         return (i + (print_max && i != print_max));
+         /* Return number of characters printed, including the terminating
+            '\0' if we reached the end.  val_print_string takes care including
+            the terminating '\0' if necessary.  */
+         return i;
+       }
+      break;
+
+    case TYPE_CODE_REF:
+      elttype = check_typedef (TYPE_TARGET_TYPE (type));
+      if (addressprint)
+       {
+         CORE_ADDR addr
+           = extract_typed_address (valaddr + embedded_offset, type);
+         fprintf_filtered (stream, "@");
+         deprecated_print_address_numeric (addr, 1, stream);
+         if (deref_ref)
+           fputs_filtered (": ", stream);
+       }
+      /* De-reference the reference.  */
+      if (deref_ref)
+       {
+         if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
+           {
+             struct value *deref_val =
+             value_at
+             (TYPE_TARGET_TYPE (type),
+              unpack_pointer (lookup_pointer_type (builtin_type_void),
+                              valaddr + embedded_offset));
+             common_val_print (deref_val, stream, format, deref_ref, recurse,
+                               pretty);
+           }
+         else
+           fputs_filtered ("???", stream);
        }
       break;
 
@@ -459,6 +484,13 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
        }
       break;
 
+    case TYPE_CODE_FLAGS:
+      if (format)
+         print_scalar_formatted (valaddr, type, format, 0, stream);
+      else
+       val_print_type_code_flags (type, valaddr, stream);
+      break;
+
     case TYPE_CODE_FLT:
       if (format)
        print_scalar_formatted (valaddr, type, format, 0, stream);
@@ -501,7 +533,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
              break;
 
            default:
-             error ("Logicals of length %d bytes not supported",
+             error (_("Logicals of length %d bytes not supported"),
                     TYPE_LENGTH (type));
 
            }
@@ -536,7 +568,7 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
          type = builtin_type_f_real_s16;
          break;
        default:
-         error ("Cannot print out complex*%d variables", TYPE_LENGTH (type));
+         error (_("Cannot print out complex*%d variables"), TYPE_LENGTH (type));
        }
       fputs_filtered ("(", stream);
       print_floating (valaddr, type, stream);
@@ -552,8 +584,24 @@ f_val_print (struct type *type, char *valaddr, int embedded_offset,
       fprintf_filtered (stream, "<incomplete type>");
       break;
 
+    case TYPE_CODE_STRUCT:
+      /* Starting from the Fortran 90 standard, Fortran supports derived
+         types.  */
+      fprintf_filtered (stream, "{ ");
+      for (index = 0; index < TYPE_NFIELDS (type); index++)
+        {
+          int offset = TYPE_FIELD_BITPOS (type, index) / 8;
+          f_val_print (TYPE_FIELD_TYPE (type, index), valaddr + offset,
+                       embedded_offset, address, stream,
+                       format, deref_ref, recurse, pretty);
+          if (index != TYPE_NFIELDS (type) - 1)
+            fputs_filtered (", ", stream);
+        }
+      fprintf_filtered (stream, "}");
+      break;     
+
     default:
-      error ("Invalid F77 type code %d in symbol table.", TYPE_CODE (type));
+      error (_("Invalid F77 type code %d in symbol table."), TYPE_CODE (type));
     }
   gdb_flush (stream);
   return 0;
@@ -566,7 +614,7 @@ list_all_visible_commons (char *funname)
 
   tmp = head_common_list;
 
-  printf_filtered ("All COMMON blocks visible at this level:\n\n");
+  printf_filtered (_("All COMMON blocks visible at this level:\n\n"));
 
   while (tmp != NULL)
     {
@@ -598,7 +646,7 @@ info_common_command (char *comname, int from_tty)
   fi = deprecated_selected_frame;
 
   if (fi == NULL)
-    error ("No frame selected");
+    error (_("No frame selected"));
 
   /* The following is generally ripped off from stack.c's routine 
      print_frame_info() */
@@ -631,7 +679,7 @@ info_common_command (char *comname, int from_tty)
     }
   else
     {
-      register struct minimal_symbol *msymbol =
+      struct minimal_symbol *msymbol =
       lookup_minimal_symbol_by_pc (get_frame_pc (fi));
 
       if (msymbol != NULL)
@@ -652,9 +700,9 @@ info_common_command (char *comname, int from_tty)
   if (the_common)
     {
       if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0)
-       printf_filtered ("Contents of blank COMMON block:\n");
+       printf_filtered (_("Contents of blank COMMON block:\n"));
       else
-       printf_filtered ("Contents of F77 COMMON block '%s':\n", comname);
+       printf_filtered (_("Contents of F77 COMMON block '%s':\n"), comname);
 
       printf_filtered ("\n");
       entry = the_common->entries;
@@ -668,7 +716,7 @@ info_common_command (char *comname, int from_tty)
        }
     }
   else
-    printf_filtered ("Cannot locate the common block %s in function '%s'\n",
+    printf_filtered (_("Cannot locate the common block %s in function '%s'\n"),
                     comname, funname);
 }
 
@@ -685,12 +733,12 @@ there_is_a_visible_common_named (char *comname)
   struct symbol *func;
 
   if (comname == NULL)
-    error ("Cannot deal with NULL common name!");
+    error (_("Cannot deal with NULL common name!"));
 
   fi = deprecated_selected_frame;
 
   if (fi == NULL)
-    error ("No frame selected");
+    error (_("No frame selected"));
 
   /* The following is generally ripped off from stack.c's routine 
      print_frame_info() */
@@ -723,7 +771,7 @@ there_is_a_visible_common_named (char *comname)
     }
   else
     {
-      register struct minimal_symbol *msymbol =
+      struct minimal_symbol *msymbol =
       lookup_minimal_symbol_by_pc (fi->pc);
 
       if (msymbol != NULL)
@@ -740,8 +788,8 @@ void
 _initialize_f_valprint (void)
 {
   add_info ("common", info_common_command,
-           "Print out the values contained in a Fortran COMMON block.");
+           _("Print out the values contained in a Fortran COMMON block."));
   if (xdb_commands)
     add_com ("lc", class_info, info_common_command,
-            "Print out the values contained in a Fortran COMMON block.");
+            _("Print out the values contained in a Fortran COMMON block."));
 }