2000-12-19 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / utils.c
index 596c0aee3b99bdc1b3de617a97054ef52053bb16..2ebe1692c5004bfce78c1d6a3fcb46bdcd178428 100644 (file)
@@ -1,5 +1,6 @@
 /* General utility routines for GDB, the GNU debugger.
-   Copyright 1986, 89, 90, 91, 92, 95, 96, 1998 Free Software Foundation, Inc.
+   Copyright 1986, 1989, 1990-1992, 1995, 1996, 1998, 2000
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include <term.h>
 #endif
 
+#ifdef __GO32__
+#include <pc.h>
+#endif
+
 /* SunOS's curses.h has a '#define reg register' in it.  Thank you Sun. */
 #ifdef reg
 #undef reg
@@ -45,6 +50,8 @@
 #include "language.h"
 #include "annotate.h"
 
+#include "inferior.h" /* for signed_pointer_to_address */
+
 #include <readline/readline.h>
 
 #undef XMALLOC
 /* readline defines this.  */
 #undef savestring
 
-void (*error_begin_hook) PARAMS ((void));
+void (*error_begin_hook) (void);
 
 /* Holds the last error message issued by gdb */
 
-static GDB_FILE *gdb_lasterr;
+static struct ui_file *gdb_lasterr;
 
 /* Prototypes for local functions */
 
-static void vfprintf_maybe_filtered PARAMS ((GDB_FILE *, const char *,
-                                            va_list, int));
+static void vfprintf_maybe_filtered (struct ui_file *, const char *,
+                                    va_list, int);
 
-static void fputs_maybe_filtered PARAMS ((const char *, GDB_FILE *, int));
+static void fputs_maybe_filtered (const char *, struct ui_file *, int);
 
 #if defined (USE_MMALLOC) && !defined (NO_MMCHECK)
-static void malloc_botch PARAMS ((void));
+static void malloc_botch (void);
 #endif
 
-static void
-prompt_for_continue PARAMS ((void));
+static void prompt_for_continue (void);
 
-static void
-set_width_command PARAMS ((char *, int, struct cmd_list_element *));
+static void set_width_command (char *, int, struct cmd_list_element *);
 
-static void
-set_width PARAMS ((void));
-
-#ifndef GDB_FILE_ISATTY
-#define GDB_FILE_ISATTY(GDB_FILE_PTR)   (gdb_file_isatty(GDB_FILE_PTR))
-#endif
+static void set_width (void);
 
 /* Chain of cleanup actions established with make_cleanup,
    to be executed if an error happens.  */
@@ -159,76 +159,87 @@ int pagination_enabled = 1;
    Args are FUNCTION to clean up with, and ARG to pass to it.  */
 
 struct cleanup *
-make_cleanup (function, arg)
-     void (*function) PARAMS ((PTR));
-     PTR arg;
+make_cleanup (make_cleanup_ftype *function, void *arg)
 {
   return make_my_cleanup (&cleanup_chain, function, arg);
 }
 
 struct cleanup *
-make_final_cleanup (function, arg)
-     void (*function) PARAMS ((PTR));
-     PTR arg;
+make_final_cleanup (make_cleanup_ftype *function, void *arg)
 {
   return make_my_cleanup (&final_cleanup_chain, function, arg);
 }
 
 struct cleanup *
-make_run_cleanup (function, arg)
-     void (*function) PARAMS ((PTR));
-     PTR arg;
+make_run_cleanup (make_cleanup_ftype *function, void *arg)
 {
   return make_my_cleanup (&run_cleanup_chain, function, arg);
 }
 
 struct cleanup *
-make_exec_cleanup (function, arg)
-     void (*function) PARAMS ((PTR));
-     PTR arg;
+make_exec_cleanup (make_cleanup_ftype *function, void *arg)
 {
   return make_my_cleanup (&exec_cleanup_chain, function, arg);
 }
 
 struct cleanup *
-make_exec_error_cleanup (function, arg)
-     void (*function) PARAMS ((PTR));
-     PTR arg;
+make_exec_error_cleanup (make_cleanup_ftype *function, void *arg)
 {
   return make_my_cleanup (&exec_error_cleanup_chain, function, arg);
 }
 
 static void
-do_freeargv (arg)
-     void *arg;
+do_freeargv (void *arg)
 {
   freeargv ((char **) arg);
 }
 
 struct cleanup *
-make_cleanup_freeargv (arg)
-     char **arg;
+make_cleanup_freeargv (char **arg)
 {
   return make_my_cleanup (&cleanup_chain, do_freeargv, arg);
 }
 
 static void
-do_gdb_file_delete (void *arg)
+do_bfd_close_cleanup (void *arg)
+{
+  bfd_close (arg);
+}
+
+struct cleanup *
+make_cleanup_bfd_close (bfd *abfd)
+{
+  return make_cleanup (do_bfd_close_cleanup, abfd);
+}
+
+static void
+do_close_cleanup (void *arg)
 {
-  gdb_file_delete (arg);
+  close ((int) arg);
 }
 
 struct cleanup *
-make_cleanup_gdb_file_delete (struct gdb_file *arg)
+make_cleanup_close (int fd)
+{
+  /* int into void*. Outch!! */
+  return make_cleanup (do_close_cleanup, (void *) fd);
+}
+
+static void
+do_ui_file_delete (void *arg)
 {
-  return make_my_cleanup (&cleanup_chain, do_gdb_file_delete, arg);
+  ui_file_delete (arg);
 }
 
 struct cleanup *
-make_my_cleanup (pmy_chain, function, arg)
-     struct cleanup **pmy_chain;
-     void (*function) PARAMS ((PTR));
-     PTR arg;
+make_cleanup_ui_file_delete (struct ui_file *arg)
+{
+  return make_my_cleanup (&cleanup_chain, do_ui_file_delete, arg);
+}
+
+struct cleanup *
+make_my_cleanup (struct cleanup **pmy_chain, make_cleanup_ftype *function,
+                void *arg)
 {
   register struct cleanup *new
   = (struct cleanup *) xmalloc (sizeof (struct cleanup));
@@ -246,51 +257,45 @@ make_my_cleanup (pmy_chain, function, arg)
    until we get back to the point OLD_CHAIN in the cleanup_chain.  */
 
 void
-do_cleanups (old_chain)
-     register struct cleanup *old_chain;
+do_cleanups (register struct cleanup *old_chain)
 {
   do_my_cleanups (&cleanup_chain, old_chain);
 }
 
 void
-do_final_cleanups (old_chain)
-     register struct cleanup *old_chain;
+do_final_cleanups (register struct cleanup *old_chain)
 {
   do_my_cleanups (&final_cleanup_chain, old_chain);
 }
 
 void
-do_run_cleanups (old_chain)
-     register struct cleanup *old_chain;
+do_run_cleanups (register struct cleanup *old_chain)
 {
   do_my_cleanups (&run_cleanup_chain, old_chain);
 }
 
 void
-do_exec_cleanups (old_chain)
-     register struct cleanup *old_chain;
+do_exec_cleanups (register struct cleanup *old_chain)
 {
   do_my_cleanups (&exec_cleanup_chain, old_chain);
 }
 
 void
-do_exec_error_cleanups (old_chain)
-     register struct cleanup *old_chain;
+do_exec_error_cleanups (register struct cleanup *old_chain)
 {
   do_my_cleanups (&exec_error_cleanup_chain, old_chain);
 }
 
 void
-do_my_cleanups (pmy_chain, old_chain)
-     register struct cleanup **pmy_chain;
-     register struct cleanup *old_chain;
+do_my_cleanups (register struct cleanup **pmy_chain,
+               register struct cleanup *old_chain)
 {
   register struct cleanup *ptr;
   while ((ptr = *pmy_chain) != old_chain)
     {
       *pmy_chain = ptr->next;  /* Do this first incase recursion */
       (*ptr->function) (ptr->arg);
-      free (ptr);
+      xfree (ptr);
     }
 }
 
@@ -298,55 +303,50 @@ do_my_cleanups (pmy_chain, old_chain)
    until we get back to the point OLD_CHAIN in the cleanup_chain.  */
 
 void
-discard_cleanups (old_chain)
-     register struct cleanup *old_chain;
+discard_cleanups (register struct cleanup *old_chain)
 {
   discard_my_cleanups (&cleanup_chain, old_chain);
 }
 
 void
-discard_final_cleanups (old_chain)
-     register struct cleanup *old_chain;
+discard_final_cleanups (register struct cleanup *old_chain)
 {
   discard_my_cleanups (&final_cleanup_chain, old_chain);
 }
 
 void
-discard_exec_error_cleanups (old_chain)
-     register struct cleanup *old_chain;
+discard_exec_error_cleanups (register struct cleanup *old_chain)
 {
   discard_my_cleanups (&exec_error_cleanup_chain, old_chain);
 }
 
 void
-discard_my_cleanups (pmy_chain, old_chain)
-     register struct cleanup **pmy_chain;
-     register struct cleanup *old_chain;
+discard_my_cleanups (register struct cleanup **pmy_chain,
+                    register struct cleanup *old_chain)
 {
   register struct cleanup *ptr;
   while ((ptr = *pmy_chain) != old_chain)
     {
       *pmy_chain = ptr->next;
-      free ((PTR) ptr);
+      xfree (ptr);
     }
 }
 
 /* Set the cleanup_chain to 0, and return the old cleanup chain.  */
 struct cleanup *
-save_cleanups ()
+save_cleanups (void)
 {
   return save_my_cleanups (&cleanup_chain);
 }
 
 struct cleanup *
-save_final_cleanups ()
+save_final_cleanups (void)
 {
   return save_my_cleanups (&final_cleanup_chain);
 }
 
 struct cleanup *
-save_my_cleanups (pmy_chain)
-     struct cleanup **pmy_chain;
+save_my_cleanups (struct cleanup **pmy_chain)
 {
   struct cleanup *old_chain = *pmy_chain;
 
@@ -356,23 +356,19 @@ save_my_cleanups (pmy_chain)
 
 /* Restore the cleanup chain from a previously saved chain.  */
 void
-restore_cleanups (chain)
-     struct cleanup *chain;
+restore_cleanups (struct cleanup *chain)
 {
   restore_my_cleanups (&cleanup_chain, chain);
 }
 
 void
-restore_final_cleanups (chain)
-     struct cleanup *chain;
+restore_final_cleanups (struct cleanup *chain)
 {
   restore_my_cleanups (&final_cleanup_chain, chain);
 }
 
 void
-restore_my_cleanups (pmy_chain, chain)
-     struct cleanup **pmy_chain;
-     struct cleanup *chain;
+restore_my_cleanups (struct cleanup **pmy_chain, struct cleanup *chain)
 {
   *pmy_chain = chain;
 }
@@ -386,10 +382,16 @@ restore_my_cleanups (pmy_chain, chain)
    to arrange to free the object thus allocated.  */
 
 void
-free_current_contents (location)
-     char **location;
+free_current_contents (void *ptr)
 {
-  free (*location);
+  void **location = ptr;
+  if (location == NULL)
+    internal_error ("free_current_contents: NULL pointer");
+  if (*location != NULL)
+    {
+      xfree (*location);
+      *location = NULL;
+    }
 }
 
 /* Provide a known function that does nothing, to use as a base for
@@ -401,17 +403,15 @@ free_current_contents (location)
 
 /* ARGSUSED */
 void
-null_cleanup (arg)
-     PTR arg;
+null_cleanup (void *arg)
 {
 }
 
-/* Add a continuation to the continuation list, the gloabl list
+/* Add a continuation to the continuation list, the global list
    cmd_continuation. The new continuation will be added at the front.*/
 void
-add_continuation (continuation_hook, arg_list)
-     void (*continuation_hook) PARAMS ((struct continuation_arg *));
-     struct continuation_arg *arg_list;
+add_continuation (void (*continuation_hook) (struct continuation_arg *),
+                 struct continuation_arg *arg_list)
 {
   struct continuation *continuation_ptr;
 
@@ -431,7 +431,7 @@ add_continuation (continuation_hook, arg_list)
    and do the continuations from there on, instead of using the
    global beginning of list as our iteration pointer.*/
 void
-do_all_continuations ()
+do_all_continuations (void)
 {
   struct continuation *continuation_ptr;
   struct continuation *saved_continuation;
@@ -449,14 +449,14 @@ do_all_continuations ()
        (continuation_ptr->continuation_hook) (continuation_ptr->arg_list);
        saved_continuation = continuation_ptr;
        continuation_ptr = continuation_ptr->next;
-       free (saved_continuation);
+       xfree (saved_continuation);
      }
 }
 
 /* Walk down the cmd_continuation list, and get rid of all the
    continuations. */
 void
-discard_all_continuations ()
+discard_all_continuations (void)
 {
   struct continuation *continuation_ptr;
 
@@ -464,16 +464,16 @@ discard_all_continuations ()
     {
       continuation_ptr = cmd_continuation;
       cmd_continuation = continuation_ptr->next;
-      free (continuation_ptr);
+      xfree (continuation_ptr);
     }
 }
 
-/* Add a continuation to the continuation list, the gloabl list
+/* Add a continuation to the continuation list, the global list
    intermediate_continuation. The new continuation will be added at the front.*/
 void
-add_intermediate_continuation (continuation_hook, arg_list)
-     void (*continuation_hook) PARAMS ((struct continuation_arg *));
-     struct continuation_arg *arg_list;
+add_intermediate_continuation (void (*continuation_hook)
+                              (struct continuation_arg *),
+                              struct continuation_arg *arg_list)
 {
   struct continuation *continuation_ptr;
 
@@ -493,7 +493,7 @@ add_intermediate_continuation (continuation_hook, arg_list)
    and do the continuations from there on, instead of using the
    global beginning of list as our iteration pointer.*/
 void
-do_all_intermediate_continuations ()
+do_all_intermediate_continuations (void)
 {
   struct continuation *continuation_ptr;
   struct continuation *saved_continuation;
@@ -511,14 +511,14 @@ do_all_intermediate_continuations ()
        (continuation_ptr->continuation_hook) (continuation_ptr->arg_list);
        saved_continuation = continuation_ptr;
        continuation_ptr = continuation_ptr->next;
-       free (saved_continuation);
+       xfree (saved_continuation);
      }
 }
 
 /* Walk down the cmd_continuation list, and get rid of all the
    continuations. */
 void
-discard_all_intermediate_continuations ()
+discard_all_intermediate_continuations (void)
 {
   struct continuation *continuation_ptr;
 
@@ -526,7 +526,7 @@ discard_all_intermediate_continuations ()
     {
       continuation_ptr = intermediate_continuation;
       intermediate_continuation = continuation_ptr->next;
-      free (continuation_ptr);
+      xfree (continuation_ptr);
     }
 }
 
@@ -542,7 +542,7 @@ discard_all_intermediate_continuations ()
    Is this anything other than a historical accident?  */
 
 void
-warning_begin ()
+warning_begin (void)
 {
   target_terminal_ours ();
   wrap_here ("");              /* Force out any buffered output */
@@ -581,7 +581,7 @@ warning (const char *string,...)
    that the error message can be formatted with a single printf call,
    but this is more general.  */
 void
-error_begin ()
+error_begin (void)
 {
   if (error_begin_hook)
     error_begin_hook ();
@@ -606,7 +606,7 @@ verror (const char *string, va_list args)
   char *err_string;
   struct cleanup *err_string_cleanup;
   /* FIXME: cagney/1999-11-10: All error calls should come here.
-     Unfortunatly some code uses the sequence: error_begin(); print
+     Unfortunately some code uses the sequence: error_begin(); print
      error message; return_to_top_level.  That code should be
      flushed. */
   error_begin ();
@@ -617,11 +617,11 @@ verror (const char *string, va_list args)
      va_list twice which works on some platforms and fails miserably on
      others. */
   /* Save it as the last error */
-  gdb_file_rewind (gdb_lasterr);
+  ui_file_rewind (gdb_lasterr);
   vfprintf_filtered (gdb_lasterr, string, args);
   /* Retrieve the last error and print it to gdb_stderr */
   err_string = error_last_message ();
-  err_string_cleanup = make_cleanup (free, err_string);
+  err_string_cleanup = make_cleanup (xfree, err_string);
   fputs_filtered (err_string, gdb_stderr);
   fprintf_filtered (gdb_stderr, "\n");
   do_cleanups (err_string_cleanup);
@@ -638,11 +638,11 @@ error (const char *string,...)
 }
 
 NORETURN void
-error_stream (GDB_FILE *stream)
+error_stream (struct ui_file *stream)
 {
   long size;
-  char *msg = gdb_file_xstrdup (stream, &size);
-  make_cleanup (free, msg);
+  char *msg = ui_file_xstrdup (stream, &size);
+  make_cleanup (xfree, msg);
   error ("%s", msg);
 }
 
@@ -652,7 +652,7 @@ char *
 error_last_message (void)
 {
   long len;
-  return gdb_file_xstrdup (gdb_lasterr, &len);
+  return ui_file_xstrdup (gdb_lasterr, &len);
 }
   
 /* This is to be called by main() at the very beginning */
@@ -691,6 +691,7 @@ internal_verror (const char *fmt, va_list ap)
     }
 
   /* Try to get the message out */
+  target_terminal_ours ();
   fputs_unfiltered ("gdb-internal-error: ", gdb_stderr);
   vfprintf_unfiltered (gdb_stderr, fmt, ap);
   fputs_unfiltered ("\n", gdb_stderr);
@@ -698,7 +699,7 @@ internal_verror (const char *fmt, va_list ap)
   /* Default (no case) is to quit GDB.  When in batch mode this
      lessens the likelhood of GDB going into an infinate loop. */
   continue_p = query ("\
-An internal GDB error was detected.  This may make make further\n\
+An internal GDB error was detected.  This may make further\n\
 debugging unreliable.  Continue this debugging session? ");
 
   /* Default (no case) is to not dump core.  Lessen the chance of GDB
@@ -731,6 +732,7 @@ internal_error (char *string, ...)
 {
   va_list ap;
   va_start (ap, string);
+
   internal_verror (string, ap);
   va_end (ap);
 }
@@ -740,8 +742,7 @@ internal_error (char *string, ...)
    printable string. */
 
 char *
-safe_strerror (errnum)
-     int errnum;
+safe_strerror (int errnum)
 {
   char *msg;
   static char buf[32];
@@ -754,33 +755,12 @@ safe_strerror (errnum)
   return (msg);
 }
 
-/* The strsignal() function can return NULL for signal values that are
-   out of range.  Provide a "safe" version that always returns a
-   printable string. */
-
-char *
-safe_strsignal (signo)
-     int signo;
-{
-  char *msg;
-  static char buf[32];
-
-  if ((msg = strsignal (signo)) == NULL)
-    {
-      sprintf (buf, "(undocumented signal %d)", signo);
-      msg = buf;
-    }
-  return (msg);
-}
-
-
 /* Print the system error message for errno, and also mention STRING
    as the file name for which the error was encountered.
    Then return to command level.  */
 
 NORETURN void
-perror_with_name (string)
-     char *string;
+perror_with_name (char *string)
 {
   char *err;
   char *combined;
@@ -804,9 +784,7 @@ perror_with_name (string)
    as the file name for which the error was encountered.  */
 
 void
-print_sys_errmsg (string, errcode)
-     char *string;
-     int errcode;
+print_sys_errmsg (char *string, int errcode)
 {
   char *err;
   char *combined;
@@ -826,7 +804,7 @@ print_sys_errmsg (string, errcode)
 /* Control C eventually causes this to be called, at a convenient time.  */
 
 void
-quit ()
+quit (void)
 {
   serial_t gdb_stdout_serial = serial_fdopen (1);
 
@@ -881,7 +859,7 @@ quit ()
  */
 
 void
-notice_quit ()
+notice_quit (void)
 {
   int k = win32pollquit ();
   if (k == 1)
@@ -893,7 +871,7 @@ notice_quit ()
 #else /* !defined(_MSC_VER) */
 
 void
-notice_quit ()
+notice_quit (void)
 {
   /* Done by signals */
 }
@@ -902,8 +880,7 @@ notice_quit ()
 
 /* Control C comes here */
 void
-request_quit (signo)
-     int signo;
+request_quit (int signo)
 {
   quit_flag = 1;
   /* Restore the signal handler.  Harmless with BSD-style signals, needed
@@ -931,25 +908,20 @@ request_quit (signo)
 
 #if !defined (USE_MMALLOC)
 
-void *
-mcalloc (void *md, size_t number, size_t size)
+PTR
+mcalloc (PTR md, size_t number, size_t size)
 {
   return calloc (number, size);
 }
 
 PTR
-mmalloc (md, size)
-     PTR md;
-     size_t size;
+mmalloc (PTR md, size_t size)
 {
   return malloc (size);
 }
 
 PTR
-mrealloc (md, ptr, size)
-     PTR md;
-     PTR ptr;
-     size_t size;
+mrealloc (PTR md, PTR ptr, size_t size)
 {
   if (ptr == 0)                        /* Guard against old realloc's */
     return malloc (size);
@@ -958,11 +930,9 @@ mrealloc (md, ptr, size)
 }
 
 void
-mfree (md, ptr)
-     PTR md;
-     PTR ptr;
+mfree (PTR md, PTR ptr)
 {
-  free (ptr);
+  xfree (ptr);
 }
 
 #endif /* USE_MMALLOC */
@@ -970,15 +940,14 @@ mfree (md, ptr)
 #if !defined (USE_MMALLOC) || defined (NO_MMCHECK)
 
 void
-init_malloc (md)
-     PTR md;
+init_malloc (void *md)
 {
 }
 
 #else /* Have mmalloc and want corruption checking */
 
 static void
-malloc_botch ()
+malloc_botch (void)
 {
   fprintf_unfiltered (gdb_stderr, "Memory corruption\n");
   abort ();
@@ -1003,8 +972,7 @@ malloc_botch ()
 #endif
 
 void
-init_malloc (md)
-     PTR md;
+init_malloc (void *md)
 {
   if (!mmcheckf (md, malloc_botch, MMCHECK_FORCE))
     {
@@ -1027,8 +995,7 @@ init_malloc (md)
    memory requested in SIZE. */
 
 NORETURN void
-nomem (size)
-     long size;
+nomem (long size)
 {
   if (size > 0)
     {
@@ -1046,9 +1013,7 @@ nomem (size)
    byte of zero'd storage, is a religious issue. */
 
 PTR
-xmmalloc (md, size)
-     PTR md;
-     long size;
+xmmalloc (PTR md, long size)
 {
   register PTR val;
 
@@ -1066,10 +1031,7 @@ xmmalloc (md, size)
 /* Like mrealloc but get error if no storage available.  */
 
 PTR
-xmrealloc (md, ptr, size)
-     PTR md;
-     PTR ptr;
-     long size;
+xmrealloc (PTR md, PTR ptr, long size)
 {
   register PTR val;
 
@@ -1092,8 +1054,7 @@ xmrealloc (md, ptr, size)
    the caller wanting to allocate zero bytes.  */
 
 PTR
-xmalloc (size)
-     size_t size;
+xmalloc (size_t size)
 {
   return (xmmalloc ((PTR) NULL, size));
 }
@@ -1112,22 +1073,56 @@ xcalloc (size_t number, size_t size)
 /* Like mrealloc but get error if no storage available.  */
 
 PTR
-xrealloc (ptr, size)
-     PTR ptr;
-     size_t size;
+xrealloc (PTR ptr, size_t size)
 {
   return (xmrealloc ((PTR) NULL, ptr, size));
 }
+
+/* Free up space allocated by one of xmalloc(), xcalloc(), or
+   xrealloc().  */
+
+void
+xfree (void *ptr)
+{
+  if (ptr != NULL)
+    free (ptr);
+}
 \f
 
+/* Like asprintf/vasprintf but get an internal_error if the call
+   fails. */
+
+void
+xasprintf (char **ret, const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  xvasprintf (ret, format, args);
+  va_end (args);
+}
+
+void
+xvasprintf (char **ret, const char *format, va_list ap)
+{
+  int status = vasprintf (ret, format, ap);
+  /* NULL could be returned due to a memory allocation problem; a
+     badly format string; or something else. */
+  if ((*ret) == NULL)
+    internal_error ("%s:%d: vasprintf returned NULL buffer (errno %d)",
+                   __FILE__, __LINE__, errno);
+  /* A negative status with a non-NULL buffer shouldn't never
+     happen. But to be sure. */
+  if (status < 0)
+    internal_error ("%s:%d: vasprintf call failed (errno %d)",
+                   __FILE__, __LINE__, errno);
+}
+
+
 /* My replacement for the read system call.
    Used like `read' but keeps going if `read' returns too soon.  */
 
 int
-myread (desc, addr, len)
-     int desc;
-     char *addr;
-     int len;
+myread (int desc, char *addr, int len)
 {
   register int val;
   int orglen = len;
@@ -1150,9 +1145,7 @@ myread (desc, addr, len)
    Uses malloc to get the space.  Returns the address of the copy.  */
 
 char *
-savestring (ptr, size)
-     const char *ptr;
-     int size;
+savestring (const char *ptr, int size)
 {
   register char *p = (char *) xmalloc (size + 1);
   memcpy (p, ptr, size);
@@ -1161,10 +1154,7 @@ savestring (ptr, size)
 }
 
 char *
-msavestring (md, ptr, size)
-     PTR md;
-     const char *ptr;
-     int size;
+msavestring (void *md, const char *ptr, int size)
 {
   register char *p = (char *) xmmalloc (md, size + 1);
   memcpy (p, ptr, size);
@@ -1176,24 +1166,19 @@ msavestring (md, ptr, size)
    in <string.h>.  FIXME: This should be named "xstrsave", shouldn't it?
    Doesn't real strsave return NULL if out of memory?  */
 char *
-strsave (ptr)
-     const char *ptr;
+strsave (const char *ptr)
 {
   return savestring (ptr, strlen (ptr));
 }
 
 char *
-mstrsave (md, ptr)
-     PTR md;
-     const char *ptr;
+mstrsave (void *md, const char *ptr)
 {
   return (msavestring (md, ptr, strlen (ptr)));
 }
 
 void
-print_spaces (n, file)
-     register int n;
-     register GDB_FILE *file;
+print_spaces (register int n, register struct ui_file *file)
 {
   fputs_unfiltered (n_spaces (n), file);
 }
@@ -1201,7 +1186,7 @@ print_spaces (n, file)
 /* Print a host address.  */
 
 void
-gdb_print_host_address (void *addr, struct gdb_file *stream)
+gdb_print_host_address (void *addr, struct ui_file *stream)
 {
 
   /* We could use the %p conversion specifier to fprintf if we had any
@@ -1334,8 +1319,7 @@ query (char *ctlstr,...)
    after the zeros.  A value of 0 does not mean end of string.  */
 
 int
-parse_escape (string_ptr)
-     char **string_ptr;
+parse_escape (char **string_ptr)
 {
   register int c = *(*string_ptr)++;
   switch (c)
@@ -1405,15 +1389,10 @@ parse_escape (string_ptr)
    be call for printing things which are independent of the language
    of the program being debugged. */
 
-static void printchar PARAMS ((int c, void (*do_fputs) (const char *, GDB_FILE*), void (*do_fprintf) (GDB_FILE*, const char *, ...), GDB_FILE *stream, int quoter));
-
 static void
-printchar (c, do_fputs, do_fprintf, stream, quoter)
-     int c;
-     void (*do_fputs) PARAMS ((const char *, GDB_FILE*));
-     void (*do_fprintf) PARAMS ((GDB_FILE*, const char *, ...));
-     GDB_FILE *stream;
-     int quoter;
+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)
 {
 
   c &= 0xFF;                   /* Avoid sign bit follies */
@@ -1464,31 +1443,21 @@ printchar (c, do_fputs, do_fprintf, stream, quoter)
    the language of the program being debugged. */
 
 void
-fputstr_filtered (str, quoter, stream)
-     const char *str;
-     int quoter;
-     GDB_FILE *stream;
+fputstr_filtered (const char *str, int quoter, struct ui_file *stream)
 {
   while (*str)
     printchar (*str++, fputs_filtered, fprintf_filtered, stream, quoter);
 }
 
 void
-fputstr_unfiltered (str, quoter, stream)
-     const char *str;
-     int quoter;
-     GDB_FILE *stream;
+fputstr_unfiltered (const char *str, int quoter, struct ui_file *stream)
 {
   while (*str)
     printchar (*str++, fputs_unfiltered, fprintf_unfiltered, stream, quoter);
 }
 
 void
-fputstrn_unfiltered (str, n, quoter, stream)
-     const char *str;
-     int n;
-     int quoter;
-     GDB_FILE *stream;
+fputstrn_unfiltered (const char *str, int n, int quoter, struct ui_file *stream)
 {
   int i;
   for (i = 0; i < n; i++)
@@ -1499,7 +1468,7 @@ fputstrn_unfiltered (str, n, quoter, stream)
 
 /* Number of lines per page or UINT_MAX if paging is disabled.  */
 static unsigned int lines_per_page;
-/* Number of chars per line or UNIT_MAX if line folding is disabled.  */
+/* Number of chars per line or UINT_MAX if line folding is disabled.  */
 static unsigned int chars_per_line;
 /* Current count of lines printed on this page, chars on this line.  */
 static unsigned int lines_printed, chars_printed;
@@ -1531,7 +1500,7 @@ static int wrap_column;
 
 /* Inialize the lines and chars per page */
 void
-init_page_info ()
+init_page_info (void)
 {
 #if defined(TUI)
   if (tui_version && m_winPtrNotNull (cmdWin))
@@ -1598,14 +1567,14 @@ init_page_info ()
 #endif
 #endif
       /* If the output is not a terminal, don't paginate it.  */
-      if (!GDB_FILE_ISATTY (gdb_stdout))
+      if (!ui_file_isatty (gdb_stdout))
        lines_per_page = UINT_MAX;
     }                          /* the command_line_version */
   set_width ();
 }
 
 static void
-set_width ()
+set_width (void)
 {
   if (chars_per_line == 0)
     init_page_info ();
@@ -1622,10 +1591,7 @@ set_width ()
 
 /* ARGSUSED */
 static void
-set_width_command (args, from_tty, c)
-     char *args;
-     int from_tty;
-     struct cmd_list_element *c;
+set_width_command (char *args, int from_tty, struct cmd_list_element *c)
 {
   set_width ();
 }
@@ -1634,7 +1600,7 @@ set_width_command (args, from_tty, c)
    to continue by pressing RETURN.  */
 
 static void
-prompt_for_continue ()
+prompt_for_continue (void)
 {
   char *ignore;
   char cont_prompt[120];
@@ -1680,7 +1646,7 @@ prompt_for_continue ()
          else
            async_request_quit (0);
        }
-      free (ignore);
+      xfree (ignore);
     }
   immediate_quit--;
 
@@ -1694,7 +1660,7 @@ prompt_for_continue ()
 /* Reinitialize filter; ie. tell it to reset to original values.  */
 
 void
-reinitialize_more_filter ()
+reinitialize_more_filter (void)
 {
   lines_printed = 0;
   chars_printed = 0;
@@ -1722,8 +1688,7 @@ reinitialize_more_filter ()
    used to force out output from the wrap_buffer.  */
 
 void
-wrap_here (indent)
-     char *indent;
+wrap_here (char *indent)
 {
   /* This should have been allocated, but be paranoid anyway. */
   if (!wrap_buffer)
@@ -1763,7 +1728,7 @@ wrap_here (indent)
    line.  Otherwise do nothing. */
 
 void
-begin_line ()
+begin_line (void)
 {
   if (chars_printed > 0)
     {
@@ -1772,763 +1737,6 @@ begin_line ()
 }
 
 
-/* ``struct gdb_file'' implementation that maps directly onto
-   <stdio.h>'s FILE. */
-
-static gdb_file_write_ftype stdio_file_write;
-static gdb_file_fputs_ftype stdio_file_fputs;
-static gdb_file_isatty_ftype stdio_file_isatty;
-static gdb_file_delete_ftype stdio_file_delete;
-static struct gdb_file *stdio_file_new PARAMS ((FILE * file, int close_p));
-static gdb_file_flush_ftype stdio_file_flush;
-
-static int stdio_file_magic;
-
-struct stdio_file
-  {
-    int *magic;
-    FILE *file;
-    int close_p;
-  };
-
-static struct gdb_file *
-stdio_file_new (file, close_p)
-     FILE *file;
-     int close_p;
-{
-  struct gdb_file *gdb_file = gdb_file_new ();
-  struct stdio_file *stdio = xmalloc (sizeof (struct stdio_file));
-  stdio->magic = &stdio_file_magic;
-  stdio->file = file;
-  stdio->close_p = close_p;
-  set_gdb_file_data (gdb_file, stdio, stdio_file_delete);
-  set_gdb_file_flush (gdb_file, stdio_file_flush);
-  set_gdb_file_write (gdb_file, stdio_file_write);
-  set_gdb_file_fputs (gdb_file, stdio_file_fputs);
-  set_gdb_file_isatty (gdb_file, stdio_file_isatty);
-  return gdb_file;
-}
-
-static void
-stdio_file_delete (file)
-     struct gdb_file *file;
-{
-  struct stdio_file *stdio = gdb_file_data (file);
-  if (stdio->magic != &stdio_file_magic)
-    internal_error ("stdio_file_delete: bad magic number");
-  if (stdio->close_p)
-    {
-      fclose (stdio->file);
-    }
-  free (stdio);
-}
-
-static void
-stdio_file_flush (file)
-     struct gdb_file *file;
-{
-  struct stdio_file *stdio = gdb_file_data (file);
-  if (stdio->magic != &stdio_file_magic)
-    internal_error ("stdio_file_flush: bad magic number");
-  fflush (stdio->file);
-}
-
-static void
-stdio_file_write (struct gdb_file *file, const char *buf, long length_buf)
-{
-  struct stdio_file *stdio = gdb_file_data (file);
-  if (stdio->magic != &stdio_file_magic)
-    internal_error ("stdio_file_write: bad magic number");
-  fwrite (buf, length_buf, 1, stdio->file);
-}
-
-static void
-stdio_file_fputs (linebuffer, file)
-     const char *linebuffer;
-     struct gdb_file *file;
-{
-  struct stdio_file *stdio = gdb_file_data (file);
-  if (stdio->magic != &stdio_file_magic)
-    internal_error ("stdio_file_fputs: bad magic number");
-  fputs (linebuffer, stdio->file);
-}
-
-static int
-stdio_file_isatty (file)
-     struct gdb_file *file;
-{
-  struct stdio_file *stdio = gdb_file_data (file);
-  if (stdio->magic != &stdio_file_magic)
-    internal_error ("stdio_file_isatty: bad magic number");
-  return (isatty (fileno (stdio->file)));
-}
-
-/* Like fdopen().  Create a gdb_file from a previously opened FILE. */
-
-struct gdb_file *
-stdio_fileopen (file)
-     FILE *file;
-{
-  return stdio_file_new (file, 0);
-}
-
-
-/* A pure memory based ``struct gdb_file'' that can be used an output
-   buffer. The buffers accumulated contents are available via
-   gdb_file_put(). */
-
-struct mem_file
-  {
-    int *magic;
-    char *buffer;
-    int sizeof_buffer;
-    int length_buffer;
-  };
-
-static gdb_file_rewind_ftype mem_file_rewind;
-static gdb_file_put_ftype mem_file_put;
-static gdb_file_write_ftype mem_file_write;
-static gdb_file_delete_ftype mem_file_delete;
-static struct gdb_file *mem_file_new PARAMS ((void));
-static int mem_file_magic;
-
-static struct gdb_file *
-mem_file_new (void)
-{
-  struct mem_file *stream = XMALLOC (struct mem_file);
-  struct gdb_file *file = gdb_file_new ();
-  set_gdb_file_data (file, stream, mem_file_delete);
-  set_gdb_file_rewind (file, mem_file_rewind);
-  set_gdb_file_put (file, mem_file_put);
-  set_gdb_file_write (file, mem_file_write);
-  stream->magic = &mem_file_magic;
-  stream->buffer = NULL;
-  stream->sizeof_buffer = 0;
-  stream->length_buffer = 0;
-  return file;
-}
-
-static void
-mem_file_delete (struct gdb_file *file)
-{
-  struct mem_file *stream = gdb_file_data (file);
-  if (stream->magic != &mem_file_magic)
-    internal_error ("mem_file_delete: bad magic number");
-  if (stream->buffer != NULL)
-    free (stream->buffer);
-  free (stream);
-}
-
-struct gdb_file *
-mem_fileopen (void)
-{
-  return mem_file_new ();
-}
-
-static void
-mem_file_rewind (struct gdb_file *file)
-{
-  struct mem_file *stream = gdb_file_data (file);
-  if (stream->magic != &mem_file_magic)
-    internal_error ("mem_file_rewind: bad magic number");
-  stream->length_buffer = 0;
-}
-
-static void
-mem_file_put (struct gdb_file *file,
-             gdb_file_put_method_ftype *write,
-             void *dest)
-{
-  struct mem_file *stream = gdb_file_data (file);
-  if (stream->magic != &mem_file_magic)
-    internal_error ("mem_file_put: bad magic number");
-  if (stream->length_buffer > 0)
-    write (dest, stream->buffer, stream->length_buffer);
-}
-
-void
-mem_file_write (struct gdb_file *file,
-               const char *buffer,
-               long length_buffer)
-{
-  struct mem_file *stream = gdb_file_data (file);
-  if (stream->magic != &mem_file_magic)
-    internal_error ("mem_file_write: bad magic number");
-  if (stream->buffer == NULL)
-    {
-      stream->length_buffer = length_buffer;
-      stream->sizeof_buffer = length_buffer;
-      stream->buffer = xmalloc (stream->sizeof_buffer);
-      memcpy (stream->buffer, buffer, length_buffer);
-    }
-  else
-    {
-      int new_length = stream->length_buffer + length_buffer;
-      if (new_length >= stream->sizeof_buffer)
-       {
-         stream->sizeof_buffer = new_length;
-         stream->buffer = xrealloc (stream->buffer, stream->sizeof_buffer);
-       }
-      memcpy (stream->buffer + stream->length_buffer, buffer, length_buffer);
-      stream->length_buffer = new_length;
-    }
-}
-
-/* A ``struct gdb_file'' that is compatible with all the legacy
-   code. */
-
-/* new */
-enum streamtype
-{
-  afile,
-  astring
-};
-
-/* new */
-struct tui_stream
-{
-  int *ts_magic;
-  enum streamtype ts_streamtype;
-  FILE *ts_filestream;
-  char *ts_strbuf;
-  int ts_buflen;
-};
-
-static gdb_file_flush_ftype tui_file_flush;
-extern gdb_file_fputs_ftype tui_file_fputs;
-static gdb_file_isatty_ftype tui_file_isatty;
-static gdb_file_rewind_ftype tui_file_rewind;
-static gdb_file_put_ftype tui_file_put;
-static gdb_file_delete_ftype tui_file_delete;
-static struct gdb_file *tui_file_new PARAMS ((void));
-static int tui_file_magic;
-
-static struct gdb_file *
-tui_file_new ()
-{
-  struct tui_stream *tui = xmalloc (sizeof (struct tui_stream));
-  struct gdb_file *file = gdb_file_new ();
-  set_gdb_file_data (file, tui, tui_file_delete);
-  set_gdb_file_flush (file, tui_file_flush);
-  set_gdb_file_fputs (file, tui_file_fputs);
-  set_gdb_file_isatty (file, tui_file_isatty);
-  set_gdb_file_rewind (file, tui_file_rewind);
-  set_gdb_file_put (file, tui_file_put);
-  tui->ts_magic = &tui_file_magic;
-  return file;
-}
-
-static void
-tui_file_delete (file)
-     struct gdb_file *file;
-{
-  struct tui_stream *tmpstream = gdb_file_data (file);
-  if (tmpstream->ts_magic != &tui_file_magic)
-    internal_error ("tui_file_delete: bad magic number");
-  if ((tmpstream->ts_streamtype == astring) &&
-      (tmpstream->ts_strbuf != NULL))
-    {
-      free (tmpstream->ts_strbuf);
-    }
-  free (tmpstream);
-}
-
-struct gdb_file *
-tui_fileopen (stream)
-     FILE *stream;
-{
-  struct gdb_file *file = tui_file_new ();
-  struct tui_stream *tmpstream = gdb_file_data (file);
-  tmpstream->ts_streamtype = afile;
-  tmpstream->ts_filestream = stream;
-  tmpstream->ts_strbuf = NULL;
-  tmpstream->ts_buflen = 0;
-  return file;
-}
-
-struct gdb_file *
-tui_sfileopen (n)
-     int n;
-{
-  struct gdb_file *file = tui_file_new ();
-  struct tui_stream *tmpstream = gdb_file_data (file);
-  tmpstream->ts_streamtype = astring;
-  tmpstream->ts_filestream = NULL;
-  if (n > 0)
-    {
-      tmpstream->ts_strbuf = xmalloc ((n + 1) * sizeof (char));
-      tmpstream->ts_strbuf[0] = '\0';
-    }
-  else
-    /* Do not allocate the buffer now.  The first time something is printed
-       one will be allocated by tui_file_adjust_strbuf()  */
-    tmpstream->ts_strbuf = NULL;
-  tmpstream->ts_buflen = n;
-  return file;
-}
-
-static int
-tui_file_isatty (file)
-     struct gdb_file *file;
-{
-  struct tui_stream *stream = gdb_file_data (file);
-  if (stream->ts_magic != &tui_file_magic)
-    internal_error ("tui_file_isatty: bad magic number");
-  if (stream->ts_streamtype == afile)
-    return (isatty (fileno (stream->ts_filestream)));
-  else
-    return 0;
-}
-
-static void
-tui_file_rewind (file)
-     struct gdb_file *file;
-{
-  struct tui_stream *stream = gdb_file_data (file);
-  if (stream->ts_magic != &tui_file_magic)
-    internal_error ("tui_file_rewind: bad magic number");
-  stream->ts_strbuf[0] = '\0';
-}
-
-static void
-tui_file_put (struct gdb_file *file,
-             gdb_file_put_method_ftype *write,
-             void *dest)
-{
-  struct tui_stream *stream = gdb_file_data (file);
-  if (stream->ts_magic != &tui_file_magic)
-    internal_error ("tui_file_put: bad magic number");
-  if (stream->ts_streamtype == astring)
-    write (dest, stream->ts_strbuf, strlen (stream->ts_strbuf));
-}
-
-/* All TUI I/O sent to the *_filtered and *_unfiltered functions
-   eventually ends up here.  The fputs_unfiltered_hook is primarily
-   used by GUIs to collect all output and send it to the GUI, instead
-   of the controlling terminal.  Only output to gdb_stdout and
-   gdb_stderr are sent to the hook.  Everything else is sent on to
-   fputs to allow file I/O to be handled appropriately.  */
-
-/* FIXME: Should be broken up and moved to a TUI specific file. */
-
-void
-tui_file_fputs (linebuffer, file)
-     const char *linebuffer;
-     GDB_FILE *file;
-{
-  struct tui_stream *stream = gdb_file_data (file);
-#if defined(TUI)
-  extern int tui_owns_terminal;
-#endif
-  /* NOTE: cagney/1999-10-13: The use of fputs_unfiltered_hook is
-     seriously discouraged.  Those wanting to hook output should
-     instead implement their own gdb_file object and install that. See
-     also tui_file_flush(). */
-  if (fputs_unfiltered_hook
-      && (file == gdb_stdout
-         || file == gdb_stderr))
-    fputs_unfiltered_hook (linebuffer, file);
-  else
-    {
-#if defined(TUI)
-      if (tui_version && tui_owns_terminal)
-       {
-         /* If we get here somehow while updating the TUI (from
-          * within a tuiDo(), then we need to temporarily 
-          * set up the terminal for GDB output. This probably just
-          * happens on error output.
-          */
-
-         if (stream->ts_streamtype == astring)
-           {
-             tui_file_adjust_strbuf (strlen (linebuffer), stream);
-             strcat (stream->ts_strbuf, linebuffer);
-           }
-         else
-           {
-             tuiTermUnsetup (0, (tui_version) ? cmdWin->detail.commandInfo.curch : 0);
-             fputs (linebuffer, stream->ts_filestream);
-             tuiTermSetup (0);
-             if (linebuffer[strlen (linebuffer) - 1] == '\n')
-               tuiClearCommandCharCount ();
-             else
-               tuiIncrCommandCharCountBy (strlen (linebuffer));
-           }
-       }
-      else
-       {
-         /* The normal case - just do a fputs() */
-         if (stream->ts_streamtype == astring)
-           {
-             tui_file_adjust_strbuf (strlen (linebuffer), stream);
-             strcat (stream->ts_strbuf, linebuffer);
-           }
-         else
-           fputs (linebuffer, stream->ts_filestream);
-       }
-
-
-#else
-      if (stream->ts_streamtype == astring)
-       {
-         tui_file_adjust_strbuf (strlen (linebuffer), file);
-         strcat (stream->ts_strbuf, linebuffer);
-       }
-      else
-       fputs (linebuffer, stream->ts_filestream);
-#endif
-    }
-}
-
-char *
-tui_file_get_strbuf (struct gdb_file *file)
-{
-  struct tui_stream *stream = gdb_file_data (file);
-  if (stream->ts_magic != &tui_file_magic)
-    internal_error ("tui_file_get_strbuf: bad magic number");
-  return (stream->ts_strbuf);
-}
-
-/* adjust the length of the buffer by the amount necessary
-   to accomodate appending a string of length N to the buffer contents */
-void
-tui_file_adjust_strbuf (int n, struct gdb_file *file)
-{
-  struct tui_stream *stream = gdb_file_data (file);
-  int non_null_chars;
-  if (stream->ts_magic != &tui_file_magic)
-    internal_error ("tui_file_adjust_strbuf: bad magic number");
-
-  if (stream->ts_streamtype != astring)
-    return;
-
-  if (stream->ts_strbuf)
-    {
-      /* There is already a buffer allocated */
-      non_null_chars = strlen (stream->ts_strbuf);
-
-      if (n > (stream->ts_buflen - non_null_chars - 1))
-       {
-         stream->ts_buflen = n + non_null_chars + 1;
-         stream->ts_strbuf = xrealloc (stream->ts_strbuf, stream->ts_buflen);
-       }
-    }
-  else
-    /* No buffer yet, so allocate one of the desired size */
-    stream->ts_strbuf = xmalloc ((n + 1) * sizeof (char));
-}
-
-GDB_FILE *
-gdb_fopen (name, mode)
-     char *name;
-     char *mode;
-{
-  FILE *f = fopen (name, mode);
-  if (f == NULL)
-    return NULL;
-  return stdio_file_new (f, 1);
-}
-
-static void
-tui_file_flush (file)
-     GDB_FILE *file;
-{
-  struct tui_stream *stream = gdb_file_data (file);
-  if (stream->ts_magic != &tui_file_magic)
-    internal_error ("tui_file_flush: bad magic number");
-
-  /* NOTE: cagney/1999-10-12: If we've been linked with code that uses
-     fputs_unfiltered_hook then we assume that it doesn't need to know
-     about flushes.  Code that does need to know about flushes can
-     implement a proper gdb_file object. */
-  if (fputs_unfiltered_hook)
-    return;
-
-  switch (stream->ts_streamtype)
-    {
-    case astring:
-      break;
-    case afile:
-      fflush (stream->ts_filestream);
-      break;
-    }
-}
-
-/* Implement the ``struct gdb_file'' object. */
-
-static gdb_file_isatty_ftype null_file_isatty;
-static gdb_file_write_ftype null_file_write;
-static gdb_file_fputs_ftype null_file_fputs;
-static gdb_file_flush_ftype null_file_flush;
-static gdb_file_delete_ftype null_file_delete;
-static gdb_file_rewind_ftype null_file_rewind;
-static gdb_file_put_ftype null_file_put;
-
-struct gdb_file
-  {
-    int *magic;
-    gdb_file_flush_ftype *to_flush;
-    gdb_file_write_ftype *to_write;
-    gdb_file_fputs_ftype *to_fputs;
-    gdb_file_delete_ftype *to_delete;
-    gdb_file_isatty_ftype *to_isatty;
-    gdb_file_rewind_ftype *to_rewind;
-    gdb_file_put_ftype *to_put;
-    void *to_data;
-  };
-int gdb_file_magic;
-
-struct gdb_file *
-gdb_file_new ()
-{
-  struct gdb_file *file = xmalloc (sizeof (struct gdb_file));
-  file->magic = &gdb_file_magic;
-  set_gdb_file_data (file, NULL, null_file_delete);
-  set_gdb_file_flush (file, null_file_flush);
-  set_gdb_file_write (file, null_file_write);
-  set_gdb_file_fputs (file, null_file_fputs);
-  set_gdb_file_isatty (file, null_file_isatty);
-  set_gdb_file_rewind (file, null_file_rewind);
-  set_gdb_file_put (file, null_file_put);
-  return file;
-}
-
-void
-gdb_file_delete (file)
-     struct gdb_file *file;
-{
-  file->to_delete (file);
-  free (file);
-}
-
-static int
-null_file_isatty (file)
-     struct gdb_file *file;
-{
-  return 0;
-}
-
-static void
-null_file_rewind (file)
-     struct gdb_file *file;
-{
-  return;
-}
-
-static void
-null_file_put (struct gdb_file *file,
-              gdb_file_put_method_ftype *write,
-              void *dest)
-{
-  return;
-}
-
-static void
-null_file_flush (file)
-     struct gdb_file *file;
-{
-  return;
-}
-
-static void
-null_file_write (struct gdb_file *file,
-                const char *buf,
-                long sizeof_buf)
-{
-  if (file->to_fputs == null_file_fputs)
-    /* Both the write and fputs methods are null. Discard the
-       request. */
-    return;
-  else
-    {
-      /* The fputs method isn't null, slowly pass the write request
-         onto that.  FYI, this isn't as bad as it may look - the
-         current (as of 1999-11-07) printf_* function calls fputc and
-         fputc does exactly the below.  By having a write function it
-         is possible to clean up that code.  */
-      int i;
-      char b[2];
-      b[1] = '\0';
-      for (i = 0; i < sizeof_buf; i++)
-       {
-         b[0] = buf[i];
-         file->to_fputs (b, file);
-       }
-      return;
-    }
-}
-
-static void
-null_file_fputs (buf, file)
-     const char *buf;
-     struct gdb_file *file;
-{
-  if (file->to_write == null_file_write)
-    /* Both the write and fputs methods are null. Discard the
-       request. */
-    return;
-  else
-    {
-      /* The write method was implemented, use that. */
-      file->to_write (file, buf, strlen (buf));
-    }
-}
-
-static void
-null_file_delete (file)
-     struct gdb_file *file;
-{
-  return;
-}
-
-void *
-gdb_file_data (file)
-     struct gdb_file *file;
-{
-  if (file->magic != &gdb_file_magic)
-    internal_error ("gdb_file_data: bad magic number");
-  return file->to_data;
-}
-
-void
-gdb_flush (file)
-     struct gdb_file *file;
-{
-  file->to_flush (file);
-}
-
-int
-gdb_file_isatty (file)
-     struct gdb_file *file;
-{
-  return file->to_isatty (file);
-}
-
-void
-gdb_file_rewind (file)
-     struct gdb_file *file;
-{
-  file->to_rewind (file);
-}
-
-void
-gdb_file_put (struct gdb_file *file,
-             gdb_file_put_method_ftype *write,
-             void *dest)
-{
-  file->to_put (file, write, dest);
-}
-
-void
-gdb_file_write (struct gdb_file *file,
-               const char *buf,
-               long length_buf)
-{
-  file->to_write (file, buf, length_buf);
-}
-
-void
-fputs_unfiltered (buf, file)
-     const char *buf;
-     struct gdb_file *file;
-{
-  file->to_fputs (buf, file);
-}
-
-void
-set_gdb_file_flush (file, flush)
-     struct gdb_file *file;
-     gdb_file_flush_ftype *flush;
-{
-  file->to_flush = flush;
-}
-
-void
-set_gdb_file_isatty (file, isatty)
-     struct gdb_file *file;
-     gdb_file_isatty_ftype *isatty;
-{
-  file->to_isatty = isatty;
-}
-
-void
-set_gdb_file_rewind (file, rewind)
-     struct gdb_file *file;
-     gdb_file_rewind_ftype *rewind;
-{
-  file->to_rewind = rewind;
-}
-
-void
-set_gdb_file_put (file, put)
-     struct gdb_file *file;
-     gdb_file_put_ftype *put;
-{
-  file->to_put = put;
-}
-
-void
-set_gdb_file_write (struct gdb_file *file,
-                   gdb_file_write_ftype *write)
-{
-  file->to_write = write;
-}
-
-void
-set_gdb_file_fputs (file, fputs)
-     struct gdb_file *file;
-     gdb_file_fputs_ftype *fputs;
-{
-  file->to_fputs = fputs;
-}
-
-void
-set_gdb_file_data (file, data, delete)
-     struct gdb_file *file;
-     void *data;
-     gdb_file_delete_ftype *delete;
-{
-  file->to_data = data;
-  file->to_delete = delete;
-}
-
-/* gdb_file utility function for converting a ``struct gdb_file'' into
-   a memory buffer''. */
-
-struct accumulated_gdb_file
-{
-  char *buffer;
-  long length;
-};
-
-static void
-do_gdb_file_xstrdup (void *context, const char *buffer, long length)
-{
-  struct accumulated_gdb_file *acc = context;
-  if (acc->buffer == NULL)
-    acc->buffer = xmalloc (length + 1);
-  else
-    acc->buffer = xrealloc (acc->buffer, acc->length + length + 1);
-  memcpy (acc->buffer + acc->length, buffer, length);
-  acc->length += length;
-  acc->buffer[acc->length] = '\0';
-}
-
-char *
-gdb_file_xstrdup (struct gdb_file *file,
-                 long *length)
-{
-  struct accumulated_gdb_file acc;
-  acc.buffer = NULL;
-  acc.length = 0;
-  gdb_file_put (file, do_gdb_file_xstrdup, &acc);
-  if (acc.buffer == NULL)
-    acc.buffer = xstrdup ("");
-  *length = acc.length;
-  return acc.buffer;
-}
-
-
 /* Like fputs but if FILTER is true, pause after every screenful.
 
    Regardless of FILTER can wrap at points other than the final
@@ -2543,10 +1751,8 @@ gdb_file_xstrdup (struct gdb_file *file,
    routine should not be called when cleanups are not in place.  */
 
 static void
-fputs_maybe_filtered (linebuffer, stream, filter)
-     const char *linebuffer;
-     GDB_FILE *stream;
-     int filter;
+fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream,
+                     int filter)
 {
   const char *lineptr;
 
@@ -2647,36 +1853,29 @@ fputs_maybe_filtered (linebuffer, stream, filter)
 }
 
 void
-fputs_filtered (linebuffer, stream)
-     const char *linebuffer;
-     GDB_FILE *stream;
+fputs_filtered (const char *linebuffer, struct ui_file *stream)
 {
   fputs_maybe_filtered (linebuffer, stream, 1);
 }
 
 int
-putchar_unfiltered (c)
-     int c;
+putchar_unfiltered (int c)
 {
   char buf = c;
-  gdb_file_write (gdb_stdout, &buf, 1);
+  ui_file_write (gdb_stdout, &buf, 1);
   return c;
 }
 
 int
-fputc_unfiltered (c, stream)
-     int c;
-     GDB_FILE *stream;
+fputc_unfiltered (int c, struct ui_file *stream)
 {
   char buf = c;
-  gdb_file_write (stream, &buf, 1);
+  ui_file_write (stream, &buf, 1);
   return c;
 }
 
 int
-fputc_filtered (c, stream)
-     int c;
-     GDB_FILE *stream;
+fputc_filtered (int c, struct ui_file *stream)
 {
   char buf[2];
 
@@ -2690,10 +1889,7 @@ fputc_filtered (c, stream)
    characters in printable fashion.  */
 
 void
-puts_debug (prefix, string, suffix)
-     char *prefix;
-     char *string;
-     char *suffix;
+puts_debug (char *prefix, char *string, char *suffix)
 {
   int ch;
 
@@ -2789,74 +1985,51 @@ puts_debug (prefix, string, suffix)
    called when cleanups are not in place.  */
 
 static void
-vfprintf_maybe_filtered (stream, format, args, filter)
-     GDB_FILE *stream;
-     const char *format;
-     va_list args;
-     int filter;
+vfprintf_maybe_filtered (struct ui_file *stream, const char *format,
+                        va_list args, int filter)
 {
   char *linebuffer;
   struct cleanup *old_cleanups;
 
-  vasprintf (&linebuffer, format, args);
-  if (linebuffer == NULL)
-    {
-      fputs_unfiltered ("\ngdb: virtual memory exhausted.\n", gdb_stderr);
-      exit (1);
-    }
-  old_cleanups = make_cleanup (free, linebuffer);
+  xvasprintf (&linebuffer, format, args);
+  old_cleanups = make_cleanup (xfree, linebuffer);
   fputs_maybe_filtered (linebuffer, stream, filter);
   do_cleanups (old_cleanups);
 }
 
 
 void
-vfprintf_filtered (stream, format, args)
-     GDB_FILE *stream;
-     const char *format;
-     va_list args;
+vfprintf_filtered (struct ui_file *stream, const char *format, va_list args)
 {
   vfprintf_maybe_filtered (stream, format, args, 1);
 }
 
 void
-vfprintf_unfiltered (stream, format, args)
-     GDB_FILE *stream;
-     const char *format;
-     va_list args;
+vfprintf_unfiltered (struct ui_file *stream, const char *format, va_list args)
 {
   char *linebuffer;
   struct cleanup *old_cleanups;
 
-  vasprintf (&linebuffer, format, args);
-  if (linebuffer == NULL)
-    {
-      fputs_unfiltered ("\ngdb: virtual memory exhausted.\n", gdb_stderr);
-      exit (1);
-    }
-  old_cleanups = make_cleanup (free, linebuffer);
+  xvasprintf (&linebuffer, format, args);
+  old_cleanups = make_cleanup (xfree, linebuffer);
   fputs_unfiltered (linebuffer, stream);
   do_cleanups (old_cleanups);
 }
 
 void
-vprintf_filtered (format, args)
-     const char *format;
-     va_list args;
+vprintf_filtered (const char *format, va_list args)
 {
   vfprintf_maybe_filtered (gdb_stdout, format, args, 1);
 }
 
 void
-vprintf_unfiltered (format, args)
-     const char *format;
-     va_list args;
+vprintf_unfiltered (const char *format, va_list args)
 {
   vfprintf_unfiltered (gdb_stdout, format, args);
 }
 
 void
-fprintf_filtered (GDB_FILE * stream, const char *format,...)
+fprintf_filtered (struct ui_file * stream, const char *format,...)
 {
   va_list args;
   va_start (args, format);
@@ -2865,7 +2038,7 @@ fprintf_filtered (GDB_FILE * stream, const char *format,...)
 }
 
 void
-fprintf_unfiltered (GDB_FILE * stream, const char *format,...)
+fprintf_unfiltered (struct ui_file * stream, const char *format,...)
 {
   va_list args;
   va_start (args, format);
@@ -2877,7 +2050,7 @@ fprintf_unfiltered (GDB_FILE * stream, const char *format,...)
    Called as fprintfi_filtered (spaces, stream, format, ...);  */
 
 void
-fprintfi_filtered (int spaces, GDB_FILE * stream, const char *format,...)
+fprintfi_filtered (int spaces, struct ui_file * stream, const char *format,...)
 {
   va_list args;
   va_start (args, format);
@@ -2926,15 +2099,13 @@ printfi_filtered (int spaces, const char *format,...)
    This one doesn't, and had better not!  */
 
 void
-puts_filtered (string)
-     const char *string;
+puts_filtered (const char *string)
 {
   fputs_filtered (string, gdb_stdout);
 }
 
 void
-puts_unfiltered (string)
-     const char *string;
+puts_unfiltered (const char *string)
 {
   fputs_unfiltered (string, gdb_stdout);
 }
@@ -2942,8 +2113,7 @@ puts_unfiltered (string)
 /* Return a pointer to N spaces and a null.  The pointer is good
    until the next call to here.  */
 char *
-n_spaces (n)
-     int n;
+n_spaces (int n)
 {
   char *t;
   static char *spaces = 0;
@@ -2952,7 +2122,7 @@ n_spaces (n)
   if (n > max_spaces)
     {
       if (spaces)
-       free (spaces);
+       xfree (spaces);
       spaces = (char *) xmalloc (n + 1);
       for (t = spaces + n; t != spaces;)
        *--t = ' ';
@@ -2965,9 +2135,7 @@ n_spaces (n)
 
 /* Print N spaces.  */
 void
-print_spaces_filtered (n, stream)
-     int n;
-     GDB_FILE *stream;
+print_spaces_filtered (int n, struct ui_file *stream)
 {
   fputs_filtered (n_spaces (n), stream);
 }
@@ -2980,11 +2148,8 @@ print_spaces_filtered (n, stream)
    demangling is off, the name is printed in its "raw" form. */
 
 void
-fprintf_symbol_filtered (stream, name, lang, arg_mode)
-     GDB_FILE *stream;
-     char *name;
-     enum language lang;
-     int arg_mode;
+fprintf_symbol_filtered (struct ui_file *stream, char *name, enum language lang,
+                        int arg_mode)
 {
   char *demangled;
 
@@ -3015,7 +2180,7 @@ fprintf_symbol_filtered (stream, name, lang, arg_mode)
          fputs_filtered (demangled ? demangled : name, stream);
          if (demangled != NULL)
            {
-             free (demangled);
+             xfree (demangled);
            }
        }
     }
@@ -3031,9 +2196,7 @@ fprintf_symbol_filtered (stream, name, lang, arg_mode)
    function). */
 
 int
-strcmp_iw (string1, string2)
-     const char *string1;
-     const char *string2;
+strcmp_iw (const char *string1, const char *string2)
 {
   while ((*string1 != '\0') && (*string2 != '\0'))
     {
@@ -3066,9 +2229,7 @@ strcmp_iw (string1, string2)
    **    at index 0.
  */
 int
-subset_compare (string_to_compare, template_string)
-     char *string_to_compare;
-     char *template_string;
+subset_compare (char *string_to_compare, char *template_string)
 {
   int match;
   if (template_string != (char *) NULL && string_to_compare != (char *) NULL &&
@@ -3082,27 +2243,23 @@ subset_compare (string_to_compare, template_string)
 }
 
 
-static void pagination_on_command PARAMS ((char *arg, int from_tty));
+static void pagination_on_command (char *arg, int from_tty);
 static void
-pagination_on_command (arg, from_tty)
-     char *arg;
-     int from_tty;
+pagination_on_command (char *arg, int from_tty)
 {
   pagination_enabled = 1;
 }
 
-static void pagination_on_command PARAMS ((char *arg, int from_tty));
+static void pagination_on_command (char *arg, int from_tty);
 static void
-pagination_off_command (arg, from_tty)
-     char *arg;
-     int from_tty;
+pagination_off_command (char *arg, int from_tty)
 {
   pagination_enabled = 0;
 }
 \f
 
 void
-initialize_utils ()
+initialize_utils (void)
 {
   struct cmd_list_element *c;
 
@@ -3122,7 +2279,7 @@ initialize_utils ()
   init_page_info ();
 
   /* If the output is not a terminal, don't paginate it.  */
-  if (!GDB_FILE_ISATTY (gdb_stdout))
+  if (!ui_file_isatty (gdb_stdout))
     lines_per_page = UINT_MAX;
 
   set_width_command ((char *) NULL, 0, c);
@@ -3139,6 +2296,7 @@ initialize_utils ()
                  var_boolean, (char *) &pagination_enabled,
                  "Set state of pagination.", &setlist),
      &showlist);
+
   if (xdb_commands)
     {
       add_com ("am", class_support, pagination_on_command,
@@ -3182,33 +2340,46 @@ SIGWINCH_HANDLER_BODY
    a system header, what we do if not, etc.  */
 #define FLOATFORMAT_CHAR_BIT 8
 
-static unsigned long get_field PARAMS ((unsigned char *,
-                                       enum floatformat_byteorders,
-                                       unsigned int,
-                                       unsigned int,
-                                       unsigned int));
+static unsigned long get_field (unsigned char *,
+                               enum floatformat_byteorders,
+                               unsigned int, unsigned int, unsigned int);
 
 /* Extract a field which starts at START and is LEN bytes long.  DATA and
    TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
 static unsigned long
-get_field (data, order, total_len, start, len)
-     unsigned char *data;
-     enum floatformat_byteorders order;
-     unsigned int total_len;
-     unsigned int start;
-     unsigned int len;
+get_field (unsigned char *data, enum floatformat_byteorders order,
+          unsigned int total_len, unsigned int start, unsigned int len)
 {
   unsigned long result;
   unsigned int cur_byte;
   int cur_bitshift;
 
   /* Start at the least significant part of the field.  */
-  cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
   if (order == floatformat_little || order == floatformat_littlebyte_bigword)
-    cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
-  cur_bitshift =
-    ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
-  result = *(data + cur_byte) >> (-cur_bitshift);
+    {
+      /* We start counting from the other end (i.e, from the high bytes
+        rather than the low bytes).  As such, we need to be concerned
+        with what happens if bit 0 doesn't start on a byte boundary. 
+        I.e, we need to properly handle the case where total_len is
+        not evenly divisible by 8.  So we compute ``excess'' which
+        represents the number of bits from the end of our starting
+        byte needed to get to bit 0. */
+      int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
+      cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) 
+                 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
+      cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT) 
+                     - FLOATFORMAT_CHAR_BIT;
+    }
+  else
+    {
+      cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
+      cur_bitshift =
+       ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
+    }
+  if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
+    result = *(data + cur_byte) >> (-cur_bitshift);
+  else
+    result = 0;
   cur_bitshift += FLOATFORMAT_CHAR_BIT;
   if (order == floatformat_little || order == floatformat_littlebyte_bigword)
     ++cur_byte;
@@ -3218,20 +2389,16 @@ get_field (data, order, total_len, start, len)
   /* Move towards the most significant part of the field.  */
   while (cur_bitshift < len)
     {
-      if (len - cur_bitshift < FLOATFORMAT_CHAR_BIT)
-       /* This is the last byte; zero out the bits which are not part of
-          this field.  */
-       result |=
-         (*(data + cur_byte) & ((1 << (len - cur_bitshift)) - 1))
-         << cur_bitshift;
-      else
-       result |= *(data + cur_byte) << cur_bitshift;
+      result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
       cur_bitshift += FLOATFORMAT_CHAR_BIT;
       if (order == floatformat_little || order == floatformat_littlebyte_bigword)
        ++cur_byte;
       else
        --cur_byte;
     }
+  if (len < sizeof(result) * FLOATFORMAT_CHAR_BIT)
+    /* Mask out bits which are not part of the field */
+    result &= ((1UL << len) - 1);
   return result;
 }
 
@@ -3240,10 +2407,8 @@ get_field (data, order, total_len, start, len)
    Store the DOUBLEST in *TO.  */
 
 void
-floatformat_to_doublest (fmt, from, to)
-     const struct floatformat *fmt;
-     char *from;
-     DOUBLEST *to;
+floatformat_to_doublest (const struct floatformat *fmt, char *from,
+                        DOUBLEST *to)
 {
   unsigned char *ufrom = (unsigned char *) from;
   DOUBLEST dto;
@@ -3347,36 +2512,43 @@ floatformat_to_doublest (fmt, from, to)
   *to = dto;
 }
 \f
-static void put_field PARAMS ((unsigned char *, enum floatformat_byteorders,
-                              unsigned int,
-                              unsigned int,
-                              unsigned int,
-                              unsigned long));
+static void put_field (unsigned char *, enum floatformat_byteorders,
+                      unsigned int,
+                      unsigned int, unsigned int, unsigned long);
 
 /* Set a field which starts at START and is LEN bytes long.  DATA and
    TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
 static void
-put_field (data, order, total_len, start, len, stuff_to_put)
-     unsigned char *data;
-     enum floatformat_byteorders order;
-     unsigned int total_len;
-     unsigned int start;
-     unsigned int len;
-     unsigned long stuff_to_put;
+put_field (unsigned char *data, enum floatformat_byteorders order,
+          unsigned int total_len, unsigned int start, unsigned int len,
+          unsigned long stuff_to_put)
 {
   unsigned int cur_byte;
   int cur_bitshift;
 
   /* Start at the least significant part of the field.  */
-  cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
   if (order == floatformat_little || order == floatformat_littlebyte_bigword)
-    cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) - cur_byte - 1;
-  cur_bitshift =
-    ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
-  *(data + cur_byte) &=
-    ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1) << (-cur_bitshift));
-  *(data + cur_byte) |=
-    (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
+    {
+      int excess = FLOATFORMAT_CHAR_BIT - (total_len % FLOATFORMAT_CHAR_BIT);
+      cur_byte = (total_len / FLOATFORMAT_CHAR_BIT) 
+                 - ((start + len + excess) / FLOATFORMAT_CHAR_BIT);
+      cur_bitshift = ((start + len + excess) % FLOATFORMAT_CHAR_BIT) 
+                     - FLOATFORMAT_CHAR_BIT;
+    }
+  else
+    {
+      cur_byte = (start + len) / FLOATFORMAT_CHAR_BIT;
+      cur_bitshift =
+       ((start + len) % FLOATFORMAT_CHAR_BIT) - FLOATFORMAT_CHAR_BIT;
+    }
+  if (cur_bitshift > -FLOATFORMAT_CHAR_BIT)
+    {
+      *(data + cur_byte) &=
+       ~(((1 << ((start + len) % FLOATFORMAT_CHAR_BIT)) - 1)
+         << (-cur_bitshift));
+      *(data + cur_byte) |=
+       (stuff_to_put & ((1 << FLOATFORMAT_CHAR_BIT) - 1)) << (-cur_bitshift);
+    }
   cur_bitshift += FLOATFORMAT_CHAR_BIT;
   if (order == floatformat_little || order == floatformat_littlebyte_bigword)
     ++cur_byte;
@@ -3409,12 +2581,10 @@ put_field (data, order, total_len, start, len, stuff_to_put)
    The range of the returned value is >= 0.5 and < 1.0.  This is equivalent to
    frexp, but operates on the long double data type.  */
 
-static long double ldfrexp PARAMS ((long double value, int *eptr));
+static long double ldfrexp (long double value, int *eptr);
 
 static long double
-ldfrexp (value, eptr)
-     long double value;
-     int *eptr;
+ldfrexp (long double value, int *eptr)
 {
   long double tmp;
   int exp;
@@ -3457,10 +2627,8 @@ ldfrexp (value, eptr)
    restrictions.  */
 
 void
-floatformat_from_doublest (fmt, from, to)
-     CONST struct floatformat *fmt;
-     DOUBLEST *from;
-     char *to;
+floatformat_from_doublest (CONST struct floatformat *fmt, DOUBLEST *from,
+                          char *to)
 {
   DOUBLEST dfrom;
   int exponent;
@@ -3470,7 +2638,8 @@ floatformat_from_doublest (fmt, from, to)
   unsigned char *uto = (unsigned char *) to;
 
   memcpy (&dfrom, from, sizeof (dfrom));
-  memset (uto, 0, fmt->totalsize / FLOATFORMAT_CHAR_BIT);
+  memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1) 
+                    / FLOATFORMAT_CHAR_BIT);
   if (dfrom == 0)
     return;                    /* Result is zero */
   if (dfrom != dfrom)          /* Result is NaN */
@@ -3519,7 +2688,7 @@ floatformat_from_doublest (fmt, from, to)
       mant_bits = mant_bits_left < 32 ? mant_bits_left : 32;
 
       mant *= 4294967296.0;
-      mant_long = (unsigned long) mant;
+      mant_long = ((unsigned long) mant) & 0xffffffffL;
       mant -= mant_long;
 
       /* If the integer bit is implicit, then we need to discard it.
@@ -3530,6 +2699,7 @@ floatformat_from_doublest (fmt, from, to)
          && fmt->intbit == floatformat_intbit_no)
        {
          mant_long <<= 1;
+         mant_long &= 0xffffffffL;
          mant_bits -= 1;
        }
 
@@ -3561,11 +2731,13 @@ floatformat_from_doublest (fmt, from, to)
     }
 }
 
+/* print routines to handle variable size regs, etc. */
+
 /* temporary storage using circular buffer */
 #define NUMCELLS 16
 #define CELLSIZE 32
 static char *
-get_cell ()
+get_cell (void)
 {
   static char buf[NUMCELLS][CELLSIZE];
   static int cell = 0;
@@ -3574,79 +2746,22 @@ get_cell ()
   return buf[cell];
 }
 
-/* print routines to handle variable size regs, etc.
-
-   FIXME: Note that t_addr is a bfd_vma, which is currently either an
-   unsigned long or unsigned long long, determined at configure time.
-   If t_addr is an unsigned long long and sizeof (unsigned long long)
-   is greater than sizeof (unsigned long), then I believe this code will
-   probably lose, at least for little endian machines.  I believe that
-   it would also be better to eliminate the switch on the absolute size
-   of t_addr and replace it with a sequence of if statements that compare
-   sizeof t_addr with sizeof the various types and do the right thing,
-   which includes knowing whether or not the host supports long long.
-   -fnf
-
- */
-
 int
 strlen_paddr (void)
 {
-  return (TARGET_PTR_BIT / 8 * 2);
+  return (TARGET_ADDR_BIT / 8 * 2);
 }
 
-
-/* eliminate warning from compiler on 32-bit systems */
-static int thirty_two = 32;
-
 char *
 paddr (CORE_ADDR addr)
 {
-  char *paddr_str = get_cell ();
-  switch (TARGET_PTR_BIT / 8)
-    {
-    case 8:
-      sprintf (paddr_str, "%08lx%08lx",
-              (unsigned long) (addr >> thirty_two), (unsigned long) (addr & 0xffffffff));
-      break;
-    case 4:
-      sprintf (paddr_str, "%08lx", (unsigned long) addr);
-      break;
-    case 2:
-      sprintf (paddr_str, "%04x", (unsigned short) (addr & 0xffff));
-      break;
-    default:
-      sprintf (paddr_str, "%lx", (unsigned long) addr);
-    }
-  return paddr_str;
+  return phex (addr, TARGET_ADDR_BIT / 8);
 }
 
 char *
 paddr_nz (CORE_ADDR addr)
 {
-  char *paddr_str = get_cell ();
-  switch (TARGET_PTR_BIT / 8)
-    {
-    case 8:
-      {
-       unsigned long high = (unsigned long) (addr >> thirty_two);
-       if (high == 0)
-         sprintf (paddr_str, "%lx", (unsigned long) (addr & 0xffffffff));
-       else
-         sprintf (paddr_str, "%lx%08lx",
-                  high, (unsigned long) (addr & 0xffffffff));
-       break;
-      }
-    case 4:
-      sprintf (paddr_str, "%lx", (unsigned long) addr);
-      break;
-    case 2:
-      sprintf (paddr_str, "%x", (unsigned short) (addr & 0xffff));
-      break;
-    default:
-      sprintf (paddr_str, "%lx", (unsigned long) addr);
-    }
-  return paddr_str;
+  return phex_nz (addr, TARGET_ADDR_BIT / 8);
 }
 
 static void
@@ -3701,71 +2816,79 @@ paddr_d (LONGEST addr)
   return paddr_str;
 }
 
+/* eliminate warning from compiler on 32-bit systems */
+static int thirty_two = 32;
+
 char *
-preg (reg)
-     t_reg reg;
+phex (ULONGEST l, int sizeof_l)
 {
-  char *preg_str = get_cell ();
-  switch (sizeof (t_reg))
+  char *str = get_cell ();
+  switch (sizeof_l)
     {
     case 8:
-      sprintf (preg_str, "%08lx%08lx",
-              (unsigned long) (reg >> thirty_two), (unsigned long) (reg & 0xffffffff));
+      sprintf (str, "%08lx%08lx",
+              (unsigned long) (l >> thirty_two),
+              (unsigned long) (l & 0xffffffff));
       break;
     case 4:
-      sprintf (preg_str, "%08lx", (unsigned long) reg);
+      sprintf (str, "%08lx", (unsigned long) l);
       break;
     case 2:
-      sprintf (preg_str, "%04x", (unsigned short) (reg & 0xffff));
+      sprintf (str, "%04x", (unsigned short) (l & 0xffff));
       break;
     default:
-      sprintf (preg_str, "%lx", (unsigned long) reg);
+      phex (l, sizeof (l));
+      break;
     }
-  return preg_str;
+  return str;
 }
 
 char *
-preg_nz (reg)
-     t_reg reg;
+phex_nz (ULONGEST l, int sizeof_l)
 {
-  char *preg_str = get_cell ();
-  switch (sizeof (t_reg))
+  char *str = get_cell ();
+  switch (sizeof_l)
     {
     case 8:
       {
-       unsigned long high = (unsigned long) (reg >> thirty_two);
+       unsigned long high = (unsigned long) (l >> thirty_two);
        if (high == 0)
-         sprintf (preg_str, "%lx", (unsigned long) (reg & 0xffffffff));
+         sprintf (str, "%lx", (unsigned long) (l & 0xffffffff));
        else
-         sprintf (preg_str, "%lx%08lx",
-                  high, (unsigned long) (reg & 0xffffffff));
+         sprintf (str, "%lx%08lx",
+                  high, (unsigned long) (l & 0xffffffff));
        break;
       }
     case 4:
-      sprintf (preg_str, "%lx", (unsigned long) reg);
+      sprintf (str, "%lx", (unsigned long) l);
       break;
     case 2:
-      sprintf (preg_str, "%x", (unsigned short) (reg & 0xffff));
+      sprintf (str, "%x", (unsigned short) (l & 0xffff));
       break;
     default:
-      sprintf (preg_str, "%lx", (unsigned long) reg);
+      phex_nz (l, sizeof (l));
+      break;
     }
-  return preg_str;
+  return str;
 }
 
-/* Helper functions for INNER_THAN */
-int
-core_addr_lessthan (lhs, rhs)
-     CORE_ADDR lhs;
-     CORE_ADDR rhs;
+
+/* Convert to / from the hosts pointer to GDB's internal CORE_ADDR
+   using the target's conversion routines. */
+CORE_ADDR
+host_pointer_to_address (void *ptr)
 {
-  return (lhs < rhs);
+  if (sizeof (ptr) != TYPE_LENGTH (builtin_type_ptr))
+    internal_error ("core_addr_to_void_ptr: bad cast");
+  return POINTER_TO_ADDRESS (builtin_type_ptr, &ptr);
 }
 
-int
-core_addr_greaterthan (lhs, rhs)
-     CORE_ADDR lhs;
-     CORE_ADDR rhs;
+void *
+address_to_host_pointer (CORE_ADDR addr)
 {
-  return (lhs > rhs);
+  void *ptr;
+  if (sizeof (ptr) != TYPE_LENGTH (builtin_type_ptr))
+    internal_error ("core_addr_to_void_ptr: bad cast");
+  ADDRESS_TO_POINTER (builtin_type_ptr, &ptr, addr);
+  return ptr;
 }
This page took 0.049242 seconds and 4 git commands to generate.