2011-02-28 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / typeprint.c
index edf87cd2cd512b36095d7a0b3cccd52b08a0b54d..03e633241c3b6011969e87ca406658ff6dd93336 100644 (file)
@@ -1,7 +1,8 @@
 /* Language independent support for printing types for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1998, 1999,
-   2000, 2001, 2003, 2006, 2007, 2008 Free Software Foundation, Inc.
+   2000, 2001, 2003, 2006, 2007, 2008, 2009, 2010, 2011
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -33,6 +34,7 @@
 #include "cp-abi.h"
 #include "typeprint.h"
 #include "gdb_string.h"
+#include "exceptions.h"
 #include "valprint.h"
 #include <errno.h>
 
@@ -47,7 +49,7 @@ static void whatis_exp (char *, int);
 
 /* Print a description of a type in the format of a 
    typedef for the current language.
-   NEW is the new name for a type TYPE. */
+   NEW is the new name for a type TYPE.  */
 
 void
 typedef_print (struct type *type, struct symbol *new, struct ui_file *stream)
@@ -78,6 +80,33 @@ type_print (struct type *type, char *varstring, struct ui_file *stream,
   LA_PRINT_TYPE (type, varstring, stream, show, 0);
 }
 
+/* Print TYPE to a string, returning it.  The caller is responsible for
+   freeing the string.  */
+
+char *
+type_to_string (struct type *type)
+{
+  char *s = NULL;
+  struct ui_file *stb;
+  struct cleanup *old_chain;
+  volatile struct gdb_exception except;
+
+  stb = mem_fileopen ();
+  old_chain = make_cleanup_ui_file_delete (stb);
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      type_print (type, "", stb, -1);
+      s = ui_file_xstrdup (stb, NULL);
+    }
+  if (except.reason < 0)
+    s = NULL;
+
+  do_cleanups (old_chain);
+
+  return s;
+}
+
 /* Print type of EXP, or last thing in value history if EXP == NULL.
    show is passed to type_print.  */
 
@@ -207,7 +236,7 @@ print_type_scalar (struct type *type, LONGEST val, struct ui_file *stream)
       break;
 
     case TYPE_CODE_CHAR:
-      LA_PRINT_CHAR ((unsigned char) val, stream);
+      LA_PRINT_CHAR ((unsigned char) val, type, stream);
       break;
 
     case TYPE_CODE_BOOL:
@@ -261,13 +290,13 @@ maintenance_print_type (char *typename, int from_tty)
       old_chain = make_cleanup (free_current_contents, &expr);
       if (expr->elts[0].opcode == OP_TYPE)
        {
-         /* The user expression names a type directly, just use that type. */
+         /* The user expression names a type directly, just use that type.  */
          type = expr->elts[1].type;
        }
       else
        {
          /* The user expression may name a type indirectly by naming an
-            object of that type.  Find that indirectly named type. */
+            object of that type.  Find that indirectly named type.  */
          val = evaluate_type (expr);
          type = value_type (val);
        }
This page took 0.034729 seconds and 4 git commands to generate.