xref: /original-bsd/old/adb/common_source/print.c (revision c0f053f7)
1 #ifndef lint
2 static char sccsid[] = "@(#)print.c	5.3 (Berkeley) 04/09/89";
3 #endif
4 
5 /*
6  * adb - printing routines
7  */
8 
9 #include "defs.h"
10 #include <sys/file.h>
11 
12 extern char LONGFIL[];
13 extern char NOTOPEN[];
14 extern char BADMOD[];
15 
16 int	infile;			/* XXX */
17 int	outfile;		/* XXX */
18 
19 off_t	lseek();
20 
21 /* general printing routines ($) */
22 
23 printtrace(modif)
24 	int modif;
25 {
26 	int stack, i;
27 
28 	switch (modif) {
29 
30 	case '<':
31 		if (ecount == 0) {
32 			while (readchar() != '\n')
33 				/* void */;
34 			unreadc();
35 			break;
36 		}
37 		if (rdc() == '<')
38 			stack = 1;
39 		else {
40 			stack = 0;
41 			unreadc();
42 		}
43 		/* FALLTHROUGH */
44 
45 	case '>': {
46 		char file[64];
47 		char Ifile[128];
48 		extern char *Ipath;
49 		int index;
50 		char *strcpy(), *strcat();
51 
52 		index = 0;
53 		if (rdc() != '\n') {
54 			do {
55 				file[index++] = lastc;
56 				if (index >= 63)
57 					error(LONGFIL);
58 			} while (readchar() != '\n');
59 			file[index] = 0;
60 			if (modif == '<') {
61 				if (Ipath) {
62 					(void) strcpy(Ifile, Ipath);
63 					(void) strcat(Ifile, "/");
64 					(void) strcat(Ifile, file);
65 				}
66 				if (strcmp(file, "-") != 0) {
67 					iclose(stack, 0);
68 					infile = open(file, 0);
69 					if (infile < 0)
70 						infile = open(Ifile, 0);
71 				} else
72 					(void) lseek(infile, 0L, 0);
73 				if (infile < 0) {
74 					infile = 0;
75 					error(NOTOPEN);
76 					/* NOTREACHED */
77 				}
78 				var[9] = ecount;
79 			} else {
80 				oclose();
81 				outfile = open(file, O_CREAT|O_WRONLY, 0644);
82 				(void) lseek(outfile, 0L, 2);
83 			}
84 		} else {
85 			if (modif == '<')
86 				iclose(-1, 0);
87 			else
88 				oclose();
89 		}
90 		unreadc();
91 		break;
92 	}
93 
94 	case 'p':
95 		if (!kernel)
96 			prints("not debugging kernel\n");
97 		else {
98 			if (gavedot)
99 				setpcb(dot);
100 			getpcb();
101 		}
102 		break;
103 
104 	case 'd':
105 		if (gavedot) {
106 			i = edot;
107 			if (!(i >= 2 && i <= 16 || i <= -2 && i >= -16)) {
108 				adbprintf("illegal radix %d base ten",
109 				    (expr_t)i);
110 				break;
111 			}
112 			radix = i;
113 		}
114 		adbprintf("radix=%D base ten", (expr_t)radix);
115 		break;
116 
117 	case 'q':
118 	case 'Q':
119 	case '%':
120 		done(0);
121 
122 	case 'w':
123 	case 'W':
124 		maxcol = gavedot ? edot : MAXCOL;
125 		break;
126 
127 	case 's':
128 	case 'S':
129 		maxoff = gavedot ? edot : MAXOFF;
130 		break;
131 
132 	case 'v':
133 	case 'V':
134 		prints("variables\n");
135 		for (i = 0; i <= 35; i++)
136 			if (var[i])
137 				adbprintf("%c = %R\n",
138 				    i > 9 ? i + 'a' - 10 : i + '0',
139 				    var[i]);
140 		break;
141 
142 	case 'm':
143 	case 'M':
144 		printmap("? map", &txtmap);
145 		printmap("/ map", &datmap);
146 		break;
147 
148 	case 0:
149 	case '?':
150 		if (pid)
151 			adbprintf("pcs id = %D\n", (expr_t)pid);
152 		else
153 			prints("no process\n");
154 		sigprint();
155 		flushbuf();
156 		/* FALLTHROUGH */
157 
158 	case 'r':
159 	case 'R':
160 		printregs();
161 		return;
162 
163 	case 'c':
164 	case 'C':
165 		printstack(modif == 'C', gavecount ? (int)ecount : -1);
166 		break;
167 
168 	case 'e':
169 	case 'E':
170 		/* print externals */
171 		printsyms(modif == 'E');
172 		break;
173 
174 
175 	case 'b':
176 	case 'B':
177 		/* print breakpoints */
178 		printbkpts();
179 		break;
180 
181 	default:
182 		error(BADMOD);
183 	}
184 }
185 
186 printmap(s, m)
187 	char *s;
188 	register struct map *m;
189 {
190 
191 	adbprintf("%s%12t`%s'\n", s, m->ufd < 0 ? "-" :
192 		m->ufd == corefile.fd ? corefile.name : symfile.name);
193 	adbprintf("b1 = %-16Re1 = %-16Rf1 = %-16R\n",
194 	    m->m1.b, m->m1.e, m->m1.f);
195 	adbprintf("b2 = %-16Re2 = %-16Rf2 = %-16R\n",
196 	    m->m2.b, m->m2.e, m->m2.f);
197 }
198 
199 /*
200  * Print global data and bss symbols, and if texttoo, text symbols too.
201  */
202 printsyms(texttoo)
203 	int texttoo;
204 {
205 	register struct nlist *sp;
206 
207 	if (symtab == NULL)
208 		return;
209 	for (sp = symtab; sp < esymtab; sp++) {
210 		if ((sp->n_type & N_EXT) == 0)
211 			continue;
212 		switch (sp->n_type) {
213 
214 		case N_TEXT|N_EXT:
215 			if (texttoo)
216 				adbprintf("%s:%12t@ %R\n",
217 					  sp->n_un.n_name,
218 					  (expr_t)sp->n_value);
219 			break;
220 
221 		case N_DATA|N_EXT:
222 		case N_BSS|N_EXT:
223 			adbprintf("%s:%12t", sp->n_un.n_name);
224 			prfrom((addr_t)sp->n_value, '\n');
225 			break;
226 		}
227 	}
228 }
229 
230 /*
231  * Print the value stored in some location, or `?' if it cannot be read,
232  * then the character c (usually '\n' or ',').
233  */
234 prfrom(a, c)
235 	addr_t a;
236 	int c;
237 {
238 	expr_t v;
239 
240 	errflag = NULL;
241 	if (adbread(SP_DATA, a, &v, sizeof(v)) == sizeof(v) && errflag == NULL)
242 		adbprintf("%R\%c", v, c);
243 	else {
244 		errflag = NULL;
245 		adbprintf("?%c", c);
246 	}
247 }
248 
249 #ifdef busted
250 /*
251  * Print a local symbol (called from printstack()).
252  * Local symbols end with ':', so cannot use %s format.
253  */
254 printlsym(cp)
255 	register char *cp;
256 {
257 
258 	while (*cp && *cp != ':')
259 		printc(*cp++);
260 }
261 #endif
262 
263 printregs()
264 {
265 	register struct reglist *p;
266 	expr_t v;
267 	extern struct reglist reglist[];
268 
269 	for (p = reglist; p->r_name != NULL; p++) {
270 		v = getreg(p);
271 		adbprintf("%s%6t%R\%16t", p->r_name, v);
272 		valpr(v, ispace_reg(p) ? SP_INSTR : SP_DATA);
273 		printc('\n');
274 	}
275 	printpc();
276 }
277 
278 printpc()
279 {
280 
281 	dot = getpc();
282 	pdot();
283 	printins(SP_INSTR);
284 	printc('\n');
285 }
286