aboutsummaryrefslogtreecommitdiff
path: root/gdb/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/utils.c')
-rw-r--r--gdb/utils.c166
1 files changed, 86 insertions, 80 deletions
diff --git a/gdb/utils.c b/gdb/utils.c
index a941454..895a62a 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -33,6 +33,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "bfd.h"
#include "target.h"
#include "demangle.h"
+#include "expression.h"
+#include "language.h"
/* Prototypes for local functions */
@@ -411,9 +413,33 @@ quit ()
#else
error ("Quit (expect signal %d when inferior is resumed)", SIGINT);
#endif /* TIOCGPGRP */
+#else
+ error ("Quit");
#endif
}
+
+#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
+
/* Control C comes here */
void
@@ -1110,71 +1136,50 @@ fputs_filtered (linebuffer, stream)
}
-/* fputs_demangled is a variant of fputs_filtered that
- demangles g++ names.*/
+/* fputs_demangled 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. */
void
-fputs_demangled (linebuffer, stream, arg_mode)
- char *linebuffer;
+fputs_demangled (name, stream, arg_mode, lang)
+ char *name;
FILE *stream;
int arg_mode;
+ enum language lang;
{
-#define SYMBOL_MAX 1024
-
-#define SYMBOL_CHAR(c) (isascii(c) \
- && (isalnum(c) || (c) == '_' || (c) == CPLUS_MARKER))
-
- char buf[SYMBOL_MAX+1];
-# define DMSLOP 5 /* How much room to leave in buf */
- char *p;
-
- if (linebuffer == NULL)
- return;
-
- /* If user wants to see raw output, no problem. */
- if (!demangle) {
- fputs_filtered (linebuffer, stream);
- return;
- }
-
- p = linebuffer;
-
- while ( *p != (char) 0 ) {
- int i = 0;
-
- /* collect non-interesting characters into buf */
- while (*p != (char) 0 && !SYMBOL_CHAR(*p) && i < (int)sizeof(buf)-DMSLOP ) {
- buf[i++] = *p;
- p++;
- }
- if (i > 0) {
- /* output the non-interesting characters without demangling */
- buf[i] = (char) 0;
- fputs_filtered(buf, stream);
- i = 0; /* reset buf */
- }
+ char *demangled;
- /* and now the interesting characters */
- while (i < SYMBOL_MAX
- && *p != (char) 0
- && SYMBOL_CHAR(*p)
- && i < (int)sizeof(buf) - DMSLOP) {
- buf[i++] = *p;
- p++;
- }
- buf[i] = (char) 0;
- if (i > 0) {
- char * result;
-
- if ( (result = cplus_demangle(buf, arg_mode)) != NULL ) {
- fputs_filtered(result, stream);
- free(result);
- }
- else {
- fputs_filtered(buf, stream);
- }
+ if (name != NULL)
+ {
+ /* If user wants to see raw output, no problem. */
+ if (!demangle)
+ {
+ fputs_filtered (name, stream);
+ }
+ else
+ {
+ switch (lang)
+ {
+ case language_cplus:
+ demangled = cplus_demangle (name, arg_mode);
+ break;
+ /* start-sanitize-chill */
+ case language_chill:
+ demangled = chill_demangle (name);
+ break;
+ /* end-sanitize-chill */
+ default:
+ demangled = NULL;
+ break;
+ }
+ fputs_filtered (demangled ? demangled : name, stream);
+ if (demangled != NULL)
+ {
+ free (demangled);
+ }
+ }
}
- }
}
/* Print a variable number of ARGS using format FORMAT. If this
@@ -1361,34 +1366,34 @@ print_spaces_filtered (n, stream)
/* C++ demangler stuff. */
-/* Make a copy of a symbol, applying C++ demangling if demangling is enabled
- and a demangled version exists. Note that the value returned from
- cplus_demangle is already allocated in malloc'd memory. */
-
-char *
-strdup_demangled (name)
- const char *name;
-{
- char *demangled = NULL;
-
- if (demangle)
- {
- demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI);
- }
- return ((demangled != NULL) ? demangled : strdup (name));
-}
-
-
/* Print NAME on STREAM, demangling if necessary. */
void
fprint_symbol (stream, name)
FILE *stream;
char *name;
{
- char *demangled;
- if ((!demangle)
- || NULL == (demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI)))
- fputs_filtered (name, stream);
+ char *demangled = NULL;
+
+ if (demangle)
+ {
+ /* Lacking a better method of knowing what demangler to use, pick
+ one appropriate for whatever the current language is. (FIXME) */
+ switch (current_language -> la_language)
+ {
+ case language_cplus:
+ demangled = cplus_demangle (name, DMGL_PARAMS | DMGL_ANSI);
+ break;
+ /* start-sanitize-chill */
+ case language_chill:
+ demangled = chill_demangle (name);
+ break;
+ /* end-sanitize-chill */
+ }
+ }
+ if (demangled == NULL)
+ {
+ fputs_filtered (name, stream);
+ }
else
{
fputs_filtered (demangled, stream);
@@ -1534,3 +1539,4 @@ _initialize_utils ()
#ifdef SIGWINCH_HANDLER_BODY
SIGWINCH_HANDLER_BODY
#endif
+