/* 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
#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. */
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));
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);
}
}
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;
/* 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;
}
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
/* 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;
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;
(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;
{
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;
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;
(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;
{
continuation_ptr = intermediate_continuation;
intermediate_continuation = continuation_ptr->next;
- free (continuation_ptr);
+ xfree (continuation_ptr);
}
}
Is this anything other than a historical accident? */
void
-warning_begin ()
+warning_begin (void)
{
target_terminal_ours ();
wrap_here (""); /* Force out any buffered output */
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 ();
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 ();
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);
}
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);
}
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 */
}
/* 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);
/* 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
{
va_list ap;
va_start (ap, string);
+
internal_verror (string, ap);
va_end (ap);
}
printable string. */
char *
-safe_strerror (errnum)
- int errnum;
+safe_strerror (int errnum)
{
char *msg;
static char buf[32];
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;
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;
/* Control C eventually causes this to be called, at a convenient time. */
void
-quit ()
+quit (void)
{
serial_t gdb_stdout_serial = serial_fdopen (1);
*/
void
-notice_quit ()
+notice_quit (void)
{
int k = win32pollquit ();
if (k == 1)
#else /* !defined(_MSC_VER) */
void
-notice_quit ()
+notice_quit (void)
{
/* Done by signals */
}
/* 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
#if !defined (USE_MMALLOC)
PTR
-mmalloc (md, size)
- PTR md;
- size_t size;
+mcalloc (PTR md, size_t number, size_t size)
+{
+ return calloc (number, size);
+}
+
+PTR
+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);
}
void
-mfree (md, ptr)
- PTR md;
- PTR ptr;
+mfree (PTR md, PTR ptr)
{
- free (ptr);
+ xfree (ptr);
}
#endif /* USE_MMALLOC */
#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 ();
#endif
void
-init_malloc (md)
- PTR md;
+init_malloc (void *md)
{
if (!mmcheckf (md, malloc_botch, MMCHECK_FORCE))
{
memory requested in SIZE. */
NORETURN void
-nomem (size)
- long size;
+nomem (long size)
{
if (size > 0)
{
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;
/* 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;
the caller wanting to allocate zero bytes. */
PTR
-xmalloc (size)
- size_t size;
+xmalloc (size_t size)
{
return (xmmalloc ((PTR) NULL, size));
}
+/* Like calloc but get error if no storage available */
+
+PTR
+xcalloc (size_t number, size_t size)
+{
+ void *mem = mcalloc (NULL, number, size);
+ if (mem == NULL)
+ nomem (number * size);
+ return mem;
+}
+
/* 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;
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);
}
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);
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);
}
/* 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
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)
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 */
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++)
/* 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;
/* Inialize the lines and chars per page */
void
-init_page_info ()
+init_page_info (void)
{
#if defined(TUI)
if (tui_version && m_winPtrNotNull (cmdWin))
#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 ();
/* 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 ();
}
to continue by pressing RETURN. */
static void
-prompt_for_continue ()
+prompt_for_continue (void)
{
char *ignore;
char cont_prompt[120];
else
async_request_quit (0);
}
- free (ignore);
+ xfree (ignore);
}
immediate_quit--;
/* Reinitialize filter; ie. tell it to reset to original values. */
void
-reinitialize_more_filter ()
+reinitialize_more_filter (void)
{
lines_printed = 0;
chars_printed = 0;
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)
line. Otherwise do nothing. */
void
-begin_line ()
+begin_line (void)
{
if (chars_printed > 0)
{
}
-/* ``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
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;
}
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];
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;
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);
}
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);
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);
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);
}
/* 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;
if (n > max_spaces)
{
if (spaces)
- free (spaces);
+ xfree (spaces);
spaces = (char *) xmalloc (n + 1);
for (t = spaces + n; t != spaces;)
*--t = ' ';
/* 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);
}
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;
fputs_filtered (demangled ? demangled : name, stream);
if (demangled != NULL)
{
- free (demangled);
+ xfree (demangled);
}
}
}
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'))
{
** 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 &&
}
-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;
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);
var_boolean, (char *) &pagination_enabled,
"Set state of pagination.", &setlist),
&showlist);
+
if (xdb_commands)
{
add_com ("am", class_support, pagination_on_command,
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;
/* 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;
}
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;
*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;
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;
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;
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 */
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.
&& fmt->intbit == floatformat_intbit_no)
{
mant_long <<= 1;
+ mant_long &= 0xffffffffL;
mant_bits -= 1;
}
}
}
+/* 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;
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
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;
}