* linux-thread-db.c (thread_db_mourn_inferior): Remove breakpoints
[deliverable/binutils-gdb.git] / gdb / utils.c
index 690158b588b63c9c06c69af2efe97bbd9b098f4f..eb870ac92efaecf518641c0b726db2e41eb58cc2 100644 (file)
@@ -1,6 +1,6 @@
 /* General utility routines for GDB, the GNU debugger.
 
-   Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free
    Software Foundation, Inc.
 
@@ -18,8 +18,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_assert.h"
@@ -80,7 +80,7 @@ void (*deprecated_error_begin_hook) (void);
 /* Prototypes for local functions */
 
 static void vfprintf_maybe_filtered (struct ui_file *, const char *,
-                                    va_list, int);
+                                    va_list, int) ATTR_FORMAT (printf, 2, 0);
 
 static void fputs_maybe_filtered (const char *, struct ui_file *, int);
 
@@ -693,7 +693,7 @@ struct internal_problem
    has been reported, and assuming GDB didn't quit, the caller can
    either allow execution to resume or throw an error.  */
 
-static void
+static void ATTR_FORMAT (printf, 4, 0)
 internal_vproblem (struct internal_problem *problem,
                   const char *file, int line, const char *fmt, va_list ap)
 {
@@ -789,8 +789,10 @@ further debugging may prove unreliable.", file, line, problem->name, msg);
     {
       if (dump_core_p)
        {
+#ifdef HAVE_WORKING_FORK
          if (fork () == 0)
            abort ();           /* NOTE: GDB has only three calls to abort().  */
+#endif
        }
     }
 
@@ -844,12 +846,12 @@ char *
 safe_strerror (int errnum)
 {
   char *msg;
-  static char buf[32];
 
   msg = strerror (errnum);
   if (msg == NULL)
     {
-      sprintf (buf, "(undocumented errno %d)", errnum);
+      static char buf[32];
+      xsnprintf (buf, sizeof buf, "(undocumented errno %d)", errnum);
       msg = buf;
     }
   return (msg);
@@ -1077,6 +1079,20 @@ xstrvprintf (const char *format, va_list ap)
   return ret;
 }
 
+int
+xsnprintf (char *str, size_t size, const char *format, ...)
+{
+  va_list args;
+  int ret;
+
+  va_start (args, format);
+  ret = vsnprintf (str, size, format, args);
+  gdb_assert (ret < size);
+  va_end (args);
+
+  return ret;
+}
+
 /* My replacement for the read system call.
    Used like `read' but keeps going if `read' returns too soon.  */
 
@@ -1220,7 +1236,7 @@ query (const char *ctlstr, ...)
    ARGS are the arguments passed along with the CTLSTR argument to
    printf.  */
 
-static int
+static int ATTR_FORMAT (printf, 1, 0)
 defaulted_query (const char *ctlstr, const char defchar, va_list args)
 {
   int answer;
@@ -1479,8 +1495,8 @@ parse_escape (char **string_ptr)
 
 static void
 printchar (int c, void (*do_fputs) (const char *, struct ui_file *),
-          void (*do_fprintf) (struct ui_file *, const char *, ...),
-          struct ui_file *stream, int quoter)
+          void (*do_fprintf) (struct ui_file *, const char *, ...)
+          ATTRIBUTE_FPTR_PRINTF_2, struct ui_file *stream, int quoter)
 {
 
   c &= 0xFF;                   /* Avoid sign bit follies */
@@ -2604,12 +2620,14 @@ paddress (CORE_ADDR addr)
   return hex_string (addr);
 }
 
-static void
-decimal2str (char *paddr_str, char *sign, ULONGEST addr, int width)
+static char *
+decimal2str (char *sign, ULONGEST addr, int width)
 {
-  /* steal code from valprint.c:print_decimal().  Should this worry
+  /* Steal code from valprint.c:print_decimal().  Should this worry
      about the real size of addr as the above does? */
   unsigned long temp[3];
+  char *str = get_cell ();
+
   int i = 0;
   do
     {
@@ -2619,31 +2637,38 @@ decimal2str (char *paddr_str, char *sign, ULONGEST addr, int width)
       width -= 9;
     }
   while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0])));
+
   width += 9;
   if (width < 0)
     width = 0;
+
   switch (i)
     {
     case 1:
-      sprintf (paddr_str, "%s%0*lu", sign, width, temp[0]);
+      xsnprintf (str, CELLSIZE, "%s%0*lu", sign, width, temp[0]);
       break;
     case 2:
-      sprintf (paddr_str, "%s%0*lu%09lu", sign, width, temp[1], temp[0]);
+      xsnprintf (str, CELLSIZE, "%s%0*lu%09lu", sign, width,
+                temp[1], temp[0]);
       break;
     case 3:
-      sprintf (paddr_str, "%s%0*lu%09lu%09lu", sign, width,
-              temp[2], temp[1], temp[0]);
+      xsnprintf (str, CELLSIZE, "%s%0*lu%09lu%09lu", sign, width,
+                temp[2], temp[1], temp[0]);
       break;
     default:
       internal_error (__FILE__, __LINE__,
                      _("failed internal consistency check"));
     }
+
+  return str;
 }
 
-static void
-octal2str (char *paddr_str, ULONGEST addr, int width)
+static char *
+octal2str (ULONGEST addr, int width)
 {
   unsigned long temp[3];
+  char *str = get_cell ();
+
   int i = 0;
   do
     {
@@ -2653,76 +2678,78 @@ octal2str (char *paddr_str, ULONGEST addr, int width)
       width -= 10;
     }
   while (addr != 0 && i < (sizeof (temp) / sizeof (temp[0])));
+
   width += 10;
   if (width < 0)
     width = 0;
+
   switch (i)
     {
     case 1:
       if (temp[0] == 0)
-       sprintf (paddr_str, "%*o", width, 0);
+       xsnprintf (str, CELLSIZE, "%*o", width, 0);
       else
-       sprintf (paddr_str, "0%0*lo", width, temp[0]);
+       xsnprintf (str, CELLSIZE, "0%0*lo", width, temp[0]);
       break;
     case 2:
-      sprintf (paddr_str, "0%0*lo%010lo", width, temp[1], temp[0]);
+      xsnprintf (str, CELLSIZE, "0%0*lo%010lo", width, temp[1], temp[0]);
       break;
     case 3:
-      sprintf (paddr_str, "0%0*lo%010lo%010lo", width,
-              temp[2], temp[1], temp[0]);
+      xsnprintf (str, CELLSIZE, "0%0*lo%010lo%010lo", width,
+                temp[2], temp[1], temp[0]);
       break;
     default:
       internal_error (__FILE__, __LINE__,
                      _("failed internal consistency check"));
     }
+
+  return str;
 }
 
 char *
 paddr_u (CORE_ADDR addr)
 {
-  char *paddr_str = get_cell ();
-  decimal2str (paddr_str, "", addr, 0);
-  return paddr_str;
+  return decimal2str ("", addr, 0);
 }
 
 char *
 paddr_d (LONGEST addr)
 {
-  char *paddr_str = get_cell ();
   if (addr < 0)
-    decimal2str (paddr_str, "-", -addr, 0);
+    return decimal2str ("-", -addr, 0);
   else
-    decimal2str (paddr_str, "", addr, 0);
-  return paddr_str;
+    return decimal2str ("", addr, 0);
 }
 
-/* eliminate warning from compiler on 32-bit systems */
+/* Eliminate warning from compiler on 32-bit systems.  */
 static int thirty_two = 32;
 
 char *
 phex (ULONGEST l, int sizeof_l)
 {
   char *str;
+
   switch (sizeof_l)
     {
     case 8:
       str = get_cell ();
-      sprintf (str, "%08lx%08lx",
-              (unsigned long) (l >> thirty_two),
-              (unsigned long) (l & 0xffffffff));
+      xsnprintf (str, CELLSIZE, "%08lx%08lx",
+                (unsigned long) (l >> thirty_two),
+                (unsigned long) (l & 0xffffffff));
       break;
     case 4:
       str = get_cell ();
-      sprintf (str, "%08lx", (unsigned long) l);
+      xsnprintf (str, CELLSIZE, "%08lx", (unsigned long) l);
       break;
     case 2:
       str = get_cell ();
-      sprintf (str, "%04x", (unsigned short) (l & 0xffff));
+      xsnprintf (str, CELLSIZE, "%04x", (unsigned short) (l & 0xffff));
       break;
     default:
       str = phex (l, sizeof (l));
       break;
     }
+
   return str;
 }
 
@@ -2730,6 +2757,7 @@ char *
 phex_nz (ULONGEST l, int sizeof_l)
 {
   char *str;
+
   switch (sizeof_l)
     {
     case 8:
@@ -2737,23 +2765,26 @@ phex_nz (ULONGEST l, int sizeof_l)
        unsigned long high = (unsigned long) (l >> thirty_two);
        str = get_cell ();
        if (high == 0)
-         sprintf (str, "%lx", (unsigned long) (l & 0xffffffff));
+         xsnprintf (str, CELLSIZE, "%lx",
+                    (unsigned long) (l & 0xffffffff));
        else
-         sprintf (str, "%lx%08lx", high, (unsigned long) (l & 0xffffffff));
+         xsnprintf (str, CELLSIZE, "%lx%08lx", high,
+                    (unsigned long) (l & 0xffffffff));
        break;
       }
     case 4:
       str = get_cell ();
-      sprintf (str, "%lx", (unsigned long) l);
+      xsnprintf (str, CELLSIZE, "%lx", (unsigned long) l);
       break;
     case 2:
       str = get_cell ();
-      sprintf (str, "%x", (unsigned short) (l & 0xffff));
+      xsnprintf (str, CELLSIZE, "%x", (unsigned short) (l & 0xffff));
       break;
     default:
       str = phex_nz (l, sizeof (l));
       break;
     }
+
   return str;
 }
 
@@ -2763,7 +2794,7 @@ char *
 hex_string (LONGEST num)
 {
   char *result = get_cell ();
-  snprintf (result, CELLSIZE, "0x%s", phex_nz (num, sizeof (num)));
+  xsnprintf (result, CELLSIZE, "0x%s", phex_nz (num, sizeof (num)));
   return result;
 }
 
@@ -2817,17 +2848,14 @@ int_string (LONGEST val, int radix, int is_signed, int width,
       }
     case 10:
       {
-       char *result = get_cell ();
        if (is_signed && val < 0)
-         decimal2str (result, "-", -val, width);
+         return decimal2str ("-", -val, width);
        else
-         decimal2str (result, "", val, width);
-       return result;
+         return decimal2str ("", val, width);
       }
     case 8:
       {
-       char *result = get_cell ();
-       octal2str (result, val, width);
+       char *result = octal2str (val, width);
        if (use_c_format || val == 0)
          return result;
        else
@@ -3002,9 +3030,9 @@ xfullpath (const char *filename)
      directory separator, avoid doubling it.  */
   real_path = gdb_realpath (dir_name);
   if (IS_DIR_SEPARATOR (real_path[strlen (real_path) - 1]))
-    result = concat (real_path, base_name, NULL);
+    result = concat (real_path, base_name, (char *)NULL);
   else
-    result = concat (real_path, SLASH_STRING, base_name, NULL);
+    result = concat (real_path, SLASH_STRING, base_name, (char *)NULL);
 
   xfree (real_path);
   return result;
This page took 0.028012 seconds and 4 git commands to generate.