diff options
Diffstat (limited to 'gdb/utils.c')
-rw-r--r-- | gdb/utils.c | 102 |
1 files changed, 74 insertions, 28 deletions
diff --git a/gdb/utils.c b/gdb/utils.c index 98adad0..43b8472 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -21,14 +21,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <sys/ioctl.h> #include <sys/param.h> #include <pwd.h> +#include <varargs.h> +#include <ctype.h> +#include <string.h> + #include "defs.h" #include "param.h" #include "signals.h" #include "gdbcmd.h" #include "terminal.h" -#include <varargs.h> -#include <ctype.h> -#include <string.h> #include "bfd.h" #include "target.h" @@ -51,7 +52,15 @@ extern char *realloc(); #else /* !__GNU_LIBRARY */ #ifndef vfprintf -#define vfprintf(file, format, ap) _doprnt (format, ap, file) +/* Can't #define it since language.c needs it (though FIXME it shouldn't) */ +void +vfprintf (file, format, ap) + FILE *file; + char *format; + va_list ap; +{ + _doprnt (format, ap, file); +} #endif /* vfprintf */ #ifndef vprintf @@ -105,6 +114,7 @@ int sevenbit_strings = 0; /* String to be printed before error messages, if any. */ char *error_pre_print; +char *warning_pre_print; /* Add a new cleanup to the cleanup_chain, and return the previous chain pointer @@ -192,6 +202,44 @@ free_current_contents (location) free (*location); } +/* 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); +} + /* 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. */ @@ -206,6 +254,7 @@ error (va_alist) va_start (args); target_terminal_ours (); + wrap_here(""); /* Force out any buffered output */ fflush (stdout); if (error_pre_print) fprintf (stderr, error_pre_print); @@ -558,10 +607,10 @@ parse_escape (string_ptr) switch (c) { case 'a': - return '\a'; + return 007; /* Bell (alert) char */ case 'b': return '\b'; - case 'e': + case 'e': /* Escape character */ return 033; case 'f': return '\f'; @@ -628,7 +677,7 @@ printchar (ch, stream, quoter) { register int c = ch; - if (c < 040 || (sevenbit_strings && c >= 0177)) + if (c < 040 || (sevenbit_strings && c >= 0177)) { switch (c) { case '\n': @@ -656,12 +705,11 @@ printchar (ch, stream, quoter) fprintf_filtered (stream, "\\%.3o", (unsigned int) c); break; } - else - { - if (c == '\\' || c == quoter) - fputs_filtered ("\\", stream); - fprintf_filtered (stream, "%c", c); - } + } else { + if (c == '\\' || c == quoter) + fputs_filtered ("\\", stream); + fprintf_filtered (stream, "%c", c); + } } /* Number of lines per page or UINT_MAX if paging is disabled. */ @@ -690,20 +738,6 @@ static unsigned int lines_printed, chars_printed; static char *wrap_buffer, *wrap_pointer, *wrap_indent; static int wrap_column; -/* Get the number of lines to print with commands like "list". - This is based on guessing how many long (i.e. more than chars_per_line - characters) lines there will be. To be completely correct, "list" - and friends should be rewritten to count characters and see where - things are wrapping, but that would be a fair amount of work. */ -int -lines_to_list () -{ - /* RMS didn't like the following algorithm. Let's set it back to - 10 and see if anyone else complains. */ - /* return lines_per_page == UINT_MAX ? 10 : lines_per_page / 2; */ - return 10; -} - /* ARGSUSED */ static void set_width_command (args, from_tty, c) @@ -754,6 +788,10 @@ reinitialize_more_filter () If the line is already overfull, we immediately print a newline and the indentation, and disable further wrapping. + 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. + INDENT should not contain tabs, as that will mess up the char count on the next line. FIXME. */ @@ -768,7 +806,11 @@ wrap_here(indent) } wrap_pointer = wrap_buffer; wrap_buffer[0] = '\0'; - if (chars_printed >= chars_per_line) + if (chars_per_line == UINT_MAX) /* No line overflow checking */ + { + wrap_column = 0; + } + else if (chars_printed >= chars_per_line) { puts_filtered ("\n"); puts_filtered (indent); @@ -1291,6 +1333,10 @@ _initialize_utils () } } + /* If the output is not a terminal, don't paginate it. */ + if (!ISATTY (stdout)) + lines_per_page = UINT_MAX; + set_width_command ((char *)NULL, 0, c); add_show_from_set |