|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * @OSF_COPYRIGHT@
24: */
25: /*
26: * HISTORY
27: *
28: * Revision 1.1.1.1 1998/09/22 21:05:48 wsanchez
29: * Import of Mac OS X kernel (~semeria)
30: *
31: * Revision 1.1.1.1 1998/03/07 02:26:09 wsanchez
32: * Import of OSF Mach kernel (~mburg)
33: *
34: * Revision 1.3.17.6 1996/01/09 19:15:57 devrcs
35: * In db_more(), if using kdebug on Alpha, don't get input.
36: * [1995/12/01 21:42:17 jfraser]
37: *
38: * Merged '64-bit safe' changes from DEC alpha port.
39: * [1995/11/21 18:03:19 jfraser]
40: *
41: * Revision 1.3.17.5 1995/08/21 20:29:18 devrcs
42: * Move the include out of db_output_prompt
43: * [1995/07/20 19:15:52 travos]
44: *
45: * Revision 1.3.17.4 1995/02/23 21:43:30 alanl
46: * Merge with DIPC2_SHARED.
47: * [95/01/04 alanl]
48: *
49: * Revision 1.3.22.1 1994/11/04 09:52:55 dwm
50: * mk6 CR668 - 1.3b26 merge
51: * * Revision 1.3.4.6 1994/05/06 18:39:31 tmt
52: * Merged osc1.3dec/shared with osc1.3b19
53: * Merge Alpha changes into osc1.312b source code.
54: * removed db_radix declaration.
55: * * End1.3merge
56: * [1994/11/04 08:49:42 dwm]
57: *
58: * Revision 1.3.17.2 1994/09/23 01:20:36 ezf
59: * change marker to not FREE
60: * [1994/09/22 21:10:32 ezf]
61: *
62: * Revision 1.3.17.1 1994/06/11 21:11:56 bolinger
63: * Merge up to NMK17.2.
64: * [1994/06/11 20:02:01 bolinger]
65: *
66: * Revision 1.3.19.3 1994/12/06 19:42:52 alanl
67: * Change _node_self ref to KKT_NODE_SELF().
68: * [94/12/05 rwd]
69: *
70: * Revision 1.3.19.2 1994/09/01 12:48:39 alanl
71: * Remove dead NORMA_IPC conditional.
72: * [94/08/29 alanl]
73: *
74: * Revision 1.3.19.1 1994/08/04 01:42:27 mmp
75: * Added DIPC support for debugger prompt.
76: * [1994/08/03 13:37:21 mmp]
77: *
78: * Revision 1.3.15.1 1994/02/08 10:58:09 bernadat
79: * Added db_output_prompt().
80: * [93/08/12 paire]
81: *
82: * Fixed db_end_line() for generating a pseudo end of line.
83: * [93/09/29 paire]
84: *
85: * Added db_reset_more() to restart more function.
86: * Added db_last_gen_return variable to determine if a '\n' has to be
87: * output (no if precedeed by a generated '\n').
88: * Added db_auto_wrap variable to define if the terminal automaticallly
89: * wraps up to the beginning of next line when the last character of the
90: * current line is output.
91: * [93/08/12 paire]
92: *
93: * Fixed db_advance_output_position() to go to the last character of
94: * each line (the last one generated a buggy '\n').
95: * Added db_reserve_output_position() to force a new_line if there is not
96: * enough place before end of line.
97: * [93/08/11 paire]
98: * [94/02/07 bernadat]
99: *
100: * Revision 1.3.4.4 1993/08/11 20:38:03 elliston
101: * Add ANSI Prototypes. CR #9523.
102: * [1993/08/11 03:33:38 elliston]
103: *
104: * Revision 1.3.4.3 1993/07/27 18:27:50 elliston
105: * Add ANSI prototypes. CR #9523.
106: * [1993/07/27 18:12:31 elliston]
107: *
108: * Revision 1.3.4.2 1993/06/09 02:20:24 gm
109: * CR9176 - ANSI C violations: trailing tokens on CPP
110: * directives, extra semicolons after decl_ ..., asm keywords
111: * [1993/06/07 18:57:18 jeffc]
112: *
113: * Added to OSF/1 R1.3 from NMK15.0.
114: * [1993/06/02 20:56:45 jeffc]
115: *
116: * Revision 1.3 1993/04/19 16:02:33 devrcs
117: * Added forward declaration for db_printf.
118: * [93/04/05 bernadat]
119: *
120: * Changes from mk78:
121: * Added void type to functions that needed it.
122: * [92/05/16 jfriedl]
123: * [93/02/02 bruel]
124: *
125: * Fixed tabs management for long lines. [[email protected]]
126: * [92/12/03 bernadat]
127: *
128: * Revision 1.2 1992/11/25 01:04:34 robert
129: * integrate changes below for norma_14
130: *
131: * Philippe Bernadat (bernadat) at gr.osf.org
132: * Moved iprintf to here, result was horible for MPs (cpu number in
133: * front of each iprintf.)
134: * [1992/11/13 19:21:47 robert]
135: *
136: * Revision 1.1 1992/09/30 02:01:14 robert
137: * Initial revision
138: *
139: * $EndLog$
140: */
141: /* CMU_HIST */
142: /*
143: * Revision 2.6 91/10/09 16:01:26 af
144: * Revision 2.5.2.1 91/10/05 13:06:46 jeffreyh
145: * Added "more" like function.
146: * [91/08/29 tak]
147: *
148: * Revision 2.5.2.1 91/10/05 13:06:46 jeffreyh
149: * Added "more" like function.
150: * [91/08/29 tak]
151: *
152: * Revision 2.5 91/07/09 23:15:54 danner
153: * Include machine/db_machdep.c.
154: * When db_printf is invoked, call db_printing on luna. This is used
155: * to trigger a screen clear. Under luna88k conditional.
156: * [91/07/08 danner]
157: *
158: * Revision 2.4 91/05/14 15:34:51 mrt
159: * Correcting copyright
160: *
161: * Revision 2.3 91/02/05 17:06:45 mrt
162: * Changed to new Mach copyright
163: * [91/01/31 16:18:41 mrt]
164: *
165: * Revision 2.2 90/08/27 21:51:25 dbg
166: * Put extra features of db_doprnt in _doprnt.
167: * [90/08/20 dbg]
168: * Reduce lint.
169: * [90/08/07 dbg]
170: * Created.
171: * [90/07/25 dbg]
172: *
173: */
174: /* CMU_ENDHIST */
175: /*
176: * Mach Operating System
177: * Copyright (c) 1991,1990 Carnegie Mellon University
178: * All Rights Reserved.
179: *
180: * Permission to use, copy, modify and distribute this software and its
181: * documentation is hereby granted, provided that both the copyright
182: * notice and this permission notice appear in all copies of the
183: * software, derivative works or modified versions, and any portions
184: * thereof, and that both notices appear in supporting documentation.
185: *
186: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
187: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
188: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
189: *
190: * Carnegie Mellon requests users of this software to return to
191: *
192: * Software Distribution Coordinator or [email protected]
193: * School of Computer Science
194: * Carnegie Mellon University
195: * Pittsburgh PA 15213-3890
196: *
197: * any improvements or extensions that they make and grant Carnegie Mellon
198: * the rights to redistribute these changes.
199: */
200: /*
201: */
202: /*
203: * Author: David B. Golub, Carnegie Mellon University
204: * Date: 7/90
205: */
206:
207: /*
208: * Printf and character output for debugger.
209: */
210:
211: #include <dipc.h>
212:
213: #include <mach/boolean.h>
214: #include <kern/misc_protos.h>
215: #include <stdarg.h>
216: #include <machine/db_machdep.h>
217: #include <ddb/db_command.h>
218: #include <ddb/db_lex.h>
219: #include <ddb/db_input.h>
220: #include <ddb/db_output.h>
221: #include <ddb/db_task_thread.h>
222:
223: /*
224: * Character output - tracks position in line.
225: * To do this correctly, we should know how wide
226: * the output device is - then we could zero
227: * the line position when the output device wraps
228: * around to the start of the next line.
229: *
230: * Instead, we count the number of spaces printed
231: * since the last printing character so that we
232: * don't print trailing spaces. This avoids most
233: * of the wraparounds.
234: */
235:
236: #ifndef DB_MAX_LINE
237: #define DB_MAX_LINE 24 /* maximum line */
238: #define DB_MAX_WIDTH 80 /* maximum width */
239: #endif /* DB_MAX_LINE */
240:
241: #define DB_MIN_MAX_WIDTH 20 /* minimum max width */
242: #define DB_MIN_MAX_LINE 3 /* minimum max line */
243: #define CTRL(c) ((c) & 0xff)
244:
245: int db_output_position = 0; /* output column */
246: int db_output_line = 0; /* output line number */
247: int db_last_non_space = 0; /* last non-space character */
248: int db_last_gen_return = 0; /* last character generated return */
249: int db_auto_wrap = 1; /* auto wrap at end of line ? */
250: int db_tab_stop_width = 8; /* how wide are tab stops? */
251: #define NEXT_TAB(i) \
252: ((((i) + db_tab_stop_width) / db_tab_stop_width) * db_tab_stop_width)
253: int db_max_line = DB_MAX_LINE; /* output max lines */
254: int db_max_width = DB_MAX_WIDTH; /* output line width */
255:
256:
257: /* Prototypes for functions local to this file. XXX -- should be static!
258: */
259: static void db_more(void);
260: void db_advance_output_position(int new_output_position,
261: int blank);
262:
263:
264: /*
265: * Force pending whitespace.
266: */
267: void
268: db_force_whitespace(void)
269: {
270: register int last_print, next_tab;
271:
272: last_print = db_last_non_space;
273: while (last_print < db_output_position) {
274: next_tab = NEXT_TAB(last_print);
275: if (next_tab <= db_output_position) {
276: cnputc('\t');
277: last_print = next_tab;
278: }
279: else {
280: cnputc(' ');
281: last_print++;
282: }
283: }
284: db_last_non_space = db_output_position;
285: }
286:
287: void
288: db_reset_more()
289: {
290: db_output_line = 0;
291: }
292:
293: static void
294: db_more(void)
295: {
296: register char *p;
297: boolean_t quit_output = FALSE;
298:
299: #if defined(__alpha)
300: extern boolean_t kdebug_mode;
301: if (kdebug_mode) return;
302: #endif /* defined(__alpha) */
303: for (p = "--db_more--"; *p; p++)
304: cnputc(*p);
305: switch(cngetc()) {
306: case ' ':
307: db_output_line = 0;
308: break;
309: case 'q':
310: case CTRL('c'):
311: db_output_line = 0;
312: quit_output = TRUE;
313: break;
314: default:
315: db_output_line--;
316: break;
317: }
318: p = "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b";
319: while (*p)
320: cnputc(*p++);
321: if (quit_output) {
322: db_error((char *) 0);
323: /* NOTREACHED */
324: }
325: }
326:
327: void
328: db_advance_output_position(int new_output_position,
329: int blank)
330: {
331: if (db_max_width >= DB_MIN_MAX_WIDTH
332: && new_output_position >= db_max_width) {
333: /* auto new line */
334: if (!db_auto_wrap || blank)
335: cnputc('\n');
336: db_output_position = 0;
337: db_last_non_space = 0;
338: db_last_gen_return = 1;
339: db_output_line++;
340: } else {
341: db_output_position = new_output_position;
342: }
343: }
344:
345: boolean_t
346: db_reserve_output_position(int increment)
347: {
348: if (db_max_width >= DB_MIN_MAX_WIDTH
349: && db_output_position + increment >= db_max_width) {
350: /* auto new line */
351: if (!db_auto_wrap || db_last_non_space != db_output_position)
352: cnputc('\n');
353: db_output_position = 0;
354: db_last_non_space = 0;
355: db_last_gen_return = 1;
356: db_output_line++;
357: return TRUE;
358: }
359: return FALSE;
360: }
361:
362: /*
363: * Output character. Buffer whitespace.
364: */
365: void
366: db_putchar(char c)
367: {
368: if (db_max_line >= DB_MIN_MAX_LINE && db_output_line >= db_max_line-1)
369: db_more();
370: if (c > ' ' && c <= '~') {
371: /*
372: * Printing character.
373: * If we have spaces to print, print them first.
374: * Use tabs if possible.
375: */
376: db_force_whitespace();
377: cnputc(c);
378: db_last_gen_return = 0;
379: db_advance_output_position(db_output_position+1, 0);
380: db_last_non_space = db_output_position;
381: }
382: else if (c == '\n') {
383: /* Return */
384: if (db_last_gen_return) {
385: db_last_gen_return = 0;
386: } else {
387: cnputc(c);
388: db_output_position = 0;
389: db_last_non_space = 0;
390: db_output_line++;
391: db_check_interrupt();
392: }
393: }
394: else if (c == '\t') {
395: /* assume tabs every 8 positions */
396: db_advance_output_position(NEXT_TAB(db_output_position), 1);
397: }
398: else if (c == ' ') {
399: /* space */
400: db_advance_output_position(db_output_position+1, 1);
401: }
402: else if (c == '\007') {
403: /* bell */
404: cnputc(c);
405: }
406: /* other characters are assumed non-printing */
407: }
408:
409: /*
410: * Return output position
411: */
412: int
413: db_print_position(void)
414: {
415: return (db_output_position);
416: }
417:
418: /*
419: * End line if too long.
420: */
421: void
422: db_end_line(void)
423: {
424: if (db_output_position >= db_max_width-1) {
425: /* auto new line */
426: if (!db_auto_wrap)
427: cnputc('\n');
428: db_output_position = 0;
429: db_last_non_space = 0;
430: db_last_gen_return = 1;
431: db_output_line++;
432: }
433: }
434:
435: /*
436: * Printing
437: */
438:
439: void
440: db_printf(char *fmt, ...)
441: {
442: va_list listp;
443:
444: #ifdef luna88k
445: db_printing();
446: #endif
447: va_start(listp, fmt);
448: _doprnt(fmt, &listp, db_putchar, db_radix);
449: va_end(listp);
450: }
451:
452: /* alternate name */
453:
454: void
455: kdbprintf(char *fmt, ...)
456: {
457: va_list listp;
458:
459: va_start(listp, fmt);
460: _doprnt(fmt, &listp, db_putchar, db_radix);
461: va_end(listp);
462: }
463:
464: int db_indent = 0;
465:
466: /*
467: * Printing (to console) with indentation.
468: */
469: void
470: iprintf(char *fmt, ...)
471: {
472: va_list listp;
473: register int i;
474:
475: for (i = db_indent; i > 0; ){
476: if (i >= 8) {
477: kdbprintf("\t");
478: i -= 8;
479: }
480: else {
481: kdbprintf(" ");
482: i--;
483: }
484: }
485:
486: va_start(listp, fmt);
487: _doprnt(fmt, &listp, db_putchar, db_radix);
488: va_end(listp);
489: }
490:
491: #if DIPC
492: #include <mach/kkt_request.h>
493: #endif /* DIPC */
494:
495: void
496: db_output_prompt(void)
497: {
498: db_printf("db%s", (db_default_act) ? "t": "");
499: #if DIPC
500: db_printf("%d", KKT_NODE_SELF());
501: #endif /* DIPC */
502: #if NCPUS > 1
503: db_printf("{%d}", cpu_number());
504: #endif
505: db_printf("> ");
506: }
507:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.