1991-03-29 00:26:26 +08:00
|
|
|
|
/* General utility routines for GDB, the GNU debugger.
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
Copyright 1986, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
This file is part of GDB.
|
|
|
|
|
|
1991-08-16 10:49:30 +09:00
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
1991-03-29 00:26:26 +08:00
|
|
|
|
it under the terms of the GNU General Public License as published by
|
1991-08-16 10:49:30 +09:00
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
(at your option) any later version.
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
1991-08-16 10:49:30 +09:00
|
|
|
|
This program is distributed in the hope that it will be useful,
|
1991-03-29 00:26:26 +08:00
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
1991-08-16 10:49:30 +09:00
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
1992-03-04 07:26:26 +08:00
|
|
|
|
#include "defs.h"
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
#if !defined(__GO32__)
|
1991-03-29 00:26:26 +08:00
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
|
#include <sys/param.h>
|
|
|
|
|
#include <pwd.h>
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
#endif
|
1991-10-24 18:38:56 +08:00
|
|
|
|
#include <varargs.h>
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
#include "signals.h"
|
|
|
|
|
#include "gdbcmd.h"
|
1993-09-29 00:23:44 +08:00
|
|
|
|
#include "serial.h"
|
|
|
|
|
#if 0
|
|
|
|
|
/* No longer needed, I suspect. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
#include "terminal.h"
|
1993-09-29 00:23:44 +08:00
|
|
|
|
#endif
|
1991-03-29 00:26:26 +08:00
|
|
|
|
#include "bfd.h"
|
|
|
|
|
#include "target.h"
|
1992-05-13 05:32:52 +08:00
|
|
|
|
#include "demangle.h"
|
1993-03-12 01:44:39 +08:00
|
|
|
|
#include "expression.h"
|
|
|
|
|
#include "language.h"
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
/* Prototypes for local functions */
|
|
|
|
|
|
1993-04-15 17:41:59 +08:00
|
|
|
|
#if defined (NO_MMALLOC) || defined (NO_MMALLOC_CHECK)
|
|
|
|
|
#else
|
1992-03-27 09:04:14 +08:00
|
|
|
|
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
static void
|
|
|
|
|
malloc_botch PARAMS ((void));
|
1992-03-27 09:04:14 +08:00
|
|
|
|
|
1993-04-15 17:41:59 +08:00
|
|
|
|
#endif /* NO_MMALLOC, etc */
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
fatal_dump_core (); /* Can't prototype with <varargs.h> usage... */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
prompt_for_continue PARAMS ((void));
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
set_width_command PARAMS ((char *, int, struct cmd_list_element *));
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
/* If this definition isn't overridden by the header files, assume
|
|
|
|
|
that isatty and fileno exist on this system. */
|
|
|
|
|
#ifndef ISATTY
|
|
|
|
|
#define ISATTY(FP) (isatty (fileno (FP)))
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* Chain of cleanup actions established with make_cleanup,
|
|
|
|
|
to be executed if an error happens. */
|
|
|
|
|
|
|
|
|
|
static struct cleanup *cleanup_chain;
|
|
|
|
|
|
|
|
|
|
/* Nonzero means a quit has been requested. */
|
|
|
|
|
|
|
|
|
|
int quit_flag;
|
|
|
|
|
|
1993-09-29 00:23:44 +08:00
|
|
|
|
/* Nonzero means quit immediately if Control-C is typed now, rather
|
|
|
|
|
than waiting until QUIT is executed. Be careful in setting this;
|
|
|
|
|
code which executes with immediate_quit set has to be very careful
|
|
|
|
|
about being able to deal with being interrupted at any time. It is
|
|
|
|
|
almost always better to use QUIT; the only exception I can think of
|
|
|
|
|
is being able to quit out of a system call (using EINTR loses if
|
|
|
|
|
the SIGINT happens between the previous QUIT and the system call).
|
|
|
|
|
To immediately quit in the case in which a SIGINT happens between
|
|
|
|
|
the previous QUIT and setting immediate_quit (desirable anytime we
|
|
|
|
|
expect to block), call QUIT after setting immediate_quit. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
int immediate_quit;
|
|
|
|
|
|
|
|
|
|
/* Nonzero means that encoded C++ names should be printed out in their
|
|
|
|
|
C++ form rather than raw. */
|
|
|
|
|
|
|
|
|
|
int demangle = 1;
|
|
|
|
|
|
|
|
|
|
/* Nonzero means that encoded C++ names should be printed out in their
|
|
|
|
|
C++ form even in assembler language displays. If this is set, but
|
|
|
|
|
DEMANGLE is zero, names are printed raw, i.e. DEMANGLE controls. */
|
|
|
|
|
|
|
|
|
|
int asm_demangle = 0;
|
|
|
|
|
|
|
|
|
|
/* Nonzero means that strings with character values >0x7F should be printed
|
|
|
|
|
as octal escapes. Zero means just print the value (e.g. it's an
|
|
|
|
|
international character, and the terminal or window can cope.) */
|
|
|
|
|
|
|
|
|
|
int sevenbit_strings = 0;
|
1991-09-10 17:56:09 +09:00
|
|
|
|
|
|
|
|
|
/* String to be printed before error messages, if any. */
|
|
|
|
|
|
|
|
|
|
char *error_pre_print;
|
1992-03-27 09:04:14 +08:00
|
|
|
|
char *warning_pre_print = "\nwarning: ";
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
/* Add a new cleanup to the cleanup_chain,
|
|
|
|
|
and return the previous chain pointer
|
|
|
|
|
to be passed later to do_cleanups or discard_cleanups.
|
|
|
|
|
Args are FUNCTION to clean up with, and ARG to pass to it. */
|
|
|
|
|
|
|
|
|
|
struct cleanup *
|
|
|
|
|
make_cleanup (function, arg)
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
void (*function) PARAMS ((PTR));
|
|
|
|
|
PTR arg;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
|
|
|
|
register struct cleanup *new
|
|
|
|
|
= (struct cleanup *) xmalloc (sizeof (struct cleanup));
|
|
|
|
|
register struct cleanup *old_chain = cleanup_chain;
|
|
|
|
|
|
|
|
|
|
new->next = cleanup_chain;
|
|
|
|
|
new->function = function;
|
|
|
|
|
new->arg = arg;
|
|
|
|
|
cleanup_chain = new;
|
|
|
|
|
|
|
|
|
|
return old_chain;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Discard cleanups and do the actions they describe
|
|
|
|
|
until we get back to the point OLD_CHAIN in the cleanup_chain. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
do_cleanups (old_chain)
|
|
|
|
|
register struct cleanup *old_chain;
|
|
|
|
|
{
|
|
|
|
|
register struct cleanup *ptr;
|
|
|
|
|
while ((ptr = cleanup_chain) != old_chain)
|
|
|
|
|
{
|
1991-08-20 12:02:39 +09:00
|
|
|
|
cleanup_chain = ptr->next; /* Do this first incase recursion */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
(*ptr->function) (ptr->arg);
|
|
|
|
|
free (ptr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Discard cleanups, not doing the actions they describe,
|
|
|
|
|
until we get back to the point OLD_CHAIN in the cleanup_chain. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
discard_cleanups (old_chain)
|
|
|
|
|
register struct cleanup *old_chain;
|
|
|
|
|
{
|
|
|
|
|
register struct cleanup *ptr;
|
|
|
|
|
while ((ptr = cleanup_chain) != old_chain)
|
|
|
|
|
{
|
|
|
|
|
cleanup_chain = ptr->next;
|
1992-03-30 07:26:47 +08:00
|
|
|
|
free ((PTR)ptr);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set the cleanup_chain to 0, and return the old cleanup chain. */
|
|
|
|
|
struct cleanup *
|
|
|
|
|
save_cleanups ()
|
|
|
|
|
{
|
|
|
|
|
struct cleanup *old_chain = cleanup_chain;
|
|
|
|
|
|
|
|
|
|
cleanup_chain = 0;
|
|
|
|
|
return old_chain;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Restore the cleanup chain from a previously saved chain. */
|
|
|
|
|
void
|
|
|
|
|
restore_cleanups (chain)
|
|
|
|
|
struct cleanup *chain;
|
|
|
|
|
{
|
|
|
|
|
cleanup_chain = chain;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This function is useful for cleanups.
|
|
|
|
|
Do
|
|
|
|
|
|
|
|
|
|
foo = xmalloc (...);
|
|
|
|
|
old_chain = make_cleanup (free_current_contents, &foo);
|
|
|
|
|
|
|
|
|
|
to arrange to free the object thus allocated. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
free_current_contents (location)
|
|
|
|
|
char **location;
|
|
|
|
|
{
|
|
|
|
|
free (*location);
|
|
|
|
|
}
|
1992-02-21 03:23:42 +08:00
|
|
|
|
|
|
|
|
|
/* Provide a known function that does nothing, to use as a base for
|
|
|
|
|
for a possibly long chain of cleanups. This is useful where we
|
|
|
|
|
use the cleanup chain for handling normal cleanups as well as dealing
|
|
|
|
|
with cleanups that need to be done as a result of a call to error().
|
|
|
|
|
In such cases, we may not be certain where the first cleanup is, unless
|
|
|
|
|
we have a do-nothing one to always use as the base. */
|
|
|
|
|
|
|
|
|
|
/* ARGSUSED */
|
|
|
|
|
void
|
|
|
|
|
null_cleanup (arg)
|
|
|
|
|
char **arg;
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
1991-10-24 18:38:56 +08:00
|
|
|
|
/* Provide a hook for modules wishing to print their own warning messages
|
|
|
|
|
to set up the terminal state in a compatible way, without them having
|
|
|
|
|
to import all the target_<...> macros. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
warning_setup ()
|
|
|
|
|
{
|
|
|
|
|
target_terminal_ours ();
|
|
|
|
|
wrap_here(""); /* Force out any buffered output */
|
|
|
|
|
fflush (stdout);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print a warning message.
|
|
|
|
|
The first argument STRING is the warning message, used as a fprintf string,
|
|
|
|
|
and the remaining args are passed as arguments to it.
|
|
|
|
|
The primary difference between warnings and errors is that a warning
|
|
|
|
|
does not force the return to command level. */
|
|
|
|
|
|
|
|
|
|
/* VARARGS */
|
|
|
|
|
void
|
|
|
|
|
warning (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
char *string;
|
|
|
|
|
|
|
|
|
|
va_start (args);
|
|
|
|
|
target_terminal_ours ();
|
|
|
|
|
wrap_here(""); /* Force out any buffered output */
|
|
|
|
|
fflush (stdout);
|
|
|
|
|
if (warning_pre_print)
|
|
|
|
|
fprintf (stderr, warning_pre_print);
|
|
|
|
|
string = va_arg (args, char *);
|
|
|
|
|
vfprintf (stderr, string, args);
|
|
|
|
|
fprintf (stderr, "\n");
|
|
|
|
|
va_end (args);
|
|
|
|
|
}
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
/* Print an error message and return to command level.
|
|
|
|
|
The first argument STRING is the error message, used as a fprintf string,
|
|
|
|
|
and the remaining args are passed as arguments to it. */
|
|
|
|
|
|
|
|
|
|
/* VARARGS */
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
NORETURN void
|
1991-03-29 00:26:26 +08:00
|
|
|
|
error (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
char *string;
|
|
|
|
|
|
|
|
|
|
va_start (args);
|
|
|
|
|
target_terminal_ours ();
|
1991-10-24 18:38:56 +08:00
|
|
|
|
wrap_here(""); /* Force out any buffered output */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
fflush (stdout);
|
1991-09-10 17:56:09 +09:00
|
|
|
|
if (error_pre_print)
|
1992-05-13 05:32:52 +08:00
|
|
|
|
fprintf_filtered (stderr, error_pre_print);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
string = va_arg (args, char *);
|
1992-05-13 05:32:52 +08:00
|
|
|
|
vfprintf_filtered (stderr, string, args);
|
|
|
|
|
fprintf_filtered (stderr, "\n");
|
1991-03-29 00:26:26 +08:00
|
|
|
|
va_end (args);
|
1993-09-29 00:23:44 +08:00
|
|
|
|
return_to_top_level (RETURN_ERROR);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print an error message and exit reporting failure.
|
|
|
|
|
This is for a error that we cannot continue from.
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
The arguments are printed a la printf.
|
|
|
|
|
|
|
|
|
|
This function cannot be declared volatile (NORETURN) in an
|
|
|
|
|
ANSI environment because exit() is not declared volatile. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
/* VARARGS */
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
NORETURN void
|
1991-03-29 00:26:26 +08:00
|
|
|
|
fatal (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
char *string;
|
|
|
|
|
|
|
|
|
|
va_start (args);
|
|
|
|
|
string = va_arg (args, char *);
|
1992-03-27 09:04:14 +08:00
|
|
|
|
fprintf (stderr, "\ngdb: ");
|
1991-03-29 00:26:26 +08:00
|
|
|
|
vfprintf (stderr, string, args);
|
|
|
|
|
fprintf (stderr, "\n");
|
|
|
|
|
va_end (args);
|
|
|
|
|
exit (1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print an error message and exit, dumping core.
|
|
|
|
|
The arguments are printed a la printf (). */
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
/* VARARGS */
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
static void
|
1991-03-29 00:26:26 +08:00
|
|
|
|
fatal_dump_core (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
char *string;
|
|
|
|
|
|
|
|
|
|
va_start (args);
|
|
|
|
|
string = va_arg (args, char *);
|
|
|
|
|
/* "internal error" is always correct, since GDB should never dump
|
|
|
|
|
core, no matter what the input. */
|
1992-03-27 09:04:14 +08:00
|
|
|
|
fprintf (stderr, "\ngdb internal error: ");
|
1991-03-29 00:26:26 +08:00
|
|
|
|
vfprintf (stderr, string, args);
|
|
|
|
|
fprintf (stderr, "\n");
|
|
|
|
|
va_end (args);
|
|
|
|
|
|
|
|
|
|
signal (SIGQUIT, SIG_DFL);
|
|
|
|
|
kill (getpid (), SIGQUIT);
|
|
|
|
|
/* We should never get here, but just in case... */
|
|
|
|
|
exit (1);
|
|
|
|
|
}
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
|
1992-04-23 00:46:47 +08:00
|
|
|
|
/* The strerror() function can return NULL for errno values that are
|
|
|
|
|
out of range. Provide a "safe" version that always returns a
|
|
|
|
|
printable string. */
|
|
|
|
|
|
|
|
|
|
char *
|
|
|
|
|
safe_strerror (errnum)
|
|
|
|
|
int errnum;
|
|
|
|
|
{
|
|
|
|
|
char *msg;
|
|
|
|
|
static char buf[32];
|
|
|
|
|
|
|
|
|
|
if ((msg = strerror (errnum)) == NULL)
|
|
|
|
|
{
|
|
|
|
|
sprintf (buf, "(undocumented errno %d)", errnum);
|
|
|
|
|
msg = buf;
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
/* 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. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
perror_with_name (string)
|
|
|
|
|
char *string;
|
|
|
|
|
{
|
|
|
|
|
char *err;
|
|
|
|
|
char *combined;
|
|
|
|
|
|
1992-04-23 00:46:47 +08:00
|
|
|
|
err = safe_strerror (errno);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
combined = (char *) alloca (strlen (err) + strlen (string) + 3);
|
|
|
|
|
strcpy (combined, string);
|
|
|
|
|
strcat (combined, ": ");
|
|
|
|
|
strcat (combined, err);
|
|
|
|
|
|
|
|
|
|
/* I understand setting these is a matter of taste. Still, some people
|
|
|
|
|
may clear errno but not know about bfd_error. Doing this here is not
|
|
|
|
|
unreasonable. */
|
|
|
|
|
bfd_error = no_error;
|
|
|
|
|
errno = 0;
|
|
|
|
|
|
|
|
|
|
error ("%s.", combined);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print the system error message for ERRCODE, and also mention STRING
|
|
|
|
|
as the file name for which the error was encountered. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
print_sys_errmsg (string, errcode)
|
|
|
|
|
char *string;
|
|
|
|
|
int errcode;
|
|
|
|
|
{
|
|
|
|
|
char *err;
|
|
|
|
|
char *combined;
|
|
|
|
|
|
1992-04-23 00:46:47 +08:00
|
|
|
|
err = safe_strerror (errcode);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
combined = (char *) alloca (strlen (err) + strlen (string) + 3);
|
|
|
|
|
strcpy (combined, string);
|
|
|
|
|
strcat (combined, ": ");
|
|
|
|
|
strcat (combined, err);
|
|
|
|
|
|
1992-05-13 05:32:52 +08:00
|
|
|
|
fprintf (stderr, "%s.\n", combined);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Control C eventually causes this to be called, at a convenient time. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
quit ()
|
|
|
|
|
{
|
1993-09-29 00:23:44 +08:00
|
|
|
|
serial_t stdout_serial = serial_fdopen (1);
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
target_terminal_ours ();
|
1991-05-30 17:52:52 +09:00
|
|
|
|
wrap_here ((char *)0); /* Force out any pending output */
|
1993-09-29 00:23:44 +08:00
|
|
|
|
|
|
|
|
|
SERIAL_FLUSH_OUTPUT (stdout_serial);
|
|
|
|
|
|
|
|
|
|
SERIAL_UN_FDOPEN (stdout_serial);
|
|
|
|
|
|
|
|
|
|
/* Don't use *_filtered; we don't want to prompt the user to continue. */
|
|
|
|
|
if (error_pre_print)
|
|
|
|
|
fprintf (stderr, error_pre_print);
|
|
|
|
|
|
|
|
|
|
if (job_control
|
|
|
|
|
/* If there is no terminal switching for this target, then we can't
|
|
|
|
|
possibly get screwed by the lack of job control. */
|
|
|
|
|
|| current_target->to_terminal_ours == NULL)
|
|
|
|
|
fprintf (stderr, "Quit\n");
|
|
|
|
|
else
|
|
|
|
|
fprintf (stderr,
|
|
|
|
|
"Quit (expect signal SIGINT when the program is resumed)\n");
|
|
|
|
|
return_to_top_level (RETURN_QUIT);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
1993-03-12 01:44:39 +08:00
|
|
|
|
|
|
|
|
|
#ifdef __GO32__
|
|
|
|
|
|
|
|
|
|
/* In the absence of signals, poll keyboard for a quit.
|
|
|
|
|
Called from #define QUIT pollquit() in xm-go32.h. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
pollquit()
|
|
|
|
|
{
|
|
|
|
|
if (kbhit ())
|
|
|
|
|
{
|
|
|
|
|
int k = getkey ();
|
|
|
|
|
if (k == 1)
|
|
|
|
|
quit_flag = 1;
|
|
|
|
|
else if (k == 2)
|
|
|
|
|
immediate_quit = 1;
|
|
|
|
|
quit ();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
/* Control C comes here */
|
|
|
|
|
|
|
|
|
|
void
|
1992-02-21 03:23:42 +08:00
|
|
|
|
request_quit (signo)
|
|
|
|
|
int signo;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
|
|
|
|
quit_flag = 1;
|
|
|
|
|
|
|
|
|
|
#ifdef USG
|
|
|
|
|
/* Restore the signal handler. */
|
1992-02-21 03:23:42 +08:00
|
|
|
|
signal (signo, request_quit);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (immediate_quit)
|
|
|
|
|
quit ();
|
|
|
|
|
}
|
1992-03-27 09:04:14 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Memory management stuff (malloc friends). */
|
|
|
|
|
|
|
|
|
|
#if defined (NO_MMALLOC)
|
|
|
|
|
|
|
|
|
|
PTR
|
|
|
|
|
mmalloc (md, size)
|
|
|
|
|
PTR md;
|
|
|
|
|
long size;
|
|
|
|
|
{
|
|
|
|
|
return (malloc (size));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PTR
|
|
|
|
|
mrealloc (md, ptr, size)
|
|
|
|
|
PTR md;
|
|
|
|
|
PTR ptr;
|
|
|
|
|
long size;
|
|
|
|
|
{
|
1992-04-23 00:46:47 +08:00
|
|
|
|
if (ptr == 0) /* Guard against old realloc's */
|
|
|
|
|
return malloc (size);
|
|
|
|
|
else
|
|
|
|
|
return realloc (ptr, size);
|
1992-03-27 09:04:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
mfree (md, ptr)
|
|
|
|
|
PTR md;
|
|
|
|
|
PTR ptr;
|
|
|
|
|
{
|
|
|
|
|
free (ptr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* NO_MMALLOC */
|
|
|
|
|
|
|
|
|
|
#if defined (NO_MMALLOC) || defined (NO_MMALLOC_CHECK)
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
init_malloc (md)
|
|
|
|
|
PTR md;
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#else /* have mmalloc and want corruption checking */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
malloc_botch ()
|
|
|
|
|
{
|
|
|
|
|
fatal_dump_core ("Memory corruption");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Attempt to install hooks in mmalloc/mrealloc/mfree for the heap specified
|
|
|
|
|
by MD, to detect memory corruption. Note that MD may be NULL to specify
|
|
|
|
|
the default heap that grows via sbrk.
|
|
|
|
|
|
|
|
|
|
Note that for freshly created regions, we must call mmcheck prior to any
|
|
|
|
|
mallocs in the region. Otherwise, any region which was allocated prior to
|
|
|
|
|
installing the checking hooks, which is later reallocated or freed, will
|
|
|
|
|
fail the checks! The mmcheck function only allows initial hooks to be
|
|
|
|
|
installed before the first mmalloc. However, anytime after we have called
|
|
|
|
|
mmcheck the first time to install the checking hooks, we can call it again
|
|
|
|
|
to update the function pointer to the memory corruption handler.
|
|
|
|
|
|
|
|
|
|
Returns zero on failure, non-zero on success. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
init_malloc (md)
|
|
|
|
|
PTR md;
|
|
|
|
|
{
|
|
|
|
|
if (!mmcheck (md, malloc_botch))
|
|
|
|
|
{
|
|
|
|
|
warning ("internal error: failed to install memory consistency checks");
|
|
|
|
|
}
|
|
|
|
|
|
* breakpoint.c, buildsym.c, c-exp.y, coffread.c, command.c,
core.c, cplus-dem.c, dbxread.c, dwarfread.c, elfread.c, environ.c,
eval.c, findvar.c, gdbtypes.c, hppabsd-tdep.c, hppahpux-tdep.c,
i386-tdep.c, ieee-float.c, infcmd.c, inflow.c, infptrace.c,
infrun.c, m2-exp.y, mipsread.c, objfiles.c, parse.c, procfs.c,
putenv.c, remote-mm.c, remote-vx.c, solib.c, sparc-tdep.c,
sparc-xdep.c, stack.c, symfile.c, symtab.c, symtab.h, target.c,
tm-i386v.h, tm-sparc.h, utils.c, valarith.c, valops.c, valprint.c,
values.c, xcoffread.c:
Remove "(void)" casts from function calls where the return value
is ignored, in accordance with GNU coding standards.
1992-07-04 11:22:08 +08:00
|
|
|
|
mmtrace ();
|
1992-03-27 09:04:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* Have mmalloc and want corruption checking */
|
|
|
|
|
|
|
|
|
|
/* Called when a memory allocation fails, with the number of bytes of
|
|
|
|
|
memory requested in SIZE. */
|
|
|
|
|
|
|
|
|
|
NORETURN void
|
|
|
|
|
nomem (size)
|
|
|
|
|
long size;
|
|
|
|
|
{
|
|
|
|
|
if (size > 0)
|
|
|
|
|
{
|
|
|
|
|
fatal ("virtual memory exhausted: can't allocate %ld bytes.", size);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
fatal ("virtual memory exhausted.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Like mmalloc but get error if no storage available, and protect against
|
|
|
|
|
the caller wanting to allocate zero bytes. Whether to return NULL for
|
|
|
|
|
a zero byte request, or translate the request into a request for one
|
|
|
|
|
byte of zero'd storage, is a religious issue. */
|
|
|
|
|
|
|
|
|
|
PTR
|
|
|
|
|
xmmalloc (md, size)
|
|
|
|
|
PTR md;
|
|
|
|
|
long size;
|
|
|
|
|
{
|
|
|
|
|
register PTR val;
|
|
|
|
|
|
|
|
|
|
if (size == 0)
|
|
|
|
|
{
|
|
|
|
|
val = NULL;
|
|
|
|
|
}
|
|
|
|
|
else if ((val = mmalloc (md, size)) == NULL)
|
|
|
|
|
{
|
|
|
|
|
nomem (size);
|
|
|
|
|
}
|
|
|
|
|
return (val);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Like mrealloc but get error if no storage available. */
|
|
|
|
|
|
|
|
|
|
PTR
|
|
|
|
|
xmrealloc (md, ptr, size)
|
|
|
|
|
PTR md;
|
|
|
|
|
PTR ptr;
|
|
|
|
|
long size;
|
|
|
|
|
{
|
|
|
|
|
register PTR val;
|
|
|
|
|
|
|
|
|
|
if (ptr != NULL)
|
|
|
|
|
{
|
|
|
|
|
val = mrealloc (md, ptr, size);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
val = mmalloc (md, size);
|
|
|
|
|
}
|
|
|
|
|
if (val == NULL)
|
|
|
|
|
{
|
|
|
|
|
nomem (size);
|
|
|
|
|
}
|
|
|
|
|
return (val);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Like malloc but get error if no storage available, and protect against
|
|
|
|
|
the caller wanting to allocate zero bytes. */
|
|
|
|
|
|
|
|
|
|
PTR
|
|
|
|
|
xmalloc (size)
|
|
|
|
|
long size;
|
|
|
|
|
{
|
|
|
|
|
return (xmmalloc ((void *) NULL, size));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Like mrealloc but get error if no storage available. */
|
|
|
|
|
|
|
|
|
|
PTR
|
|
|
|
|
xrealloc (ptr, size)
|
|
|
|
|
PTR ptr;
|
|
|
|
|
long size;
|
|
|
|
|
{
|
|
|
|
|
return (xmrealloc ((void *) NULL, ptr, size));
|
|
|
|
|
}
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
|
{
|
|
|
|
|
register int val;
|
|
|
|
|
int orglen = len;
|
|
|
|
|
|
|
|
|
|
while (len > 0)
|
|
|
|
|
{
|
|
|
|
|
val = read (desc, addr, len);
|
|
|
|
|
if (val < 0)
|
|
|
|
|
return val;
|
|
|
|
|
if (val == 0)
|
|
|
|
|
return orglen - len;
|
|
|
|
|
len -= val;
|
|
|
|
|
addr += val;
|
|
|
|
|
}
|
|
|
|
|
return orglen;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make a copy of the string at PTR with SIZE characters
|
|
|
|
|
(and add a null character at the end in the copy).
|
|
|
|
|
Uses malloc to get the space. Returns the address of the copy. */
|
|
|
|
|
|
|
|
|
|
char *
|
|
|
|
|
savestring (ptr, size)
|
1992-02-21 03:23:42 +08:00
|
|
|
|
const char *ptr;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
int size;
|
|
|
|
|
{
|
|
|
|
|
register char *p = (char *) xmalloc (size + 1);
|
* breakpoint.c, buildsym.c, c-exp.y, coffread.c, command.c,
core.c, cplus-dem.c, dbxread.c, dwarfread.c, elfread.c, environ.c,
eval.c, findvar.c, gdbtypes.c, hppabsd-tdep.c, hppahpux-tdep.c,
i386-tdep.c, ieee-float.c, infcmd.c, inflow.c, infptrace.c,
infrun.c, m2-exp.y, mipsread.c, objfiles.c, parse.c, procfs.c,
putenv.c, remote-mm.c, remote-vx.c, solib.c, sparc-tdep.c,
sparc-xdep.c, stack.c, symfile.c, symtab.c, symtab.h, target.c,
tm-i386v.h, tm-sparc.h, utils.c, valarith.c, valops.c, valprint.c,
values.c, xcoffread.c:
Remove "(void)" casts from function calls where the return value
is ignored, in accordance with GNU coding standards.
1992-07-04 11:22:08 +08:00
|
|
|
|
memcpy (p, ptr, size);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
p[size] = 0;
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
1992-03-27 09:04:14 +08:00
|
|
|
|
char *
|
|
|
|
|
msavestring (md, ptr, size)
|
|
|
|
|
void *md;
|
|
|
|
|
const char *ptr;
|
|
|
|
|
int size;
|
|
|
|
|
{
|
|
|
|
|
register char *p = (char *) xmmalloc (md, size + 1);
|
* breakpoint.c, buildsym.c, c-exp.y, coffread.c, command.c,
core.c, cplus-dem.c, dbxread.c, dwarfread.c, elfread.c, environ.c,
eval.c, findvar.c, gdbtypes.c, hppabsd-tdep.c, hppahpux-tdep.c,
i386-tdep.c, ieee-float.c, infcmd.c, inflow.c, infptrace.c,
infrun.c, m2-exp.y, mipsread.c, objfiles.c, parse.c, procfs.c,
putenv.c, remote-mm.c, remote-vx.c, solib.c, sparc-tdep.c,
sparc-xdep.c, stack.c, symfile.c, symtab.c, symtab.h, target.c,
tm-i386v.h, tm-sparc.h, utils.c, valarith.c, valops.c, valprint.c,
values.c, xcoffread.c:
Remove "(void)" casts from function calls where the return value
is ignored, in accordance with GNU coding standards.
1992-07-04 11:22:08 +08:00
|
|
|
|
memcpy (p, ptr, size);
|
1992-03-27 09:04:14 +08:00
|
|
|
|
p[size] = 0;
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
1991-05-03 15:02:03 +09:00
|
|
|
|
/* The "const" is so it compiles under DGUX (which prototypes strsave
|
|
|
|
|
in <string.h>. FIXME: This should be named "xstrsave", shouldn't it?
|
|
|
|
|
Doesn't real strsave return NULL if out of memory? */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
char *
|
|
|
|
|
strsave (ptr)
|
1991-05-03 15:02:03 +09:00
|
|
|
|
const char *ptr;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
|
|
|
|
return savestring (ptr, strlen (ptr));
|
|
|
|
|
}
|
|
|
|
|
|
1992-03-27 09:04:14 +08:00
|
|
|
|
char *
|
|
|
|
|
mstrsave (md, ptr)
|
|
|
|
|
void *md;
|
|
|
|
|
const char *ptr;
|
|
|
|
|
{
|
|
|
|
|
return (msavestring (md, ptr, strlen (ptr)));
|
|
|
|
|
}
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
void
|
|
|
|
|
print_spaces (n, file)
|
|
|
|
|
register int n;
|
|
|
|
|
register FILE *file;
|
|
|
|
|
{
|
|
|
|
|
while (n-- > 0)
|
|
|
|
|
fputc (' ', file);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Ask user a y-or-n question and return 1 iff answer is yes.
|
|
|
|
|
Takes three args which are given to printf to print the question.
|
|
|
|
|
The first, a control string, should end in "? ".
|
|
|
|
|
It should not say how to answer, because we do that. */
|
|
|
|
|
|
|
|
|
|
/* VARARGS */
|
|
|
|
|
int
|
|
|
|
|
query (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
char *ctlstr;
|
|
|
|
|
register int answer;
|
|
|
|
|
register int ans2;
|
|
|
|
|
|
|
|
|
|
/* Automatically answer "yes" if input is not from a terminal. */
|
|
|
|
|
if (!input_from_terminal_p ())
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
1992-09-03 13:03:47 +08:00
|
|
|
|
wrap_here (""); /* Flush any buffered output */
|
|
|
|
|
fflush (stdout);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
va_start (args);
|
|
|
|
|
ctlstr = va_arg (args, char *);
|
1992-05-13 05:32:52 +08:00
|
|
|
|
vfprintf_filtered (stdout, ctlstr, args);
|
1992-09-15 13:11:52 +08:00
|
|
|
|
va_end (args);
|
1992-05-13 05:32:52 +08:00
|
|
|
|
printf_filtered ("(y or n) ");
|
1992-09-15 13:11:52 +08:00
|
|
|
|
fflush (stdout);
|
|
|
|
|
answer = fgetc (stdin);
|
|
|
|
|
clearerr (stdin); /* in case of C-d */
|
|
|
|
|
if (answer == EOF) /* C-d */
|
|
|
|
|
return 1;
|
|
|
|
|
if (answer != '\n') /* Eat rest of input line, to EOF or newline */
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
ans2 = fgetc (stdin);
|
|
|
|
|
clearerr (stdin);
|
|
|
|
|
}
|
|
|
|
|
while (ans2 != EOF && ans2 != '\n');
|
1991-03-29 00:26:26 +08:00
|
|
|
|
if (answer >= 'a')
|
|
|
|
|
answer -= 040;
|
|
|
|
|
if (answer == 'Y')
|
|
|
|
|
return 1;
|
|
|
|
|
if (answer == 'N')
|
|
|
|
|
return 0;
|
1992-05-13 05:32:52 +08:00
|
|
|
|
printf_filtered ("Please answer y or n.\n");
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
/* Parse a C escape sequence. STRING_PTR points to a variable
|
|
|
|
|
containing a pointer to the string to parse. That pointer
|
|
|
|
|
should point to the character after the \. That pointer
|
|
|
|
|
is updated past the characters we use. The value of the
|
|
|
|
|
escape sequence is returned.
|
|
|
|
|
|
|
|
|
|
A negative value means the sequence \ newline was seen,
|
|
|
|
|
which is supposed to be equivalent to nothing at all.
|
|
|
|
|
|
|
|
|
|
If \ is followed by a null character, we return a negative
|
|
|
|
|
value and leave the string pointer pointing at the null character.
|
|
|
|
|
|
|
|
|
|
If \ is followed by 000, we return 0 and leave the string pointer
|
|
|
|
|
after the zeros. A value of 0 does not mean end of string. */
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
parse_escape (string_ptr)
|
|
|
|
|
char **string_ptr;
|
|
|
|
|
{
|
|
|
|
|
register int c = *(*string_ptr)++;
|
|
|
|
|
switch (c)
|
|
|
|
|
{
|
|
|
|
|
case 'a':
|
1991-10-24 18:38:56 +08:00
|
|
|
|
return 007; /* Bell (alert) char */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
case 'b':
|
|
|
|
|
return '\b';
|
1991-10-24 18:38:56 +08:00
|
|
|
|
case 'e': /* Escape character */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
return 033;
|
|
|
|
|
case 'f':
|
|
|
|
|
return '\f';
|
|
|
|
|
case 'n':
|
|
|
|
|
return '\n';
|
|
|
|
|
case 'r':
|
|
|
|
|
return '\r';
|
|
|
|
|
case 't':
|
|
|
|
|
return '\t';
|
|
|
|
|
case 'v':
|
|
|
|
|
return '\v';
|
|
|
|
|
case '\n':
|
|
|
|
|
return -2;
|
|
|
|
|
case 0:
|
|
|
|
|
(*string_ptr)--;
|
|
|
|
|
return 0;
|
|
|
|
|
case '^':
|
|
|
|
|
c = *(*string_ptr)++;
|
|
|
|
|
if (c == '\\')
|
|
|
|
|
c = parse_escape (string_ptr);
|
|
|
|
|
if (c == '?')
|
|
|
|
|
return 0177;
|
|
|
|
|
return (c & 0200) | (c & 037);
|
|
|
|
|
|
|
|
|
|
case '0':
|
|
|
|
|
case '1':
|
|
|
|
|
case '2':
|
|
|
|
|
case '3':
|
|
|
|
|
case '4':
|
|
|
|
|
case '5':
|
|
|
|
|
case '6':
|
|
|
|
|
case '7':
|
|
|
|
|
{
|
|
|
|
|
register int i = c - '0';
|
|
|
|
|
register int count = 0;
|
|
|
|
|
while (++count < 3)
|
|
|
|
|
{
|
|
|
|
|
if ((c = *(*string_ptr)++) >= '0' && c <= '7')
|
|
|
|
|
{
|
|
|
|
|
i *= 8;
|
|
|
|
|
i += c - '0';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
(*string_ptr)--;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
return c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
* complaints.c: New file, code moved from utils.c.
* complaints.c (complain): Made into a varargs function.
* complaints.h: New file, code moved from symfile.h.
* Makefile.in (SFILES_MAINDIR): Add complaints.c.
* Makefile.in (HFILES): Add complaints.h.
* Makefile.in (OBS): Add complaints.o.
* symfile.c (complaint_root, stop_whining, complaint_series,
complain, clear_complaints, add_show_from_set for stop_whining):
Moved to complaints.c.
* symfile.h (struct complaint, complaint_root decl, complain
prototype, clear_complaints prototype): Moved to complaints.h.
* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
gdbtypes.c, mipsread.c, stbsread.c, symfile.c: Include
complaints.h. Remove casts from arguments to complain(),
which is now a varargs function, and remove unnecessary
placeholder zero args.
* defs.h (begin_line): Add prototype.
* defs.h (vprintf_filtered): Add prototype.
* dwarfread.c (varargs.h): Remove, no longer needed.
* dwarfread.c (dwarfwarn): Remove prototype and function.
* dwarfread.c (complaints): Define a bunch of complaints.
* dwarfread.c (SQUAWK): Remove macro defs, convert all
usages to standard complain() calls.
* utils.c (begin_line): New function that ensures that
whatever gets filter-printed next starts on its own line.
* utils.c (vprintf_filtered): New func, like vfprintf_filtered,
but to stdout (calls vfprintf_filtered internally).
1992-12-15 20:18:53 +08:00
|
|
|
|
/* Print the character C on STREAM as part of the contents of a literal
|
|
|
|
|
string whose delimiter is QUOTER. Note that this routine should only
|
|
|
|
|
be call for printing things which are independent of the language
|
|
|
|
|
of the program being debugged. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
void
|
* complaints.c: New file, code moved from utils.c.
* complaints.c (complain): Made into a varargs function.
* complaints.h: New file, code moved from symfile.h.
* Makefile.in (SFILES_MAINDIR): Add complaints.c.
* Makefile.in (HFILES): Add complaints.h.
* Makefile.in (OBS): Add complaints.o.
* symfile.c (complaint_root, stop_whining, complaint_series,
complain, clear_complaints, add_show_from_set for stop_whining):
Moved to complaints.c.
* symfile.h (struct complaint, complaint_root decl, complain
prototype, clear_complaints prototype): Moved to complaints.h.
* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
gdbtypes.c, mipsread.c, stbsread.c, symfile.c: Include
complaints.h. Remove casts from arguments to complain(),
which is now a varargs function, and remove unnecessary
placeholder zero args.
* defs.h (begin_line): Add prototype.
* defs.h (vprintf_filtered): Add prototype.
* dwarfread.c (varargs.h): Remove, no longer needed.
* dwarfread.c (dwarfwarn): Remove prototype and function.
* dwarfread.c (complaints): Define a bunch of complaints.
* dwarfread.c (SQUAWK): Remove macro defs, convert all
usages to standard complain() calls.
* utils.c (begin_line): New function that ensures that
whatever gets filter-printed next starts on its own line.
* utils.c (vprintf_filtered): New func, like vfprintf_filtered,
but to stdout (calls vfprintf_filtered internally).
1992-12-15 20:18:53 +08:00
|
|
|
|
gdb_printchar (c, stream, quoter)
|
1992-02-21 03:23:42 +08:00
|
|
|
|
register int c;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
FILE *stream;
|
|
|
|
|
int quoter;
|
|
|
|
|
{
|
|
|
|
|
|
1992-05-01 17:53:13 +08:00
|
|
|
|
c &= 0xFF; /* Avoid sign bit follies */
|
|
|
|
|
|
1992-05-01 17:39:30 +08:00
|
|
|
|
if ( c < 0x20 || /* Low control chars */
|
|
|
|
|
(c >= 0x7F && c < 0xA0) || /* DEL, High controls */
|
|
|
|
|
(sevenbit_strings && c >= 0x80)) { /* high order bit set */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
switch (c)
|
|
|
|
|
{
|
|
|
|
|
case '\n':
|
|
|
|
|
fputs_filtered ("\\n", stream);
|
|
|
|
|
break;
|
|
|
|
|
case '\b':
|
|
|
|
|
fputs_filtered ("\\b", stream);
|
|
|
|
|
break;
|
|
|
|
|
case '\t':
|
|
|
|
|
fputs_filtered ("\\t", stream);
|
|
|
|
|
break;
|
|
|
|
|
case '\f':
|
|
|
|
|
fputs_filtered ("\\f", stream);
|
|
|
|
|
break;
|
|
|
|
|
case '\r':
|
|
|
|
|
fputs_filtered ("\\r", stream);
|
|
|
|
|
break;
|
|
|
|
|
case '\033':
|
|
|
|
|
fputs_filtered ("\\e", stream);
|
|
|
|
|
break;
|
|
|
|
|
case '\007':
|
|
|
|
|
fputs_filtered ("\\a", stream);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
|
|
|
|
|
break;
|
|
|
|
|
}
|
1991-10-24 18:38:56 +08:00
|
|
|
|
} else {
|
|
|
|
|
if (c == '\\' || c == quoter)
|
|
|
|
|
fputs_filtered ("\\", stream);
|
|
|
|
|
fprintf_filtered (stream, "%c", c);
|
|
|
|
|
}
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 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 is 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;
|
|
|
|
|
|
|
|
|
|
/* Buffer and start column of buffered text, for doing smarter word-
|
|
|
|
|
wrapping. When someone calls wrap_here(), we start buffering output
|
|
|
|
|
that comes through fputs_filtered(). If we see a newline, we just
|
|
|
|
|
spit it out and forget about the wrap_here(). If we see another
|
|
|
|
|
wrap_here(), we spit it out and remember the newer one. If we see
|
|
|
|
|
the end of the line, we spit out a newline, the indent, and then
|
1993-09-29 00:23:44 +08:00
|
|
|
|
the buffered output. */
|
|
|
|
|
|
|
|
|
|
/* Malloc'd buffer with chars_per_line+2 bytes. Contains characters which
|
|
|
|
|
are waiting to be output (they have already been counted in chars_printed).
|
|
|
|
|
When wrap_buffer[0] is null, the buffer is empty. */
|
|
|
|
|
static char *wrap_buffer;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
1993-09-29 00:23:44 +08:00
|
|
|
|
/* Pointer in wrap_buffer to the next character to fill. */
|
|
|
|
|
static char *wrap_pointer;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
1993-09-29 00:23:44 +08:00
|
|
|
|
/* String to indent by if the wrap occurs. Must not be NULL if wrap_column
|
|
|
|
|
is non-zero. */
|
|
|
|
|
static char *wrap_indent;
|
|
|
|
|
|
|
|
|
|
/* Column number on the screen where wrap_buffer begins, or 0 if wrapping
|
|
|
|
|
is not in effect. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
static int wrap_column;
|
|
|
|
|
|
1991-05-02 13:28:42 +09:00
|
|
|
|
/* ARGSUSED */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
static void
|
|
|
|
|
set_width_command (args, from_tty, c)
|
|
|
|
|
char *args;
|
|
|
|
|
int from_tty;
|
|
|
|
|
struct cmd_list_element *c;
|
|
|
|
|
{
|
|
|
|
|
if (!wrap_buffer)
|
|
|
|
|
{
|
|
|
|
|
wrap_buffer = (char *) xmalloc (chars_per_line + 2);
|
|
|
|
|
wrap_buffer[0] = '\0';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
wrap_buffer = (char *) xrealloc (wrap_buffer, chars_per_line + 2);
|
|
|
|
|
wrap_pointer = wrap_buffer; /* Start it at the beginning */
|
|
|
|
|
}
|
|
|
|
|
|
1992-09-17 18:58:53 +08:00
|
|
|
|
/* Wait, so the user can read what's on the screen. Prompt the user
|
|
|
|
|
to continue by pressing RETURN. */
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
static void
|
|
|
|
|
prompt_for_continue ()
|
|
|
|
|
{
|
1991-08-16 10:49:30 +09:00
|
|
|
|
char *ignore;
|
|
|
|
|
|
1992-09-17 18:58:53 +08:00
|
|
|
|
/* We must do this *before* we call gdb_readline, else it will eventually
|
|
|
|
|
call us -- thinking that we're trying to print beyond the end of the
|
|
|
|
|
screen. */
|
|
|
|
|
reinitialize_more_filter ();
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
immediate_quit++;
|
1993-09-29 00:23:44 +08:00
|
|
|
|
/* On a real operating system, the user can quit with SIGINT.
|
|
|
|
|
But not on GO32.
|
|
|
|
|
|
|
|
|
|
'q' is provided on all systems so users don't have to change habits
|
|
|
|
|
from system to system, and because telling them what to do in
|
|
|
|
|
the prompt is more user-friendly than expecting them to think of
|
|
|
|
|
SIGINT. */
|
|
|
|
|
ignore =
|
|
|
|
|
gdb_readline ("---Type <return> to continue, or q <return> to quit---");
|
1991-08-16 10:49:30 +09:00
|
|
|
|
if (ignore)
|
1993-09-29 00:23:44 +08:00
|
|
|
|
{
|
|
|
|
|
char *p = ignore;
|
|
|
|
|
while (*p == ' ' || *p == '\t')
|
|
|
|
|
++p;
|
|
|
|
|
if (p[0] == 'q')
|
|
|
|
|
request_quit (SIGINT);
|
|
|
|
|
free (ignore);
|
|
|
|
|
}
|
1991-03-29 00:26:26 +08:00
|
|
|
|
immediate_quit--;
|
1992-09-17 18:58:53 +08:00
|
|
|
|
|
|
|
|
|
/* Now we have to do this again, so that GDB will know that it doesn't
|
|
|
|
|
need to save the ---Type <return>--- line at the top of the screen. */
|
|
|
|
|
reinitialize_more_filter ();
|
|
|
|
|
|
1991-08-16 10:49:30 +09:00
|
|
|
|
dont_repeat (); /* Forget prev cmd -- CR won't repeat it. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Reinitialize filter; ie. tell it to reset to original values. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
reinitialize_more_filter ()
|
|
|
|
|
{
|
|
|
|
|
lines_printed = 0;
|
|
|
|
|
chars_printed = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Indicate that if the next sequence of characters overflows the line,
|
|
|
|
|
a newline should be inserted here rather than when it hits the end.
|
1993-09-29 00:23:44 +08:00
|
|
|
|
If INDENT is non-null, it is a string to be printed to indent the
|
1991-03-29 00:26:26 +08:00
|
|
|
|
wrapped part on the next line. INDENT must remain accessible until
|
|
|
|
|
the next call to wrap_here() or until a newline is printed through
|
|
|
|
|
fputs_filtered().
|
|
|
|
|
|
|
|
|
|
If the line is already overfull, we immediately print a newline and
|
|
|
|
|
the indentation, and disable further wrapping.
|
|
|
|
|
|
1991-10-24 18:38:56 +08:00
|
|
|
|
If we don't know the width of lines, but we know the page height,
|
|
|
|
|
we must not wrap words, but should still keep track of newlines
|
|
|
|
|
that were explicitly printed.
|
|
|
|
|
|
1993-09-29 00:23:44 +08:00
|
|
|
|
INDENT should not contain tabs, as that will mess up the char count
|
|
|
|
|
on the next line. FIXME.
|
|
|
|
|
|
|
|
|
|
This routine is guaranteed to force out any output which has been
|
|
|
|
|
squirreled away in the wrap_buffer, so wrap_here ((char *)0) can be
|
|
|
|
|
used to force out output from the wrap_buffer. */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
wrap_here(indent)
|
1993-09-29 00:23:44 +08:00
|
|
|
|
char *indent;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
|
|
|
|
if (wrap_buffer[0])
|
|
|
|
|
{
|
|
|
|
|
*wrap_pointer = '\0';
|
|
|
|
|
fputs (wrap_buffer, stdout);
|
|
|
|
|
}
|
|
|
|
|
wrap_pointer = wrap_buffer;
|
|
|
|
|
wrap_buffer[0] = '\0';
|
1991-10-24 18:38:56 +08:00
|
|
|
|
if (chars_per_line == UINT_MAX) /* No line overflow checking */
|
|
|
|
|
{
|
|
|
|
|
wrap_column = 0;
|
|
|
|
|
}
|
|
|
|
|
else if (chars_printed >= chars_per_line)
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
|
|
|
|
puts_filtered ("\n");
|
1993-09-29 00:23:44 +08:00
|
|
|
|
if (indent != NULL)
|
|
|
|
|
puts_filtered (indent);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
wrap_column = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
wrap_column = chars_printed;
|
1993-09-29 00:23:44 +08:00
|
|
|
|
if (indent == NULL)
|
|
|
|
|
wrap_indent = "";
|
|
|
|
|
else
|
|
|
|
|
wrap_indent = indent;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
* complaints.c: New file, code moved from utils.c.
* complaints.c (complain): Made into a varargs function.
* complaints.h: New file, code moved from symfile.h.
* Makefile.in (SFILES_MAINDIR): Add complaints.c.
* Makefile.in (HFILES): Add complaints.h.
* Makefile.in (OBS): Add complaints.o.
* symfile.c (complaint_root, stop_whining, complaint_series,
complain, clear_complaints, add_show_from_set for stop_whining):
Moved to complaints.c.
* symfile.h (struct complaint, complaint_root decl, complain
prototype, clear_complaints prototype): Moved to complaints.h.
* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
gdbtypes.c, mipsread.c, stbsread.c, symfile.c: Include
complaints.h. Remove casts from arguments to complain(),
which is now a varargs function, and remove unnecessary
placeholder zero args.
* defs.h (begin_line): Add prototype.
* defs.h (vprintf_filtered): Add prototype.
* dwarfread.c (varargs.h): Remove, no longer needed.
* dwarfread.c (dwarfwarn): Remove prototype and function.
* dwarfread.c (complaints): Define a bunch of complaints.
* dwarfread.c (SQUAWK): Remove macro defs, convert all
usages to standard complain() calls.
* utils.c (begin_line): New function that ensures that
whatever gets filter-printed next starts on its own line.
* utils.c (vprintf_filtered): New func, like vfprintf_filtered,
but to stdout (calls vfprintf_filtered internally).
1992-12-15 20:18:53 +08:00
|
|
|
|
/* Ensure that whatever gets printed next, using the filtered output
|
|
|
|
|
commands, starts at the beginning of the line. I.E. if there is
|
|
|
|
|
any pending output for the current line, flush it and start a new
|
|
|
|
|
line. Otherwise do nothing. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
begin_line ()
|
|
|
|
|
{
|
|
|
|
|
if (chars_printed > 0)
|
|
|
|
|
{
|
|
|
|
|
puts_filtered ("\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
/* Like fputs but pause after every screenful, and can wrap at points
|
|
|
|
|
other than the final character of a line.
|
|
|
|
|
Unlike fputs, fputs_filtered does not return a value.
|
|
|
|
|
It is OK for LINEBUFFER to be NULL, in which case just don't print
|
|
|
|
|
anything.
|
|
|
|
|
|
|
|
|
|
Note that a longjmp to top level may occur in this routine
|
|
|
|
|
(since prompt_for_continue may do so) so this routine should not be
|
|
|
|
|
called when cleanups are not in place. */
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
fputs_filtered (linebuffer, stream)
|
1992-02-21 03:23:42 +08:00
|
|
|
|
const char *linebuffer;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
FILE *stream;
|
|
|
|
|
{
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
const char *lineptr;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
if (linebuffer == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* Don't do any filtering if it is disabled. */
|
|
|
|
|
if (stream != stdout
|
|
|
|
|
|| (lines_per_page == UINT_MAX && chars_per_line == UINT_MAX))
|
|
|
|
|
{
|
|
|
|
|
fputs (linebuffer, stream);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Go through and output each character. Show line extension
|
|
|
|
|
when this is necessary; prompt user for new page when this is
|
|
|
|
|
necessary. */
|
|
|
|
|
|
|
|
|
|
lineptr = linebuffer;
|
|
|
|
|
while (*lineptr)
|
|
|
|
|
{
|
|
|
|
|
/* Possible new page. */
|
|
|
|
|
if (lines_printed >= lines_per_page - 1)
|
|
|
|
|
prompt_for_continue ();
|
|
|
|
|
|
|
|
|
|
while (*lineptr && *lineptr != '\n')
|
|
|
|
|
{
|
|
|
|
|
/* Print a single line. */
|
|
|
|
|
if (*lineptr == '\t')
|
|
|
|
|
{
|
|
|
|
|
if (wrap_column)
|
|
|
|
|
*wrap_pointer++ = '\t';
|
|
|
|
|
else
|
|
|
|
|
putc ('\t', stream);
|
|
|
|
|
/* Shifting right by 3 produces the number of tab stops
|
|
|
|
|
we have already passed, and then adding one and
|
|
|
|
|
shifting left 3 advances to the next tab stop. */
|
|
|
|
|
chars_printed = ((chars_printed >> 3) + 1) << 3;
|
|
|
|
|
lineptr++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (wrap_column)
|
|
|
|
|
*wrap_pointer++ = *lineptr;
|
|
|
|
|
else
|
|
|
|
|
putc (*lineptr, stream);
|
|
|
|
|
chars_printed++;
|
|
|
|
|
lineptr++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (chars_printed >= chars_per_line)
|
|
|
|
|
{
|
|
|
|
|
unsigned int save_chars = chars_printed;
|
|
|
|
|
|
|
|
|
|
chars_printed = 0;
|
|
|
|
|
lines_printed++;
|
|
|
|
|
/* If we aren't actually wrapping, don't output newline --
|
|
|
|
|
if chars_per_line is right, we probably just overflowed
|
|
|
|
|
anyway; if it's wrong, let us keep going. */
|
|
|
|
|
if (wrap_column)
|
|
|
|
|
putc ('\n', stream);
|
|
|
|
|
|
|
|
|
|
/* Possible new page. */
|
|
|
|
|
if (lines_printed >= lines_per_page - 1)
|
|
|
|
|
prompt_for_continue ();
|
|
|
|
|
|
|
|
|
|
/* Now output indentation and wrapped string */
|
|
|
|
|
if (wrap_column)
|
|
|
|
|
{
|
1993-09-29 00:23:44 +08:00
|
|
|
|
fputs (wrap_indent, stream);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
*wrap_pointer = '\0'; /* Null-terminate saved stuff */
|
|
|
|
|
fputs (wrap_buffer, stream); /* and eject it */
|
|
|
|
|
/* FIXME, this strlen is what prevents wrap_indent from
|
|
|
|
|
containing tabs. However, if we recurse to print it
|
|
|
|
|
and count its chars, we risk trouble if wrap_indent is
|
|
|
|
|
longer than (the user settable) chars_per_line.
|
|
|
|
|
Note also that this can set chars_printed > chars_per_line
|
|
|
|
|
if we are printing a long string. */
|
|
|
|
|
chars_printed = strlen (wrap_indent)
|
|
|
|
|
+ (save_chars - wrap_column);
|
|
|
|
|
wrap_pointer = wrap_buffer; /* Reset buffer */
|
|
|
|
|
wrap_buffer[0] = '\0';
|
|
|
|
|
wrap_column = 0; /* And disable fancy wrap */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (*lineptr == '\n')
|
|
|
|
|
{
|
|
|
|
|
chars_printed = 0;
|
1991-05-30 17:52:52 +09:00
|
|
|
|
wrap_here ((char *)0); /* Spit out chars, cancel further wraps */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
lines_printed++;
|
|
|
|
|
putc ('\n', stream);
|
|
|
|
|
lineptr++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print a variable number of ARGS using format FORMAT. If this
|
|
|
|
|
information is going to put the amount written (since the last call
|
1992-09-17 18:58:53 +08:00
|
|
|
|
to REINITIALIZE_MORE_FILTER or the last page break) over the page size,
|
1991-03-29 00:26:26 +08:00
|
|
|
|
print out a pause message and do a gdb_readline to get the users
|
|
|
|
|
permision to continue.
|
|
|
|
|
|
|
|
|
|
Unlike fprintf, this function does not return a value.
|
|
|
|
|
|
|
|
|
|
We implement three variants, vfprintf (takes a vararg list and stream),
|
|
|
|
|
fprintf (takes a stream to write on), and printf (the usual).
|
|
|
|
|
|
|
|
|
|
Note that this routine has a restriction that the length of the
|
|
|
|
|
final output line must be less than 255 characters *or* it must be
|
|
|
|
|
less than twice the size of the format string. This is a very
|
|
|
|
|
arbitrary restriction, but it is an internal restriction, so I'll
|
|
|
|
|
put it in. This means that the %s format specifier is almost
|
|
|
|
|
useless; unless the caller can GUARANTEE that the string is short
|
|
|
|
|
enough, fputs_filtered should be used instead.
|
|
|
|
|
|
|
|
|
|
Note also that a longjmp to top level may occur in this routine
|
|
|
|
|
(since prompt_for_continue may do so) so this routine should not be
|
|
|
|
|
called when cleanups are not in place. */
|
|
|
|
|
|
1992-09-17 18:58:53 +08:00
|
|
|
|
#define MIN_LINEBUF 255
|
|
|
|
|
|
1992-09-15 14:27:18 +08:00
|
|
|
|
void
|
1991-03-29 00:26:26 +08:00
|
|
|
|
vfprintf_filtered (stream, format, args)
|
|
|
|
|
FILE *stream;
|
|
|
|
|
char *format;
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
va_list args;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
1992-09-17 18:58:53 +08:00
|
|
|
|
char line_buf[MIN_LINEBUF+10];
|
|
|
|
|
char *linebuffer = line_buf;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
int format_length;
|
|
|
|
|
|
|
|
|
|
format_length = strlen (format);
|
|
|
|
|
|
|
|
|
|
/* Reallocate buffer to a larger size if this is necessary. */
|
1992-09-17 18:58:53 +08:00
|
|
|
|
if (format_length * 2 > MIN_LINEBUF)
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
1992-09-17 18:58:53 +08:00
|
|
|
|
linebuffer = alloca (10 + format_length * 2);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This won't blow up if the restrictions described above are
|
|
|
|
|
followed. */
|
* breakpoint.c, buildsym.c, c-exp.y, coffread.c, command.c,
core.c, cplus-dem.c, dbxread.c, dwarfread.c, elfread.c, environ.c,
eval.c, findvar.c, gdbtypes.c, hppabsd-tdep.c, hppahpux-tdep.c,
i386-tdep.c, ieee-float.c, infcmd.c, inflow.c, infptrace.c,
infrun.c, m2-exp.y, mipsread.c, objfiles.c, parse.c, procfs.c,
putenv.c, remote-mm.c, remote-vx.c, solib.c, sparc-tdep.c,
sparc-xdep.c, stack.c, symfile.c, symtab.c, symtab.h, target.c,
tm-i386v.h, tm-sparc.h, utils.c, valarith.c, valops.c, valprint.c,
values.c, xcoffread.c:
Remove "(void)" casts from function calls where the return value
is ignored, in accordance with GNU coding standards.
1992-07-04 11:22:08 +08:00
|
|
|
|
vsprintf (linebuffer, format, args);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
fputs_filtered (linebuffer, stream);
|
|
|
|
|
}
|
|
|
|
|
|
* complaints.c: New file, code moved from utils.c.
* complaints.c (complain): Made into a varargs function.
* complaints.h: New file, code moved from symfile.h.
* Makefile.in (SFILES_MAINDIR): Add complaints.c.
* Makefile.in (HFILES): Add complaints.h.
* Makefile.in (OBS): Add complaints.o.
* symfile.c (complaint_root, stop_whining, complaint_series,
complain, clear_complaints, add_show_from_set for stop_whining):
Moved to complaints.c.
* symfile.h (struct complaint, complaint_root decl, complain
prototype, clear_complaints prototype): Moved to complaints.h.
* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
gdbtypes.c, mipsread.c, stbsread.c, symfile.c: Include
complaints.h. Remove casts from arguments to complain(),
which is now a varargs function, and remove unnecessary
placeholder zero args.
* defs.h (begin_line): Add prototype.
* defs.h (vprintf_filtered): Add prototype.
* dwarfread.c (varargs.h): Remove, no longer needed.
* dwarfread.c (dwarfwarn): Remove prototype and function.
* dwarfread.c (complaints): Define a bunch of complaints.
* dwarfread.c (SQUAWK): Remove macro defs, convert all
usages to standard complain() calls.
* utils.c (begin_line): New function that ensures that
whatever gets filter-printed next starts on its own line.
* utils.c (vprintf_filtered): New func, like vfprintf_filtered,
but to stdout (calls vfprintf_filtered internally).
1992-12-15 20:18:53 +08:00
|
|
|
|
void
|
|
|
|
|
vprintf_filtered (format, args)
|
|
|
|
|
char *format;
|
|
|
|
|
va_list args;
|
|
|
|
|
{
|
|
|
|
|
vfprintf_filtered (stdout, format, args);
|
|
|
|
|
}
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
/* VARARGS */
|
|
|
|
|
void
|
|
|
|
|
fprintf_filtered (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
1992-09-03 13:03:47 +08:00
|
|
|
|
va_list args;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
FILE *stream;
|
|
|
|
|
char *format;
|
1992-09-03 13:03:47 +08:00
|
|
|
|
|
|
|
|
|
va_start (args);
|
|
|
|
|
stream = va_arg (args, FILE *);
|
|
|
|
|
format = va_arg (args, char *);
|
|
|
|
|
|
|
|
|
|
/* This won't blow up if the restrictions described above are
|
|
|
|
|
followed. */
|
|
|
|
|
vfprintf_filtered (stream, format, args);
|
|
|
|
|
va_end (args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Like fprintf_filtered, but prints it's result indent.
|
|
|
|
|
Called as fprintfi_filtered (spaces, format, arg1, arg2, ...); */
|
|
|
|
|
|
|
|
|
|
/* VARARGS */
|
|
|
|
|
void
|
|
|
|
|
fprintfi_filtered (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
va_list args;
|
1992-09-03 13:03:47 +08:00
|
|
|
|
int spaces;
|
|
|
|
|
FILE *stream;
|
|
|
|
|
char *format;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
va_start (args);
|
1992-09-03 13:03:47 +08:00
|
|
|
|
spaces = va_arg (args, int);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
stream = va_arg (args, FILE *);
|
|
|
|
|
format = va_arg (args, char *);
|
1992-09-03 13:03:47 +08:00
|
|
|
|
print_spaces_filtered (spaces, stream);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
/* This won't blow up if the restrictions described above are
|
|
|
|
|
followed. */
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
vfprintf_filtered (stream, format, args);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
va_end (args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* VARARGS */
|
|
|
|
|
void
|
|
|
|
|
printf_filtered (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
char *format;
|
|
|
|
|
|
|
|
|
|
va_start (args);
|
|
|
|
|
format = va_arg (args, char *);
|
|
|
|
|
|
* tm-sparc.h, tm-sysv4.h, solib.h: Move shared lib definitions
into solib.h.
* sparc-pinsn.c, sparc-tdep.c, standalonec, sun3-xdep.c,
sun386-xdep.c, symm-xdep.c, target.c, ultra3-xdep.c, utils.c,
value.h: Prototypes for static functions; lint.
* gdbtypes.h: Empty file to ease transition.
1992-02-21 11:35:37 +08:00
|
|
|
|
vfprintf_filtered (stdout, format, args);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
va_end (args);
|
|
|
|
|
}
|
|
|
|
|
|
1992-09-03 13:03:47 +08:00
|
|
|
|
/* Like printf_filtered, but prints it's result indented.
|
|
|
|
|
Called as printfi_filtered (spaces, format, arg1, arg2, ...); */
|
|
|
|
|
|
|
|
|
|
/* VARARGS */
|
|
|
|
|
void
|
|
|
|
|
printfi_filtered (va_alist)
|
|
|
|
|
va_dcl
|
|
|
|
|
{
|
|
|
|
|
va_list args;
|
|
|
|
|
int spaces;
|
|
|
|
|
char *format;
|
|
|
|
|
|
|
|
|
|
va_start (args);
|
|
|
|
|
spaces = va_arg (args, int);
|
|
|
|
|
format = va_arg (args, char *);
|
|
|
|
|
print_spaces_filtered (spaces, stdout);
|
|
|
|
|
vfprintf_filtered (stdout, format, args);
|
|
|
|
|
va_end (args);
|
|
|
|
|
}
|
|
|
|
|
|
* complaints.c: New file, code moved from utils.c.
* complaints.c (complain): Made into a varargs function.
* complaints.h: New file, code moved from symfile.h.
* Makefile.in (SFILES_MAINDIR): Add complaints.c.
* Makefile.in (HFILES): Add complaints.h.
* Makefile.in (OBS): Add complaints.o.
* symfile.c (complaint_root, stop_whining, complaint_series,
complain, clear_complaints, add_show_from_set for stop_whining):
Moved to complaints.c.
* symfile.h (struct complaint, complaint_root decl, complain
prototype, clear_complaints prototype): Moved to complaints.h.
* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
gdbtypes.c, mipsread.c, stbsread.c, symfile.c: Include
complaints.h. Remove casts from arguments to complain(),
which is now a varargs function, and remove unnecessary
placeholder zero args.
* defs.h (begin_line): Add prototype.
* defs.h (vprintf_filtered): Add prototype.
* dwarfread.c (varargs.h): Remove, no longer needed.
* dwarfread.c (dwarfwarn): Remove prototype and function.
* dwarfread.c (complaints): Define a bunch of complaints.
* dwarfread.c (SQUAWK): Remove macro defs, convert all
usages to standard complain() calls.
* utils.c (begin_line): New function that ensures that
whatever gets filter-printed next starts on its own line.
* utils.c (vprintf_filtered): New func, like vfprintf_filtered,
but to stdout (calls vfprintf_filtered internally).
1992-12-15 20:18:53 +08:00
|
|
|
|
/* Easy -- but watch out!
|
|
|
|
|
|
|
|
|
|
This routine is *not* a replacement for puts()! puts() appends a newline.
|
|
|
|
|
This one doesn't, and had better not! */
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
puts_filtered (string)
|
|
|
|
|
char *string;
|
|
|
|
|
{
|
|
|
|
|
fputs_filtered (string, 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;
|
|
|
|
|
{
|
|
|
|
|
register char *t;
|
|
|
|
|
static char *spaces;
|
|
|
|
|
static int max_spaces;
|
|
|
|
|
|
|
|
|
|
if (n > max_spaces)
|
|
|
|
|
{
|
|
|
|
|
if (spaces)
|
|
|
|
|
free (spaces);
|
1992-03-27 09:04:14 +08:00
|
|
|
|
spaces = (char *) xmalloc (n+1);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
for (t = spaces+n; t != spaces;)
|
|
|
|
|
*--t = ' ';
|
|
|
|
|
spaces[n] = '\0';
|
|
|
|
|
max_spaces = n;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return spaces + max_spaces - n;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print N spaces. */
|
|
|
|
|
void
|
|
|
|
|
print_spaces_filtered (n, stream)
|
|
|
|
|
int n;
|
|
|
|
|
FILE *stream;
|
|
|
|
|
{
|
|
|
|
|
fputs_filtered (n_spaces (n), stream);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* C++ demangler stuff. */
|
|
|
|
|
|
1993-04-15 17:41:59 +08:00
|
|
|
|
/* fprintf_symbol_filtered attempts to demangle NAME, a symbol in language
|
|
|
|
|
LANG, using demangling args ARG_MODE, and print it filtered to STREAM.
|
|
|
|
|
If the name is not mangled, or the language for the name is unknown, or
|
|
|
|
|
demangling is off, the name is printed in its "raw" form. */
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
void
|
1993-04-15 17:41:59 +08:00
|
|
|
|
fprintf_symbol_filtered (stream, name, lang, arg_mode)
|
1991-03-29 00:26:26 +08:00
|
|
|
|
FILE *stream;
|
|
|
|
|
char *name;
|
1993-04-15 17:41:59 +08:00
|
|
|
|
enum language lang;
|
|
|
|
|
int arg_mode;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
{
|
1993-04-15 17:41:59 +08:00
|
|
|
|
char *demangled;
|
1993-03-12 01:44:39 +08:00
|
|
|
|
|
1993-04-15 17:41:59 +08:00
|
|
|
|
if (name != NULL)
|
1993-03-12 01:44:39 +08:00
|
|
|
|
{
|
1993-04-15 17:41:59 +08:00
|
|
|
|
/* If user wants to see raw output, no problem. */
|
|
|
|
|
if (!demangle)
|
1993-03-12 01:44:39 +08:00
|
|
|
|
{
|
1993-04-15 17:41:59 +08:00
|
|
|
|
fputs_filtered (name, stream);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
switch (lang)
|
|
|
|
|
{
|
|
|
|
|
case language_cplus:
|
|
|
|
|
demangled = cplus_demangle (name, arg_mode);
|
|
|
|
|
break;
|
|
|
|
|
case language_chill:
|
|
|
|
|
demangled = chill_demangle (name);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
demangled = NULL;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
fputs_filtered (demangled ? demangled : name, stream);
|
|
|
|
|
if (demangled != NULL)
|
|
|
|
|
{
|
|
|
|
|
free (demangled);
|
|
|
|
|
}
|
1993-03-12 01:44:39 +08:00
|
|
|
|
}
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
|
|
|
|
|
/* Do a strcmp() type operation on STRING1 and STRING2, ignoring any
|
|
|
|
|
differences in whitespace. Returns 0 if they match, non-zero if they
|
1992-09-03 13:03:47 +08:00
|
|
|
|
don't (slightly different than strcmp()'s range of return values).
|
|
|
|
|
|
|
|
|
|
As an extra hack, string1=="FOO(ARGS)" matches string2=="FOO".
|
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype.
* dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ
and STREQN defined in defs.h.
* dwarfread.c (set_cu_language): For completely unknown languages,
try to deduce the language from the filename. Retain behavior
that for known languages we don't know how to handle, we use
language_unknown.
* dwarfread.c (enum_type, symthesize_typedef): Initialize language
and demangled name fields in symbol.
* dwarfread.c, mipsread.c, partial-stab.h: For all usages of
ADD_PSYMBOL_TO_LIST, add language and objfile parameters.
* dwarfread.c (new_symbol): Attempt to demangle C++ symbol names
and cache the results in SYMBOL_DEMANGLED_NAME for the symbol.
* elfread.c (STREQ): Remove macro, use STREQ defined in defs.h.
Replace usages throughout.
* elfread.c (demangle.h): Include.
* elfread.c (record_minimal_symbol): Remove prototype and function.
* gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES,
B_CLRALL): Moved from symtab.h to gdbtypes.h.
* infcmd.c (jump_command): Remove code to demangle name and add
it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME.
* minsyms.c (demangle.h): Include.
* minsyms.c (lookup_minimal_symbol): Indent comment to match code.
* minsyms.c (install_minimal_symbols): Attempt to demangle symbol
names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME.
* mipsread.c (psymtab_language): Add static variable.
* stabsread.c (demangle.h): Include.
* stabsread.c (define_symbol): Attempt to demangle C++ symbol
names and cache them in the SYMBOL_DEMANGLED_NAME field.
* stack.c (return_command): Remove explicit demangling of name
and use of cleanups. Just use SYMBOL_DEMANGLED_NAME.
* symfile.c (demangle.h): Include.
* symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix
to match macros in symfile.h and allow them to be compiled
if INLINE_ADD_PSYMBOL is not true.
* symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set.
* symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters.
Add code to demangle and cache C++ symbol names. Use macro form
if INLINE_ADD_PSYMBOL is true, otherwise use C function form.
* symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list):
Remove, also defined in symfile.c, which we already fixed.
* symtab.c (expensive_mangler): Remove prototype and function.
* symtab.c (find_methods): Remove physnames parameter and fix
prototype to match.
* symtab.c (completion_list_add_symbol): Name changed to
completion_list_add_name.
* symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both
the normal symbol name and the cached C++ demangled name.
* symtab.c (lookup_demangled_partial_symbol,
lookup_demangled_block_symbol): Remove prototypes and functions.
* symtab.c (lookup_symbol): Remove use of expensive_mangler,
use lookup_block_symbol instead of lookup_demangled_block_symbol.
Remove code to try demangling names and matching them.
* symtab.c (lookup_partial_symbol, lookup_block_symbol):
Fix to try matching the cached demangled name if no match is
found using the regular symbol name.
* symtab.c (find_methods): Remove unused physnames array.
* symtab.c (name_match, NAME_MATCH): Remove function and macro,
replaced with SYMBOL_MATCHES_REGEXP from symtab.h.
* symtab.c (completion_list_add_symbol): Rewrite to use cached
C++ demangled symbol names.
* symtab.h: Much reformatting of structures and such to add
whitespace to make them more readable, and make them more
consistent with other gdb structure definitions.
* symtab.h (general_symbol_info): New struct containing fields
common to all symbols.
* symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME,
SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME,
SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros.
* symtab. (struct minimal_symbol, struct partial_symbol, struct
symbol): Use general_symbol_info struct.
* utils.c (demangle_and_match): Remove, no longer used.
* valops.c (demangle.h): Include.
* xcoffexec.c (eq): Remove macro, replace usages with STREQ.
* blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c,
infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c,
symmisc.c, symtab.c, valops.c: Replace references to minimal
symbol fields with appropriate macros.
* breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c,
coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c,
demangle.c, elfread.c, energize.c, environ.c, exec.c,
gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c,
main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c,
remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c,
sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c,
symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h,
tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp
and strncmp usages with STREQ, STREQN, or STRCMP as appropriate.
* breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c,
mipsread.c, printcmd.c, source.c, stabsread.c, stack.c,
symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME
references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as
appropriate.
* buildsym.c (start_subfile, patch_subfile_names): Default the
source language to what can be deduced from the filename.
* buildsym.c (end_symtab): Update the source language in the
allocated symtab to match what we have been using.
* buildsym.h (struct subfile): Add a language field.
* c-typeprint.c (c_print_type): Remove code to do explicit
demangling.
* dbxread.c (psymtab_language): Add static variable.
* dbxread.c (start_psymtab): Initialize psymtab_language using
deduce_language_from_filename.
1992-12-23 14:34:57 +08:00
|
|
|
|
This "feature" is useful when searching for matching C++ function names
|
|
|
|
|
(such as if the user types 'break FOO', where FOO is a mangled C++
|
|
|
|
|
function). */
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
|
* complaints.c: New file, code moved from utils.c.
* complaints.c (complain): Made into a varargs function.
* complaints.h: New file, code moved from symfile.h.
* Makefile.in (SFILES_MAINDIR): Add complaints.c.
* Makefile.in (HFILES): Add complaints.h.
* Makefile.in (OBS): Add complaints.o.
* symfile.c (complaint_root, stop_whining, complaint_series,
complain, clear_complaints, add_show_from_set for stop_whining):
Moved to complaints.c.
* symfile.h (struct complaint, complaint_root decl, complain
prototype, clear_complaints prototype): Moved to complaints.h.
* buildsym.c, coffread.c, dbxread.c, dwarfread.c, elfread.c,
gdbtypes.c, mipsread.c, stbsread.c, symfile.c: Include
complaints.h. Remove casts from arguments to complain(),
which is now a varargs function, and remove unnecessary
placeholder zero args.
* defs.h (begin_line): Add prototype.
* defs.h (vprintf_filtered): Add prototype.
* dwarfread.c (varargs.h): Remove, no longer needed.
* dwarfread.c (dwarfwarn): Remove prototype and function.
* dwarfread.c (complaints): Define a bunch of complaints.
* dwarfread.c (SQUAWK): Remove macro defs, convert all
usages to standard complain() calls.
* utils.c (begin_line): New function that ensures that
whatever gets filter-printed next starts on its own line.
* utils.c (vprintf_filtered): New func, like vfprintf_filtered,
but to stdout (calls vfprintf_filtered internally).
1992-12-15 20:18:53 +08:00
|
|
|
|
int
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
strcmp_iw (string1, string2)
|
|
|
|
|
const char *string1;
|
|
|
|
|
const char *string2;
|
|
|
|
|
{
|
|
|
|
|
while ((*string1 != '\0') && (*string2 != '\0'))
|
|
|
|
|
{
|
|
|
|
|
while (isspace (*string1))
|
|
|
|
|
{
|
|
|
|
|
string1++;
|
|
|
|
|
}
|
|
|
|
|
while (isspace (*string2))
|
|
|
|
|
{
|
|
|
|
|
string2++;
|
|
|
|
|
}
|
|
|
|
|
if (*string1 != *string2)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (*string1 != '\0')
|
|
|
|
|
{
|
|
|
|
|
string1++;
|
|
|
|
|
string2++;
|
|
|
|
|
}
|
|
|
|
|
}
|
1992-09-03 13:03:47 +08:00
|
|
|
|
return (*string1 != '\0' && *string1 != '(') || (*string2 != '\0');
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
}
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
_initialize_utils ()
|
|
|
|
|
{
|
|
|
|
|
struct cmd_list_element *c;
|
|
|
|
|
|
|
|
|
|
c = add_set_cmd ("width", class_support, var_uinteger,
|
|
|
|
|
(char *)&chars_per_line,
|
|
|
|
|
"Set number of characters gdb thinks are in a line.",
|
|
|
|
|
&setlist);
|
|
|
|
|
add_show_from_set (c, &showlist);
|
1992-03-04 07:26:26 +08:00
|
|
|
|
c->function.sfunc = set_width_command;
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
add_show_from_set
|
|
|
|
|
(add_set_cmd ("height", class_support,
|
|
|
|
|
var_uinteger, (char *)&lines_per_page,
|
|
|
|
|
"Set number of lines gdb thinks are in a page.", &setlist),
|
|
|
|
|
&showlist);
|
|
|
|
|
|
|
|
|
|
/* These defaults will be used if we are unable to get the correct
|
|
|
|
|
values from termcap. */
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
#if defined(__GO32__)
|
|
|
|
|
lines_per_page = ScreenRows();
|
|
|
|
|
chars_per_line = ScreenCols();
|
|
|
|
|
#else
|
1991-03-29 00:26:26 +08:00
|
|
|
|
lines_per_page = 24;
|
|
|
|
|
chars_per_line = 80;
|
|
|
|
|
/* Initialize the screen height and width from termcap. */
|
|
|
|
|
{
|
|
|
|
|
char *termtype = getenv ("TERM");
|
|
|
|
|
|
|
|
|
|
/* Positive means success, nonpositive means failure. */
|
|
|
|
|
int status;
|
|
|
|
|
|
|
|
|
|
/* 2048 is large enough for all known terminals, according to the
|
|
|
|
|
GNU termcap manual. */
|
|
|
|
|
char term_buffer[2048];
|
|
|
|
|
|
|
|
|
|
if (termtype)
|
|
|
|
|
{
|
|
|
|
|
status = tgetent (term_buffer, termtype);
|
|
|
|
|
if (status > 0)
|
|
|
|
|
{
|
|
|
|
|
int val;
|
|
|
|
|
|
|
|
|
|
val = tgetnum ("li");
|
|
|
|
|
if (val >= 0)
|
|
|
|
|
lines_per_page = val;
|
|
|
|
|
else
|
|
|
|
|
/* The number of lines per page is not mentioned
|
|
|
|
|
in the terminal description. This probably means
|
|
|
|
|
that paging is not useful (e.g. emacs shell window),
|
|
|
|
|
so disable paging. */
|
|
|
|
|
lines_per_page = UINT_MAX;
|
|
|
|
|
|
|
|
|
|
val = tgetnum ("co");
|
|
|
|
|
if (val >= 0)
|
|
|
|
|
chars_per_line = val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1992-03-30 06:33:35 +08:00
|
|
|
|
#if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)
|
|
|
|
|
|
1992-04-23 00:46:47 +08:00
|
|
|
|
/* If there is a better way to determine the window size, use it. */
|
1992-03-30 06:33:35 +08:00
|
|
|
|
SIGWINCH_HANDLER ();
|
|
|
|
|
#endif
|
* dbxread.c, i386-pinsn.c, i386-tdep.c, regex.c, solib.c, symmisc.c,
symtab.h, tm-i386v4.h, valprint.c, values.c: Lint.
* breakpoint.c, c-exp.y, coffread.c, command.c, environ.c, eval.c,
findvar.c, infcmd.c, infptrace.c, infrun.c, m2-exp.y, parse.c,
putenv.c, solib.c, sparc-xdep.c, symtab.c, tm-i386v.h, tm-sparc.h,
utils.c, valarith.c, valops.c, valprint.c, values.c:
Replace bcopy() use with memcpy(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* breakpoint.c, buildsym.c, coffread.c, dbxread.c, i386-tdep.c,
ieee-float.c, infcmd.c, sparc-tdep.c, stack.c, symtab.c, symtab.h,
target.c, values.c:
Replace bzero() use with memset(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
* i386-tdep.c, main.c, valprint.c:
Replace bcmp() use with memcmp(), which is more standard and can
take advantage of gcc's builtin functions for increased performance.
1992-06-30 07:34:38 +08:00
|
|
|
|
#endif
|
1991-10-24 18:38:56 +08:00
|
|
|
|
/* If the output is not a terminal, don't paginate it. */
|
|
|
|
|
if (!ISATTY (stdout))
|
|
|
|
|
lines_per_page = UINT_MAX;
|
|
|
|
|
|
1991-03-29 00:26:26 +08:00
|
|
|
|
set_width_command ((char *)NULL, 0, c);
|
|
|
|
|
|
|
|
|
|
add_show_from_set
|
|
|
|
|
(add_set_cmd ("demangle", class_support, var_boolean,
|
|
|
|
|
(char *)&demangle,
|
|
|
|
|
"Set demangling of encoded C++ names when displaying symbols.",
|
1991-04-19 10:32:08 +09:00
|
|
|
|
&setprintlist),
|
|
|
|
|
&showprintlist);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
add_show_from_set
|
|
|
|
|
(add_set_cmd ("sevenbit-strings", class_support, var_boolean,
|
|
|
|
|
(char *)&sevenbit_strings,
|
|
|
|
|
"Set printing of 8-bit characters in strings as \\nnn.",
|
1991-04-19 10:32:08 +09:00
|
|
|
|
&setprintlist),
|
|
|
|
|
&showprintlist);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
|
|
|
|
|
add_show_from_set
|
|
|
|
|
(add_set_cmd ("asm-demangle", class_support, var_boolean,
|
|
|
|
|
(char *)&asm_demangle,
|
|
|
|
|
"Set demangling of C++ names in disassembly listings.",
|
1991-04-19 10:32:08 +09:00
|
|
|
|
&setprintlist),
|
|
|
|
|
&showprintlist);
|
1991-03-29 00:26:26 +08:00
|
|
|
|
}
|
1992-03-30 06:33:35 +08:00
|
|
|
|
|
|
|
|
|
/* Machine specific function to handle SIGWINCH signal. */
|
|
|
|
|
|
|
|
|
|
#ifdef SIGWINCH_HANDLER_BODY
|
|
|
|
|
SIGWINCH_HANDLER_BODY
|
|
|
|
|
#endif
|
1993-03-12 01:44:39 +08:00
|
|
|
|
|