diff options
Diffstat (limited to 'gdb/utils.c')
-rw-r--r-- | gdb/utils.c | 405 |
1 files changed, 313 insertions, 92 deletions
diff --git a/gdb/utils.c b/gdb/utils.c index 529c902..e03245f 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -53,9 +53,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Prototypes for local functions */ -static void vfprintf_maybe_filtered PARAMS ((FILE *, const char *, va_list, int)); +static void vfprintf_maybe_filtered PARAMS ((GDB_FILE *, const char *, + va_list, int)); -static void fputs_maybe_filtered PARAMS ((const char *, FILE *, int)); +static void fputs_maybe_filtered PARAMS ((const char *, GDB_FILE *, int)); #if defined (USE_MMALLOC) && !defined (NO_MMCHECK) static void malloc_botch PARAMS ((void)); @@ -70,12 +71,19 @@ prompt_for_continue PARAMS ((void)); static void set_width_command PARAMS ((char *, int, struct cmd_list_element *)); +static void +set_width PARAMS ((void)); + /* 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 +#ifndef GDB_FILE_ISATTY +#define GDB_FILE_ISATTY(GDB_FILE_PTR) (gdb_file_isatty(GDB_FILE_PTR)) +#endif + /* Chain of cleanup actions established with make_cleanup, to be executed if an error happens. */ @@ -132,6 +140,9 @@ char *quit_pre_print; /* String to be printed before warning messages, if any. */ char *warning_pre_print = "\nwarning: "; + +int pagination_enabled = 1; + /* Add a new cleanup to the cleanup_chain, and return the previous chain pointer @@ -969,10 +980,16 @@ mstrsave (md, ptr) void print_spaces (n, file) register int n; - register FILE *file; + register GDB_FILE *file; { - while (n-- > 0) - fputc (' ', file); + if (file->ts_streamtype == astring) { + gdb_file_adjust_strbuf (n, file); + while (n-- > 0) + strcat(file->ts_strbuf, ' '); + } else { + while (n-- > 0) + fputc (' ', file->ts_filestream); + } } /* Print a host address. */ @@ -1052,21 +1069,43 @@ query (va_alist) fputs_unfiltered ("\n", gdb_stdout); #endif /* MPW */ + wrap_here(""); gdb_flush (gdb_stdout); - answer = fgetc (stdin); + +#if defined(TUI) + if (!tui_version || cmdWin == tuiWinWithFocus()) +#endif + answer = fgetc (stdin); +#if defined(TUI) + else + + answer = (unsigned char)tuiBufferGetc(); + +#endif clearerr (stdin); /* in case of C-d */ if (answer == EOF) /* C-d */ { retval = 1; break; } - if (answer != '\n') /* Eat rest of input line, to EOF or newline */ + /* Eat rest of input line, to EOF or newline */ + if ((answer != '\n') || (tui_version && answer != '\r')) do { - ans2 = fgetc (stdin); +#if defined(TUI) + if (!tui_version || cmdWin == tuiWinWithFocus()) +#endif + ans2 = fgetc (stdin); +#if defined(TUI) + else + + ans2 = (unsigned char)tuiBufferGetc(); +#endif clearerr (stdin); } - while (ans2 != EOF && ans2 != '\n'); + while (ans2 != EOF && ans2 != '\n' && ans2 != '\r'); + TUIDO(((TuiOpaqueFuncPtr)tui_vStartNewLines, 1)); + if (answer >= 'a') answer -= 040; if (answer == 'Y') @@ -1178,7 +1217,7 @@ parse_escape (string_ptr) void gdb_printchar (c, stream, quoter) register int c; - FILE *stream; + GDB_FILE *stream; int quoter; { @@ -1283,13 +1322,87 @@ static char *wrap_indent; is not in effect. */ static int wrap_column; -/* ARGSUSED */ -static void -set_width_command (args, from_tty, c) - char *args; - int from_tty; - struct cmd_list_element *c; + +/* Inialize the lines and chars per page */ +void +init_page_info() { +#if defined(TUI) + if (tui_version && m_winPtrNotNull(cmdWin)) + { + lines_per_page = cmdWin->generic.height; + chars_per_line = cmdWin->generic.width; + } + else +#endif + { + /* These defaults will be used if we are unable to get the correct + values from termcap. */ +#if defined(__GO32__) + lines_per_page = ScreenRows(); + chars_per_line = ScreenCols(); +#else + lines_per_page = 24; + chars_per_line = 80; + +#if !defined (MPW) && !defined (_WIN32) + /* No termcap under MPW, although might be cool to do something + by looking at worksheet or console window sizes. */ + /* 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; + } + } + } +#endif /* MPW */ + +#if defined(SIGWINCH) && defined(SIGWINCH_HANDLER) + + /* If there is a better way to determine the window size, use it. */ + SIGWINCH_HANDLER (SIGWINCH); +#endif +#endif + /* If the output is not a terminal, don't paginate it. */ + if (!GDB_FILE_ISATTY (gdb_stdout)) + lines_per_page = UINT_MAX; + } /* the command_line_version */ + set_width(); +} + +static void +set_width() +{ + if (chars_per_line == 0) + init_page_info(); + if (!wrap_buffer) { wrap_buffer = (char *) xmalloc (chars_per_line + 2); @@ -1297,7 +1410,17 @@ set_width_command (args, from_tty, c) } else wrap_buffer = (char *) xrealloc (wrap_buffer, chars_per_line + 2); - wrap_pointer = wrap_buffer; /* Start it at the beginning */ + wrap_pointer = wrap_buffer; /* Start it at the beginning */ +} + +/* ARGSUSED */ +static void +set_width_command (args, from_tty, c) + char *args; + int from_tty; + struct cmd_list_element *c; +{ + set_width (); } /* Wait, so the user can read what's on the screen. Prompt the user @@ -1436,18 +1559,100 @@ begin_line () } } +int +gdb_file_isatty (stream) + GDB_FILE *stream; +{ + + if (stream->ts_streamtype == afile) + return (isatty(fileno(stream->ts_filestream))); + else return 0; +} + +GDB_FILE * +gdb_file_init_astring (n) + int n; +{ + GDB_FILE *tmpstream; + + tmpstream = xmalloc (sizeof(GDB_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 + tmpstream->ts_strbuf = NULL; + tmpstream->ts_buflen = n; + + return tmpstream; +} + +void +gdb_file_deallocate (streamptr) + GDB_FILE **streamptr; +{ + GDB_FILE *tmpstream; + + tmpstream = *streamptr; + if ((tmpstream->ts_streamtype == astring) && + (tmpstream->ts_strbuf != NULL)) + { + free (tmpstream->ts_strbuf); + } + + free (tmpstream); + *streamptr = NULL; +} + +char * +gdb_file_get_strbuf (stream) + GDB_FILE *stream; +{ + 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 +gdb_file_adjust_strbuf (n, stream) + int n; + GDB_FILE *stream; +{ + int non_null_chars; + + 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); + } +} GDB_FILE * gdb_fopen (name, mode) char * name; char * mode; { - return fopen (name, mode); + int gdb_file_size; + GDB_FILE *tmp; + + gdb_file_size = sizeof(GDB_FILE); + tmp = (GDB_FILE *) xmalloc (gdb_file_size); + tmp->ts_streamtype = afile; + tmp->ts_filestream = fopen (name, mode); + tmp->ts_strbuf = NULL; + tmp->ts_buflen = 0; + + return tmp; } void gdb_flush (stream) - FILE *stream; + GDB_FILE *stream; { if (flush_hook && (stream == gdb_stdout @@ -1457,7 +1662,18 @@ gdb_flush (stream) return; } - fflush (stream); + fflush (stream->ts_filestream); +} + +void +gdb_fclose(streamptr) + GDB_FILE **streamptr; +{ + GDB_FILE *tmpstream; + + tmpstream = *streamptr; + fclose (tmpstream->ts_filestream); + gdb_file_deallocate (streamptr); } /* Like fputs but if FILTER is true, pause after every screenful. @@ -1476,7 +1692,7 @@ gdb_flush (stream) static void fputs_maybe_filtered (linebuffer, stream, filter) const char *linebuffer; - FILE *stream; + GDB_FILE *stream; int filter; { const char *lineptr; @@ -1580,7 +1796,7 @@ fputs_maybe_filtered (linebuffer, stream, filter) void fputs_filtered (linebuffer, stream) const char *linebuffer; - FILE *stream; + GDB_FILE *stream; { fputs_maybe_filtered (linebuffer, stream, 1); } @@ -1600,7 +1816,7 @@ putchar_unfiltered (c) int fputc_unfiltered (c, stream) int c; - FILE * stream; + GDB_FILE * stream; { char buf[2]; @@ -1613,7 +1829,7 @@ fputc_unfiltered (c, stream) int fputc_filtered (c, stream) int c; - FILE * stream; + GDB_FILE * stream; { char buf[2]; @@ -1713,7 +1929,7 @@ puts_debug (prefix, string, suffix) static void vfprintf_maybe_filtered (stream, format, args, filter) - FILE *stream; + GDB_FILE *stream; const char *format; va_list args; int filter; @@ -1735,7 +1951,7 @@ vfprintf_maybe_filtered (stream, format, args, filter) void vfprintf_filtered (stream, format, args) - FILE *stream; + GDB_FILE *stream; const char *format; va_list args; { @@ -1744,7 +1960,7 @@ vfprintf_filtered (stream, format, args) void vfprintf_unfiltered (stream, format, args) - FILE *stream; + GDB_FILE *stream; const char *format; va_list args; { @@ -1781,7 +1997,7 @@ vprintf_unfiltered (format, args) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -fprintf_filtered (FILE *stream, const char *format, ...) +fprintf_filtered (GDB_FILE *stream, const char *format, ...) #else fprintf_filtered (va_alist) va_dcl @@ -1791,11 +2007,11 @@ fprintf_filtered (va_alist) #ifdef ANSI_PROTOTYPES va_start (args, format); #else - FILE *stream; + GDB_FILE *stream; char *format; va_start (args); - stream = va_arg (args, FILE *); + stream = va_arg (args, GDB_FILE *); format = va_arg (args, char *); #endif vfprintf_filtered (stream, format, args); @@ -1805,7 +2021,7 @@ fprintf_filtered (va_alist) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -fprintf_unfiltered (FILE *stream, const char *format, ...) +fprintf_unfiltered (GDB_FILE *stream, const char *format, ...) #else fprintf_unfiltered (va_alist) va_dcl @@ -1815,11 +2031,11 @@ fprintf_unfiltered (va_alist) #ifdef ANSI_PROTOTYPES va_start (args, format); #else - FILE *stream; + GDB_FILE *stream; char *format; va_start (args); - stream = va_arg (args, FILE *); + stream = va_arg (args, GDB_FILE *); format = va_arg (args, char *); #endif vfprintf_unfiltered (stream, format, args); @@ -1832,7 +2048,7 @@ fprintf_unfiltered (va_alist) /* VARARGS */ void #ifdef ANSI_PROTOTYPES -fprintfi_filtered (int spaces, FILE *stream, const char *format, ...) +fprintfi_filtered (int spaces, GDB_FILE *stream, const char *format, ...) #else fprintfi_filtered (va_alist) va_dcl @@ -1843,12 +2059,12 @@ fprintfi_filtered (va_alist) va_start (args, format); #else int spaces; - FILE *stream; + GDB_FILE *stream; char *format; va_start (args); spaces = va_arg (args, int); - stream = va_arg (args, FILE *); + stream = va_arg (args, GDB_FILE *); format = va_arg (args, char *); #endif print_spaces_filtered (spaces, stream); @@ -1978,7 +2194,7 @@ n_spaces (n) void print_spaces_filtered (n, stream) int n; - FILE *stream; + GDB_FILE *stream; { fputs_filtered (n_spaces (n), stream); } @@ -1992,7 +2208,7 @@ print_spaces_filtered (n, stream) void fprintf_symbol_filtered (stream, name, lang, arg_mode) - FILE *stream; + GDB_FILE *stream; char *name; enum language lang; int arg_mode; @@ -2072,6 +2288,50 @@ strcmp_iw (string1, string2) } +/* +** subsetCompare() +** Answer whether stringToCompare is a full or partial match to +** templateString. The partial match must be in sequence starting +** at index 0. +*/ +int +#ifdef _STDC__ +subsetCompare( + char *stringToCompare, + char *templateString) +#else +subsetCompare(stringToCompare, templateString) + char *stringToCompare; + char *templateString; +#endif +{ + int match = 0; + + if (templateString != (char *)NULL && stringToCompare != (char *)NULL && + strlen(stringToCompare) <= strlen(templateString)) + match = (strncmp(templateString, + stringToCompare, + strlen(stringToCompare)) == 0); + + return match; +} /* subsetCompare */ + + +void pagination_on_command(arg, from_tty) + char *arg; + int from_tty; +{ + pagination_enabled = 1; +} + +void pagination_off_command(arg, from_tty) + char *arg; + int from_tty; +{ + pagination_enabled = 0; +} + + void initialize_utils () { @@ -2090,62 +2350,10 @@ initialize_utils () "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. */ -#if defined(__GO32__) - lines_per_page = ScreenRows(); - chars_per_line = ScreenCols(); -#else - lines_per_page = 24; - chars_per_line = 80; - -#if !defined (MPW) && !defined (_WIN32) - /* No termcap under MPW, although might be cool to do something - by looking at worksheet or console window sizes. */ - /* 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]; + init_page_info (); - 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; - } - } - } -#endif /* MPW */ - -#if defined(SIGWINCH) && defined(SIGWINCH_HANDLER) - - /* If there is a better way to determine the window size, use it. */ - SIGWINCH_HANDLER (SIGWINCH); -#endif -#endif /* If the output is not a terminal, don't paginate it. */ - if (!ISATTY (gdb_stdout)) + if (!GDB_FILE_ISATTY (gdb_stdout)) lines_per_page = UINT_MAX; set_width_command ((char *)NULL, 0, c); @@ -2158,6 +2366,19 @@ initialize_utils () &showprintlist); add_show_from_set + (add_set_cmd ("pagination", class_support, + var_boolean, (char *)&pagination_enabled, + "Set state of pagination.", &setlist), + &showlist); + if (xdb_commands) + { + add_com("am", class_support, pagination_on_command, + "Enable pagination"); + add_com("sm", class_support, pagination_off_command, + "Disable pagination"); + } + + 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.", |