`info user' => `show user'. Noticed by David Taylor.
[deliverable/binutils-gdb.git] / gdb / utils.c
1 /* General utility routines for GDB, the GNU debugger.
2 Copyright 1986, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include "defs.h"
21
22 #include <sys/ioctl.h>
23 #include <sys/param.h>
24 #include <pwd.h>
25 #include <varargs.h>
26 #include <ctype.h>
27 #include <string.h>
28
29 #include "signals.h"
30 #include "gdbcmd.h"
31 #include "terminal.h"
32 #include "bfd.h"
33 #include "target.h"
34
35 /* Prototypes for local functions */
36
37 #if !defined (NO_MALLOC_CHECK)
38
39 static void
40 malloc_botch PARAMS ((void));
41
42 #endif /* NO_MALLOC_CHECK */
43
44 static void
45 fatal_dump_core (); /* Can't prototype with <varargs.h> usage... */
46
47 static void
48 prompt_for_continue PARAMS ((void));
49
50 static void
51 set_width_command PARAMS ((char *, int, struct cmd_list_element *));
52
53 static void
54 vfprintf_filtered PARAMS ((FILE *, char *, va_list));
55
56 /* If this definition isn't overridden by the header files, assume
57 that isatty and fileno exist on this system. */
58 #ifndef ISATTY
59 #define ISATTY(FP) (isatty (fileno (FP)))
60 #endif
61
62 /* Chain of cleanup actions established with make_cleanup,
63 to be executed if an error happens. */
64
65 static struct cleanup *cleanup_chain;
66
67 /* Nonzero means a quit has been requested. */
68
69 int quit_flag;
70
71 /* Nonzero means quit immediately if Control-C is typed now,
72 rather than waiting until QUIT is executed. */
73
74 int immediate_quit;
75
76 /* Nonzero means that encoded C++ names should be printed out in their
77 C++ form rather than raw. */
78
79 int demangle = 1;
80
81 /* Nonzero means that encoded C++ names should be printed out in their
82 C++ form even in assembler language displays. If this is set, but
83 DEMANGLE is zero, names are printed raw, i.e. DEMANGLE controls. */
84
85 int asm_demangle = 0;
86
87 /* Nonzero means that strings with character values >0x7F should be printed
88 as octal escapes. Zero means just print the value (e.g. it's an
89 international character, and the terminal or window can cope.) */
90
91 int sevenbit_strings = 0;
92
93 /* String to be printed before error messages, if any. */
94
95 char *error_pre_print;
96 char *warning_pre_print = "\nwarning: ";
97 \f
98 /* Add a new cleanup to the cleanup_chain,
99 and return the previous chain pointer
100 to be passed later to do_cleanups or discard_cleanups.
101 Args are FUNCTION to clean up with, and ARG to pass to it. */
102
103 struct cleanup *
104 make_cleanup (function, arg)
105 void (*function) PARAMS ((PTR));
106 PTR arg;
107 {
108 register struct cleanup *new
109 = (struct cleanup *) xmalloc (sizeof (struct cleanup));
110 register struct cleanup *old_chain = cleanup_chain;
111
112 new->next = cleanup_chain;
113 new->function = function;
114 new->arg = arg;
115 cleanup_chain = new;
116
117 return old_chain;
118 }
119
120 /* Discard cleanups and do the actions they describe
121 until we get back to the point OLD_CHAIN in the cleanup_chain. */
122
123 void
124 do_cleanups (old_chain)
125 register struct cleanup *old_chain;
126 {
127 register struct cleanup *ptr;
128 while ((ptr = cleanup_chain) != old_chain)
129 {
130 cleanup_chain = ptr->next; /* Do this first incase recursion */
131 (*ptr->function) (ptr->arg);
132 free (ptr);
133 }
134 }
135
136 /* Discard cleanups, not doing the actions they describe,
137 until we get back to the point OLD_CHAIN in the cleanup_chain. */
138
139 void
140 discard_cleanups (old_chain)
141 register struct cleanup *old_chain;
142 {
143 register struct cleanup *ptr;
144 while ((ptr = cleanup_chain) != old_chain)
145 {
146 cleanup_chain = ptr->next;
147 free ((PTR)ptr);
148 }
149 }
150
151 /* Set the cleanup_chain to 0, and return the old cleanup chain. */
152 struct cleanup *
153 save_cleanups ()
154 {
155 struct cleanup *old_chain = cleanup_chain;
156
157 cleanup_chain = 0;
158 return old_chain;
159 }
160
161 /* Restore the cleanup chain from a previously saved chain. */
162 void
163 restore_cleanups (chain)
164 struct cleanup *chain;
165 {
166 cleanup_chain = chain;
167 }
168
169 /* This function is useful for cleanups.
170 Do
171
172 foo = xmalloc (...);
173 old_chain = make_cleanup (free_current_contents, &foo);
174
175 to arrange to free the object thus allocated. */
176
177 void
178 free_current_contents (location)
179 char **location;
180 {
181 free (*location);
182 }
183
184 /* Provide a known function that does nothing, to use as a base for
185 for a possibly long chain of cleanups. This is useful where we
186 use the cleanup chain for handling normal cleanups as well as dealing
187 with cleanups that need to be done as a result of a call to error().
188 In such cases, we may not be certain where the first cleanup is, unless
189 we have a do-nothing one to always use as the base. */
190
191 /* ARGSUSED */
192 void
193 null_cleanup (arg)
194 char **arg;
195 {
196 }
197
198 \f
199 /* Provide a hook for modules wishing to print their own warning messages
200 to set up the terminal state in a compatible way, without them having
201 to import all the target_<...> macros. */
202
203 void
204 warning_setup ()
205 {
206 target_terminal_ours ();
207 wrap_here(""); /* Force out any buffered output */
208 fflush (stdout);
209 }
210
211 /* Print a warning message.
212 The first argument STRING is the warning message, used as a fprintf string,
213 and the remaining args are passed as arguments to it.
214 The primary difference between warnings and errors is that a warning
215 does not force the return to command level. */
216
217 /* VARARGS */
218 void
219 warning (va_alist)
220 va_dcl
221 {
222 va_list args;
223 char *string;
224
225 va_start (args);
226 target_terminal_ours ();
227 wrap_here(""); /* Force out any buffered output */
228 fflush (stdout);
229 if (warning_pre_print)
230 fprintf (stderr, warning_pre_print);
231 string = va_arg (args, char *);
232 vfprintf (stderr, string, args);
233 fprintf (stderr, "\n");
234 va_end (args);
235 }
236
237 /* Print an error message and return to command level.
238 The first argument STRING is the error message, used as a fprintf string,
239 and the remaining args are passed as arguments to it. */
240
241 /* VARARGS */
242 NORETURN void
243 error (va_alist)
244 va_dcl
245 {
246 va_list args;
247 char *string;
248
249 va_start (args);
250 target_terminal_ours ();
251 wrap_here(""); /* Force out any buffered output */
252 fflush (stdout);
253 if (error_pre_print)
254 fprintf (stderr, error_pre_print);
255 string = va_arg (args, char *);
256 vfprintf (stderr, string, args);
257 fprintf (stderr, "\n");
258 va_end (args);
259 return_to_top_level ();
260 }
261
262 /* Print an error message and exit reporting failure.
263 This is for a error that we cannot continue from.
264 The arguments are printed a la printf.
265
266 This function cannot be declared volatile (NORETURN) in an
267 ANSI environment because exit() is not declared volatile. */
268
269 /* VARARGS */
270 NORETURN void
271 fatal (va_alist)
272 va_dcl
273 {
274 va_list args;
275 char *string;
276
277 va_start (args);
278 string = va_arg (args, char *);
279 fprintf (stderr, "\ngdb: ");
280 vfprintf (stderr, string, args);
281 fprintf (stderr, "\n");
282 va_end (args);
283 exit (1);
284 }
285
286 /* Print an error message and exit, dumping core.
287 The arguments are printed a la printf (). */
288
289 /* VARARGS */
290 static void
291 fatal_dump_core (va_alist)
292 va_dcl
293 {
294 va_list args;
295 char *string;
296
297 va_start (args);
298 string = va_arg (args, char *);
299 /* "internal error" is always correct, since GDB should never dump
300 core, no matter what the input. */
301 fprintf (stderr, "\ngdb internal error: ");
302 vfprintf (stderr, string, args);
303 fprintf (stderr, "\n");
304 va_end (args);
305
306 signal (SIGQUIT, SIG_DFL);
307 kill (getpid (), SIGQUIT);
308 /* We should never get here, but just in case... */
309 exit (1);
310 }
311
312 /* The strerror() function can return NULL for errno values that are
313 out of range. Provide a "safe" version that always returns a
314 printable string. */
315
316 char *
317 safe_strerror (errnum)
318 int errnum;
319 {
320 char *msg;
321 static char buf[32];
322
323 if ((msg = strerror (errnum)) == NULL)
324 {
325 sprintf (buf, "(undocumented errno %d)", errnum);
326 msg = buf;
327 }
328 return (msg);
329 }
330
331 /* The strsignal() function can return NULL for signal values that are
332 out of range. Provide a "safe" version that always returns a
333 printable string. */
334
335 char *
336 safe_strsignal (signo)
337 int signo;
338 {
339 char *msg;
340 static char buf[32];
341
342 if ((msg = strsignal (signo)) == NULL)
343 {
344 sprintf (buf, "(undocumented signal %d)", signo);
345 msg = buf;
346 }
347 return (msg);
348 }
349
350
351 /* Print the system error message for errno, and also mention STRING
352 as the file name for which the error was encountered.
353 Then return to command level. */
354
355 void
356 perror_with_name (string)
357 char *string;
358 {
359 char *err;
360 char *combined;
361
362 err = safe_strerror (errno);
363 combined = (char *) alloca (strlen (err) + strlen (string) + 3);
364 strcpy (combined, string);
365 strcat (combined, ": ");
366 strcat (combined, err);
367
368 /* I understand setting these is a matter of taste. Still, some people
369 may clear errno but not know about bfd_error. Doing this here is not
370 unreasonable. */
371 bfd_error = no_error;
372 errno = 0;
373
374 error ("%s.", combined);
375 }
376
377 /* Print the system error message for ERRCODE, and also mention STRING
378 as the file name for which the error was encountered. */
379
380 void
381 print_sys_errmsg (string, errcode)
382 char *string;
383 int errcode;
384 {
385 char *err;
386 char *combined;
387
388 err = safe_strerror (errcode);
389 combined = (char *) alloca (strlen (err) + strlen (string) + 3);
390 strcpy (combined, string);
391 strcat (combined, ": ");
392 strcat (combined, err);
393
394 printf ("%s.\n", combined);
395 }
396
397 /* Control C eventually causes this to be called, at a convenient time. */
398
399 void
400 quit ()
401 {
402 target_terminal_ours ();
403 wrap_here ((char *)0); /* Force out any pending output */
404 #ifdef HAVE_TERMIO
405 ioctl (fileno (stdout), TCFLSH, 1);
406 #else /* not HAVE_TERMIO */
407 ioctl (fileno (stdout), TIOCFLUSH, 0);
408 #endif /* not HAVE_TERMIO */
409 #ifdef TIOCGPGRP
410 error ("Quit");
411 #else
412 error ("Quit (expect signal %d when inferior is resumed)", SIGINT);
413 #endif /* TIOCGPGRP */
414 }
415
416 /* Control C comes here */
417
418 void
419 request_quit (signo)
420 int signo;
421 {
422 quit_flag = 1;
423
424 #ifdef USG
425 /* Restore the signal handler. */
426 signal (signo, request_quit);
427 #endif
428
429 if (immediate_quit)
430 quit ();
431 }
432
433 \f
434 /* Memory management stuff (malloc friends). */
435
436 #if defined (NO_MMALLOC)
437
438 PTR
439 mmalloc (md, size)
440 PTR md;
441 long size;
442 {
443 return (malloc (size));
444 }
445
446 PTR
447 mrealloc (md, ptr, size)
448 PTR md;
449 PTR ptr;
450 long size;
451 {
452 if (ptr == 0) /* Guard against old realloc's */
453 return malloc (size);
454 else
455 return realloc (ptr, size);
456 }
457
458 void
459 mfree (md, ptr)
460 PTR md;
461 PTR ptr;
462 {
463 free (ptr);
464 }
465
466 #endif /* NO_MMALLOC */
467
468 #if defined (NO_MMALLOC) || defined (NO_MMALLOC_CHECK)
469
470 void
471 init_malloc (md)
472 PTR md;
473 {
474 }
475
476 #else /* have mmalloc and want corruption checking */
477
478 static void
479 malloc_botch ()
480 {
481 fatal_dump_core ("Memory corruption");
482 }
483
484 /* Attempt to install hooks in mmalloc/mrealloc/mfree for the heap specified
485 by MD, to detect memory corruption. Note that MD may be NULL to specify
486 the default heap that grows via sbrk.
487
488 Note that for freshly created regions, we must call mmcheck prior to any
489 mallocs in the region. Otherwise, any region which was allocated prior to
490 installing the checking hooks, which is later reallocated or freed, will
491 fail the checks! The mmcheck function only allows initial hooks to be
492 installed before the first mmalloc. However, anytime after we have called
493 mmcheck the first time to install the checking hooks, we can call it again
494 to update the function pointer to the memory corruption handler.
495
496 Returns zero on failure, non-zero on success. */
497
498 void
499 init_malloc (md)
500 PTR md;
501 {
502 if (!mmcheck (md, malloc_botch))
503 {
504 warning ("internal error: failed to install memory consistency checks");
505 }
506
507 (void) mmtrace ();
508 }
509
510 #endif /* Have mmalloc and want corruption checking */
511
512 /* Called when a memory allocation fails, with the number of bytes of
513 memory requested in SIZE. */
514
515 NORETURN void
516 nomem (size)
517 long size;
518 {
519 if (size > 0)
520 {
521 fatal ("virtual memory exhausted: can't allocate %ld bytes.", size);
522 }
523 else
524 {
525 fatal ("virtual memory exhausted.");
526 }
527 }
528
529 /* Like mmalloc but get error if no storage available, and protect against
530 the caller wanting to allocate zero bytes. Whether to return NULL for
531 a zero byte request, or translate the request into a request for one
532 byte of zero'd storage, is a religious issue. */
533
534 PTR
535 xmmalloc (md, size)
536 PTR md;
537 long size;
538 {
539 register PTR val;
540
541 if (size == 0)
542 {
543 val = NULL;
544 }
545 else if ((val = mmalloc (md, size)) == NULL)
546 {
547 nomem (size);
548 }
549 return (val);
550 }
551
552 /* Like mrealloc but get error if no storage available. */
553
554 PTR
555 xmrealloc (md, ptr, size)
556 PTR md;
557 PTR ptr;
558 long size;
559 {
560 register PTR val;
561
562 if (ptr != NULL)
563 {
564 val = mrealloc (md, ptr, size);
565 }
566 else
567 {
568 val = mmalloc (md, size);
569 }
570 if (val == NULL)
571 {
572 nomem (size);
573 }
574 return (val);
575 }
576
577 /* Like malloc but get error if no storage available, and protect against
578 the caller wanting to allocate zero bytes. */
579
580 PTR
581 xmalloc (size)
582 long size;
583 {
584 return (xmmalloc ((void *) NULL, size));
585 }
586
587 /* Like mrealloc but get error if no storage available. */
588
589 PTR
590 xrealloc (ptr, size)
591 PTR ptr;
592 long size;
593 {
594 return (xmrealloc ((void *) NULL, ptr, size));
595 }
596
597 \f
598 /* My replacement for the read system call.
599 Used like `read' but keeps going if `read' returns too soon. */
600
601 int
602 myread (desc, addr, len)
603 int desc;
604 char *addr;
605 int len;
606 {
607 register int val;
608 int orglen = len;
609
610 while (len > 0)
611 {
612 val = read (desc, addr, len);
613 if (val < 0)
614 return val;
615 if (val == 0)
616 return orglen - len;
617 len -= val;
618 addr += val;
619 }
620 return orglen;
621 }
622 \f
623 /* Make a copy of the string at PTR with SIZE characters
624 (and add a null character at the end in the copy).
625 Uses malloc to get the space. Returns the address of the copy. */
626
627 char *
628 savestring (ptr, size)
629 const char *ptr;
630 int size;
631 {
632 register char *p = (char *) xmalloc (size + 1);
633 bcopy (ptr, p, size);
634 p[size] = 0;
635 return p;
636 }
637
638 char *
639 msavestring (md, ptr, size)
640 void *md;
641 const char *ptr;
642 int size;
643 {
644 register char *p = (char *) xmmalloc (md, size + 1);
645 bcopy (ptr, p, size);
646 p[size] = 0;
647 return p;
648 }
649
650 /* The "const" is so it compiles under DGUX (which prototypes strsave
651 in <string.h>. FIXME: This should be named "xstrsave", shouldn't it?
652 Doesn't real strsave return NULL if out of memory? */
653 char *
654 strsave (ptr)
655 const char *ptr;
656 {
657 return savestring (ptr, strlen (ptr));
658 }
659
660 char *
661 mstrsave (md, ptr)
662 void *md;
663 const char *ptr;
664 {
665 return (msavestring (md, ptr, strlen (ptr)));
666 }
667
668 void
669 print_spaces (n, file)
670 register int n;
671 register FILE *file;
672 {
673 while (n-- > 0)
674 fputc (' ', file);
675 }
676
677 /* Ask user a y-or-n question and return 1 iff answer is yes.
678 Takes three args which are given to printf to print the question.
679 The first, a control string, should end in "? ".
680 It should not say how to answer, because we do that. */
681
682 /* VARARGS */
683 int
684 query (va_alist)
685 va_dcl
686 {
687 va_list args;
688 char *ctlstr;
689 register int answer;
690 register int ans2;
691
692 /* Automatically answer "yes" if input is not from a terminal. */
693 if (!input_from_terminal_p ())
694 return 1;
695
696 while (1)
697 {
698 va_start (args);
699 ctlstr = va_arg (args, char *);
700 vfprintf (stdout, ctlstr, args);
701 va_end (args);
702 printf ("(y or n) ");
703 fflush (stdout);
704 answer = fgetc (stdin);
705 clearerr (stdin); /* in case of C-d */
706 if (answer == EOF) /* C-d */
707 return 1;
708 if (answer != '\n') /* Eat rest of input line, to EOF or newline */
709 do
710 {
711 ans2 = fgetc (stdin);
712 clearerr (stdin);
713 }
714 while (ans2 != EOF && ans2 != '\n');
715 if (answer >= 'a')
716 answer -= 040;
717 if (answer == 'Y')
718 return 1;
719 if (answer == 'N')
720 return 0;
721 printf ("Please answer y or n.\n");
722 }
723 }
724
725 \f
726 /* Parse a C escape sequence. STRING_PTR points to a variable
727 containing a pointer to the string to parse. That pointer
728 should point to the character after the \. That pointer
729 is updated past the characters we use. The value of the
730 escape sequence is returned.
731
732 A negative value means the sequence \ newline was seen,
733 which is supposed to be equivalent to nothing at all.
734
735 If \ is followed by a null character, we return a negative
736 value and leave the string pointer pointing at the null character.
737
738 If \ is followed by 000, we return 0 and leave the string pointer
739 after the zeros. A value of 0 does not mean end of string. */
740
741 int
742 parse_escape (string_ptr)
743 char **string_ptr;
744 {
745 register int c = *(*string_ptr)++;
746 switch (c)
747 {
748 case 'a':
749 return 007; /* Bell (alert) char */
750 case 'b':
751 return '\b';
752 case 'e': /* Escape character */
753 return 033;
754 case 'f':
755 return '\f';
756 case 'n':
757 return '\n';
758 case 'r':
759 return '\r';
760 case 't':
761 return '\t';
762 case 'v':
763 return '\v';
764 case '\n':
765 return -2;
766 case 0:
767 (*string_ptr)--;
768 return 0;
769 case '^':
770 c = *(*string_ptr)++;
771 if (c == '\\')
772 c = parse_escape (string_ptr);
773 if (c == '?')
774 return 0177;
775 return (c & 0200) | (c & 037);
776
777 case '0':
778 case '1':
779 case '2':
780 case '3':
781 case '4':
782 case '5':
783 case '6':
784 case '7':
785 {
786 register int i = c - '0';
787 register int count = 0;
788 while (++count < 3)
789 {
790 if ((c = *(*string_ptr)++) >= '0' && c <= '7')
791 {
792 i *= 8;
793 i += c - '0';
794 }
795 else
796 {
797 (*string_ptr)--;
798 break;
799 }
800 }
801 return i;
802 }
803 default:
804 return c;
805 }
806 }
807 \f
808 /* Print the character C on STREAM as part of the contents
809 of a literal string whose delimiter is QUOTER. */
810
811 void
812 printchar (c, stream, quoter)
813 register int c;
814 FILE *stream;
815 int quoter;
816 {
817
818 c &= 0xFF; /* Avoid sign bit follies */
819
820 if ( c < 0x20 || /* Low control chars */
821 (c >= 0x7F && c < 0xA0) || /* DEL, High controls */
822 (sevenbit_strings && c >= 0x80)) { /* high order bit set */
823 switch (c)
824 {
825 case '\n':
826 fputs_filtered ("\\n", stream);
827 break;
828 case '\b':
829 fputs_filtered ("\\b", stream);
830 break;
831 case '\t':
832 fputs_filtered ("\\t", stream);
833 break;
834 case '\f':
835 fputs_filtered ("\\f", stream);
836 break;
837 case '\r':
838 fputs_filtered ("\\r", stream);
839 break;
840 case '\033':
841 fputs_filtered ("\\e", stream);
842 break;
843 case '\007':
844 fputs_filtered ("\\a", stream);
845 break;
846 default:
847 fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
848 break;
849 }
850 } else {
851 if (c == '\\' || c == quoter)
852 fputs_filtered ("\\", stream);
853 fprintf_filtered (stream, "%c", c);
854 }
855 }
856 \f
857 /* Number of lines per page or UINT_MAX if paging is disabled. */
858 static unsigned int lines_per_page;
859 /* Number of chars per line or UNIT_MAX is line folding is disabled. */
860 static unsigned int chars_per_line;
861 /* Current count of lines printed on this page, chars on this line. */
862 static unsigned int lines_printed, chars_printed;
863
864 /* Buffer and start column of buffered text, for doing smarter word-
865 wrapping. When someone calls wrap_here(), we start buffering output
866 that comes through fputs_filtered(). If we see a newline, we just
867 spit it out and forget about the wrap_here(). If we see another
868 wrap_here(), we spit it out and remember the newer one. If we see
869 the end of the line, we spit out a newline, the indent, and then
870 the buffered output.
871
872 wrap_column is the column number on the screen where wrap_buffer begins.
873 When wrap_column is zero, wrapping is not in effect.
874 wrap_buffer is malloc'd with chars_per_line+2 bytes.
875 When wrap_buffer[0] is null, the buffer is empty.
876 wrap_pointer points into it at the next character to fill.
877 wrap_indent is the string that should be used as indentation if the
878 wrap occurs. */
879
880 static char *wrap_buffer, *wrap_pointer, *wrap_indent;
881 static int wrap_column;
882
883 /* ARGSUSED */
884 static void
885 set_width_command (args, from_tty, c)
886 char *args;
887 int from_tty;
888 struct cmd_list_element *c;
889 {
890 if (!wrap_buffer)
891 {
892 wrap_buffer = (char *) xmalloc (chars_per_line + 2);
893 wrap_buffer[0] = '\0';
894 }
895 else
896 wrap_buffer = (char *) xrealloc (wrap_buffer, chars_per_line + 2);
897 wrap_pointer = wrap_buffer; /* Start it at the beginning */
898 }
899
900 static void
901 prompt_for_continue ()
902 {
903 char *ignore;
904
905 immediate_quit++;
906 ignore = gdb_readline ("---Type <return> to continue---");
907 if (ignore)
908 free (ignore);
909 chars_printed = lines_printed = 0;
910 immediate_quit--;
911 dont_repeat (); /* Forget prev cmd -- CR won't repeat it. */
912 }
913
914 /* Reinitialize filter; ie. tell it to reset to original values. */
915
916 void
917 reinitialize_more_filter ()
918 {
919 lines_printed = 0;
920 chars_printed = 0;
921 }
922
923 /* Indicate that if the next sequence of characters overflows the line,
924 a newline should be inserted here rather than when it hits the end.
925 If INDENT is nonzero, it is a string to be printed to indent the
926 wrapped part on the next line. INDENT must remain accessible until
927 the next call to wrap_here() or until a newline is printed through
928 fputs_filtered().
929
930 If the line is already overfull, we immediately print a newline and
931 the indentation, and disable further wrapping.
932
933 If we don't know the width of lines, but we know the page height,
934 we must not wrap words, but should still keep track of newlines
935 that were explicitly printed.
936
937 INDENT should not contain tabs, as that
938 will mess up the char count on the next line. FIXME. */
939
940 void
941 wrap_here(indent)
942 char *indent;
943 {
944 if (wrap_buffer[0])
945 {
946 *wrap_pointer = '\0';
947 fputs (wrap_buffer, stdout);
948 }
949 wrap_pointer = wrap_buffer;
950 wrap_buffer[0] = '\0';
951 if (chars_per_line == UINT_MAX) /* No line overflow checking */
952 {
953 wrap_column = 0;
954 }
955 else if (chars_printed >= chars_per_line)
956 {
957 puts_filtered ("\n");
958 puts_filtered (indent);
959 wrap_column = 0;
960 }
961 else
962 {
963 wrap_column = chars_printed;
964 wrap_indent = indent;
965 }
966 }
967
968 /* Like fputs but pause after every screenful, and can wrap at points
969 other than the final character of a line.
970 Unlike fputs, fputs_filtered does not return a value.
971 It is OK for LINEBUFFER to be NULL, in which case just don't print
972 anything.
973
974 Note that a longjmp to top level may occur in this routine
975 (since prompt_for_continue may do so) so this routine should not be
976 called when cleanups are not in place. */
977
978 void
979 fputs_filtered (linebuffer, stream)
980 const char *linebuffer;
981 FILE *stream;
982 {
983 const char *lineptr;
984
985 if (linebuffer == 0)
986 return;
987
988 /* Don't do any filtering if it is disabled. */
989 if (stream != stdout
990 || (lines_per_page == UINT_MAX && chars_per_line == UINT_MAX))
991 {
992 fputs (linebuffer, stream);
993 return;
994 }
995
996 /* Go through and output each character. Show line extension
997 when this is necessary; prompt user for new page when this is
998 necessary. */
999
1000 lineptr = linebuffer;
1001 while (*lineptr)
1002 {
1003 /* Possible new page. */
1004 if (lines_printed >= lines_per_page - 1)
1005 prompt_for_continue ();
1006
1007 while (*lineptr && *lineptr != '\n')
1008 {
1009 /* Print a single line. */
1010 if (*lineptr == '\t')
1011 {
1012 if (wrap_column)
1013 *wrap_pointer++ = '\t';
1014 else
1015 putc ('\t', stream);
1016 /* Shifting right by 3 produces the number of tab stops
1017 we have already passed, and then adding one and
1018 shifting left 3 advances to the next tab stop. */
1019 chars_printed = ((chars_printed >> 3) + 1) << 3;
1020 lineptr++;
1021 }
1022 else
1023 {
1024 if (wrap_column)
1025 *wrap_pointer++ = *lineptr;
1026 else
1027 putc (*lineptr, stream);
1028 chars_printed++;
1029 lineptr++;
1030 }
1031
1032 if (chars_printed >= chars_per_line)
1033 {
1034 unsigned int save_chars = chars_printed;
1035
1036 chars_printed = 0;
1037 lines_printed++;
1038 /* If we aren't actually wrapping, don't output newline --
1039 if chars_per_line is right, we probably just overflowed
1040 anyway; if it's wrong, let us keep going. */
1041 if (wrap_column)
1042 putc ('\n', stream);
1043
1044 /* Possible new page. */
1045 if (lines_printed >= lines_per_page - 1)
1046 prompt_for_continue ();
1047
1048 /* Now output indentation and wrapped string */
1049 if (wrap_column)
1050 {
1051 if (wrap_indent)
1052 fputs (wrap_indent, stream);
1053 *wrap_pointer = '\0'; /* Null-terminate saved stuff */
1054 fputs (wrap_buffer, stream); /* and eject it */
1055 /* FIXME, this strlen is what prevents wrap_indent from
1056 containing tabs. However, if we recurse to print it
1057 and count its chars, we risk trouble if wrap_indent is
1058 longer than (the user settable) chars_per_line.
1059 Note also that this can set chars_printed > chars_per_line
1060 if we are printing a long string. */
1061 chars_printed = strlen (wrap_indent)
1062 + (save_chars - wrap_column);
1063 wrap_pointer = wrap_buffer; /* Reset buffer */
1064 wrap_buffer[0] = '\0';
1065 wrap_column = 0; /* And disable fancy wrap */
1066 }
1067 }
1068 }
1069
1070 if (*lineptr == '\n')
1071 {
1072 chars_printed = 0;
1073 wrap_here ((char *)0); /* Spit out chars, cancel further wraps */
1074 lines_printed++;
1075 putc ('\n', stream);
1076 lineptr++;
1077 }
1078 }
1079 }
1080
1081
1082 /* fputs_demangled is a variant of fputs_filtered that
1083 demangles g++ names.*/
1084
1085 void
1086 fputs_demangled (linebuffer, stream, arg_mode)
1087 char *linebuffer;
1088 FILE *stream;
1089 int arg_mode;
1090 {
1091 #define SYMBOL_MAX 1024
1092
1093 #define SYMBOL_CHAR(c) (isascii(c) \
1094 && (isalnum(c) || (c) == '_' || (c) == CPLUS_MARKER))
1095
1096 char buf[SYMBOL_MAX+1];
1097 # define SLOP 5 /* How much room to leave in buf */
1098 char *p;
1099
1100 if (linebuffer == NULL)
1101 return;
1102
1103 /* If user wants to see raw output, no problem. */
1104 if (!demangle) {
1105 fputs_filtered (linebuffer, stream);
1106 return;
1107 }
1108
1109 p = linebuffer;
1110
1111 while ( *p != (char) 0 ) {
1112 int i = 0;
1113
1114 /* collect non-interesting characters into buf */
1115 while ( *p != (char) 0 && !SYMBOL_CHAR(*p) && i < (int)sizeof(buf)-SLOP ) {
1116 buf[i++] = *p;
1117 p++;
1118 }
1119 if (i > 0) {
1120 /* output the non-interesting characters without demangling */
1121 buf[i] = (char) 0;
1122 fputs_filtered(buf, stream);
1123 i = 0; /* reset buf */
1124 }
1125
1126 /* and now the interesting characters */
1127 while (i < SYMBOL_MAX
1128 && *p != (char) 0
1129 && SYMBOL_CHAR(*p)
1130 && i < (int)sizeof(buf) - SLOP) {
1131 buf[i++] = *p;
1132 p++;
1133 }
1134 buf[i] = (char) 0;
1135 if (i > 0) {
1136 char * result;
1137
1138 if ( (result = cplus_demangle(buf, arg_mode)) != NULL ) {
1139 fputs_filtered(result, stream);
1140 free(result);
1141 }
1142 else {
1143 fputs_filtered(buf, stream);
1144 }
1145 }
1146 }
1147 }
1148
1149 /* Print a variable number of ARGS using format FORMAT. If this
1150 information is going to put the amount written (since the last call
1151 to INITIALIZE_MORE_FILTER or the last page break) over the page size,
1152 print out a pause message and do a gdb_readline to get the users
1153 permision to continue.
1154
1155 Unlike fprintf, this function does not return a value.
1156
1157 We implement three variants, vfprintf (takes a vararg list and stream),
1158 fprintf (takes a stream to write on), and printf (the usual).
1159
1160 Note that this routine has a restriction that the length of the
1161 final output line must be less than 255 characters *or* it must be
1162 less than twice the size of the format string. This is a very
1163 arbitrary restriction, but it is an internal restriction, so I'll
1164 put it in. This means that the %s format specifier is almost
1165 useless; unless the caller can GUARANTEE that the string is short
1166 enough, fputs_filtered should be used instead.
1167
1168 Note also that a longjmp to top level may occur in this routine
1169 (since prompt_for_continue may do so) so this routine should not be
1170 called when cleanups are not in place. */
1171
1172 static void
1173 vfprintf_filtered (stream, format, args)
1174 FILE *stream;
1175 char *format;
1176 va_list args;
1177 {
1178 static char *linebuffer = (char *) 0;
1179 static int line_size;
1180 int format_length;
1181
1182 format_length = strlen (format);
1183
1184 /* Allocated linebuffer for the first time. */
1185 if (!linebuffer)
1186 {
1187 linebuffer = (char *) xmalloc (255);
1188 line_size = 255;
1189 }
1190
1191 /* Reallocate buffer to a larger size if this is necessary. */
1192 if (format_length * 2 > line_size)
1193 {
1194 line_size = format_length * 2;
1195
1196 /* You don't have to copy. */
1197 free (linebuffer);
1198 linebuffer = (char *) xmalloc (line_size);
1199 }
1200
1201
1202 /* This won't blow up if the restrictions described above are
1203 followed. */
1204 (void) vsprintf (linebuffer, format, args);
1205
1206 fputs_filtered (linebuffer, stream);
1207 }
1208
1209 /* VARARGS */
1210 void
1211 fprintf_filtered (va_alist)
1212 va_dcl
1213 {
1214 FILE *stream;
1215 char *format;
1216 va_list args;
1217
1218 va_start (args);
1219 stream = va_arg (args, FILE *);
1220 format = va_arg (args, char *);
1221
1222 /* This won't blow up if the restrictions described above are
1223 followed. */
1224 vfprintf_filtered (stream, format, args);
1225 va_end (args);
1226 }
1227
1228 /* VARARGS */
1229 void
1230 printf_filtered (va_alist)
1231 va_dcl
1232 {
1233 va_list args;
1234 char *format;
1235
1236 va_start (args);
1237 format = va_arg (args, char *);
1238
1239 vfprintf_filtered (stdout, format, args);
1240 va_end (args);
1241 }
1242
1243 /* Easy */
1244
1245 void
1246 puts_filtered (string)
1247 char *string;
1248 {
1249 fputs_filtered (string, stdout);
1250 }
1251
1252 /* Return a pointer to N spaces and a null. The pointer is good
1253 until the next call to here. */
1254 char *
1255 n_spaces (n)
1256 int n;
1257 {
1258 register char *t;
1259 static char *spaces;
1260 static int max_spaces;
1261
1262 if (n > max_spaces)
1263 {
1264 if (spaces)
1265 free (spaces);
1266 spaces = (char *) xmalloc (n+1);
1267 for (t = spaces+n; t != spaces;)
1268 *--t = ' ';
1269 spaces[n] = '\0';
1270 max_spaces = n;
1271 }
1272
1273 return spaces + max_spaces - n;
1274 }
1275
1276 /* Print N spaces. */
1277 void
1278 print_spaces_filtered (n, stream)
1279 int n;
1280 FILE *stream;
1281 {
1282 fputs_filtered (n_spaces (n), stream);
1283 }
1284 \f
1285 /* C++ demangler stuff. */
1286
1287 /* Print NAME on STREAM, demangling if necessary. */
1288 void
1289 fprint_symbol (stream, name)
1290 FILE *stream;
1291 char *name;
1292 {
1293 char *demangled;
1294 if ((!demangle) || NULL == (demangled = cplus_demangle (name, 1)))
1295 fputs_filtered (name, stream);
1296 else
1297 {
1298 fputs_filtered (demangled, stream);
1299 free (demangled);
1300 }
1301 }
1302 \f
1303 void
1304 _initialize_utils ()
1305 {
1306 struct cmd_list_element *c;
1307
1308 c = add_set_cmd ("width", class_support, var_uinteger,
1309 (char *)&chars_per_line,
1310 "Set number of characters gdb thinks are in a line.",
1311 &setlist);
1312 add_show_from_set (c, &showlist);
1313 c->function.sfunc = set_width_command;
1314
1315 add_show_from_set
1316 (add_set_cmd ("height", class_support,
1317 var_uinteger, (char *)&lines_per_page,
1318 "Set number of lines gdb thinks are in a page.", &setlist),
1319 &showlist);
1320
1321 /* These defaults will be used if we are unable to get the correct
1322 values from termcap. */
1323 lines_per_page = 24;
1324 chars_per_line = 80;
1325 /* Initialize the screen height and width from termcap. */
1326 {
1327 char *termtype = getenv ("TERM");
1328
1329 /* Positive means success, nonpositive means failure. */
1330 int status;
1331
1332 /* 2048 is large enough for all known terminals, according to the
1333 GNU termcap manual. */
1334 char term_buffer[2048];
1335
1336 if (termtype)
1337 {
1338 status = tgetent (term_buffer, termtype);
1339 if (status > 0)
1340 {
1341 int val;
1342
1343 val = tgetnum ("li");
1344 if (val >= 0)
1345 lines_per_page = val;
1346 else
1347 /* The number of lines per page is not mentioned
1348 in the terminal description. This probably means
1349 that paging is not useful (e.g. emacs shell window),
1350 so disable paging. */
1351 lines_per_page = UINT_MAX;
1352
1353 val = tgetnum ("co");
1354 if (val >= 0)
1355 chars_per_line = val;
1356 }
1357 }
1358 }
1359
1360 #if defined(SIGWINCH) && defined(SIGWINCH_HANDLER)
1361
1362 /* If there is a better way to determine the window size, use it. */
1363 SIGWINCH_HANDLER ();
1364 #endif
1365
1366 /* If the output is not a terminal, don't paginate it. */
1367 if (!ISATTY (stdout))
1368 lines_per_page = UINT_MAX;
1369
1370 set_width_command ((char *)NULL, 0, c);
1371
1372 add_show_from_set
1373 (add_set_cmd ("demangle", class_support, var_boolean,
1374 (char *)&demangle,
1375 "Set demangling of encoded C++ names when displaying symbols.",
1376 &setprintlist),
1377 &showprintlist);
1378
1379 add_show_from_set
1380 (add_set_cmd ("sevenbit-strings", class_support, var_boolean,
1381 (char *)&sevenbit_strings,
1382 "Set printing of 8-bit characters in strings as \\nnn.",
1383 &setprintlist),
1384 &showprintlist);
1385
1386 add_show_from_set
1387 (add_set_cmd ("asm-demangle", class_support, var_boolean,
1388 (char *)&asm_demangle,
1389 "Set demangling of C++ names in disassembly listings.",
1390 &setprintlist),
1391 &showprintlist);
1392 }
1393
1394 /* Machine specific function to handle SIGWINCH signal. */
1395
1396 #ifdef SIGWINCH_HANDLER_BODY
1397 SIGWINCH_HANDLER_BODY
1398 #endif
This page took 0.058574 seconds and 4 git commands to generate.