1 # 2 /* 3 * 4 * UNIX debugger 5 * 6 */ 7 8 #include "defs.h" 9 static char sccsid[] = "@(#)output.c 4.2 04/01/82"; 10 #include <stdio.h> 11 12 13 INT mkfault; 14 INT infile; 15 INT outfile = 1; 16 L_INT maxpos; 17 L_INT maxoff; 18 INT radix = 16; 19 20 CHAR printbuf[MAXLIN]; 21 CHAR *printptr = printbuf; 22 CHAR *digitptr; 23 MSG TOODEEP; 24 25 26 eqstr(s1, s2) 27 REG STRING s1, s2; 28 { 29 REG STRING es1; 30 WHILE *s1++ == *s2 31 DO IF *s2++ == 0 32 THEN return(1); 33 FI 34 OD 35 return(0); 36 } 37 38 length(s) 39 REG STRING s; 40 { 41 INT n = 0; 42 WHILE *s++ DO n++; OD 43 return(n); 44 } 45 46 printc(c) 47 CHAR c; 48 { 49 CHAR d; 50 STRING q; 51 INT posn, tabs, p; 52 53 IF mkfault 54 THEN return; 55 ELIF (*printptr=c)==EOR 56 THEN tabs=0; posn=0; q=printbuf; 57 FOR p=0; p<printptr-printbuf; p++ 58 DO d=printbuf[p]; 59 IF (p&7)==0 ANDF posn 60 THEN tabs++; posn=0; 61 FI 62 IF d==SP 63 THEN posn++; 64 ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD 65 WHILE posn>0 DO *q++=SP; posn--; OD 66 *q++=d; 67 FI 68 OD 69 *q++=EOR; 70 #ifdef EDDT 71 printptr=printbuf; do putchar(*printptr++); while (printptr<q); 72 #else 73 write(outfile,printbuf,q-printbuf); 74 #endif 75 printptr=printbuf; 76 ELIF c==TB 77 THEN *printptr++=SP; 78 WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD 79 ELIF c 80 THEN printptr++; 81 FI 82 IF printptr >= &printbuf[MAXLIN-9] THEN 83 write(outfile, printbuf, printptr - printbuf); 84 printptr = printbuf; 85 FI 86 } 87 88 charpos() 89 { return(printptr-printbuf); 90 } 91 92 flushbuf() 93 { IF printptr!=printbuf 94 THEN printc(EOR); 95 FI 96 } 97 98 printf(fmat,a1) 99 STRING fmat; 100 STRING *a1; 101 { 102 STRING fptr, s; 103 INT *vptr; 104 L_INT *dptr; 105 L_REAL *rptr; 106 INT width, prec; 107 CHAR c, adj; 108 INT x, decpt, n; 109 L_INT lx; 110 CHAR digits[64]; 111 112 fptr = fmat; dptr = vptr = &a1; 113 114 WHILE c = *fptr++ 115 DO IF c!='%' 116 THEN printc(c); 117 ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI 118 width=convert(&fptr); 119 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI 120 digitptr=digits; 121 #ifndef vax 122 dptr=rptr=vptr; lx = *dptr; x = *vptr++; 123 #else 124 rptr=dptr; x = shorten(lx = *dptr++); 125 #endif 126 s=0; 127 switch (c = *fptr++) { 128 129 case 'd': 130 case 'u': 131 printnum(x,c,10); break; 132 case 'o': 133 #ifndef vax 134 printoct(0,x,0); break; 135 #else 136 printoct(itol(0,x),0); break; 137 #endif 138 case 'q': 139 lx=x; printoct(lx,-1); break; 140 case 'x': 141 #ifndef vax 142 printdbl(0,x,c,16); break; 143 #else 144 printdbl(itol(0,x),c,16); break; 145 #endif 146 case 'r': 147 printdbl(lx=x,c,radix); break; 148 case 'R': 149 printdbl(lx,c,radix); vptr++; break; 150 case 'Y': 151 printdate(lx); vptr++; break; 152 case 'D': 153 case 'U': 154 printdbl(lx,c,10); vptr++; break; 155 case 'O': 156 printoct(lx,0); vptr++; break; 157 case 'Q': 158 printoct(lx,-1); vptr++; break; 159 case 'X': 160 printdbl(lx,'x',16); vptr++; break; 161 case 'c': 162 printc(x); break; 163 case 's': 164 #ifndef vax 165 s=x; break; 166 #else 167 s=lx; break; 168 #endif 169 #ifndef EDDT 170 case 'f': 171 case 'F': 172 #ifdef vax 173 dptr++; 174 sprintf(s=digits,"%+.16e",*rptr,*(rptr+4)); prec= -1; break; 175 #else 176 vptr += 7; 177 s=ecvt(*rptr, prec, &decpt, &n); 178 *digitptr++=(n?'-':'+'); 179 *digitptr++ = (decpt<=0 ? '0' : *s++); 180 IF decpt>0 THEN decpt--; FI 181 *digitptr++ = '.'; 182 WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD 183 WHILE *--digitptr=='0' DONE 184 digitptr += (digitptr-digits>=3 ? 1 : 2); 185 IF decpt 186 THEN *digitptr++ = 'e'; printnum(decpt,'d',10); 187 FI 188 s=0; prec = -1; break; 189 #endif 190 #endif 191 case 'm': 192 vptr--; break; 193 case 'M': 194 width=x; break; 195 case 'T': 196 case 't': 197 IF c=='T' 198 THEN width=x; 199 #ifndef vax 200 ELSE vptr--; 201 #else 202 ELSE dptr--; 203 #endif 204 FI 205 IF width 206 THEN width -= charpos()%width; 207 FI 208 break; 209 default: 210 #ifndef vax 211 printc(c); vptr--; 212 #else 213 printc(c); dptr--; 214 #endif 215 } 216 217 IF s==0 218 THEN *digitptr=0; s=digits; 219 FI 220 n=length(s); 221 n=(prec<n ANDF prec>=0 ? prec : n); 222 width -= n; 223 IF adj=='r' 224 THEN WHILE width-- > 0 225 DO printc(SP); OD 226 FI 227 WHILE n-- DO printc(*s++); OD 228 WHILE width-- > 0 DO printc(SP); OD 229 digitptr=digits; 230 FI 231 OD 232 } 233 234 printdate(tvec) 235 L_INT tvec; 236 { 237 REG INT i; 238 REG STRING timeptr; 239 #ifndef EDDT 240 timeptr = ctime(&tvec); 241 #else 242 timeptr="????????????????????????"; 243 #endif 244 FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD 245 FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD 246 } /*printdate*/ 247 248 prints(s) 249 char *s; 250 { printf("%s",s); 251 } 252 253 newline() 254 { 255 printc(EOR); 256 } 257 258 convert(cp) 259 REG STRING *cp; 260 { 261 REG CHAR c; 262 INT n; 263 n=0; 264 WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD 265 (*cp)--; 266 return(n); 267 } 268 269 printnum(n,fmat,base) 270 REG INT n; 271 { 272 REG CHAR k; 273 REG INT *dptr; 274 INT digs[15]; 275 dptr=digs; 276 IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI 277 n &= 0xffff; 278 WHILE n 279 DO *dptr++ = ((POS)(n&0xffff))%base; 280 n=((POS)(n&0xffff))/base; 281 OD 282 IF dptr==digs THEN *dptr++=0; FI 283 WHILE dptr!=digs 284 DO k = *--dptr; 285 *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 286 OD 287 } 288 289 printoct(o,s) 290 L_INT o; 291 INT s; 292 { 293 INT i; 294 L_INT po = o; 295 CHAR digs[12]; 296 297 IF s 298 THEN IF po<0 299 THEN po = -po; *digitptr++='-'; 300 ELSE IF s>0 THEN *digitptr++='+'; FI 301 FI 302 FI 303 FOR i=0;i<=11;i++ 304 DO digs[i] = po&7; po >>= 3; OD 305 digs[10] &= 03; digs[11]=0; 306 FOR i=11;i>=0;i-- 307 DO IF digs[i] THEN break; FI OD 308 FOR i++;i>=0;i-- 309 DO *digitptr++=digs[i]+'0'; OD 310 } 311 312 #ifndef vax 313 printdbl(lx,ly,fmat,base) 314 INT lx, ly; char fmat; int base; 315 #else 316 printdbl(lxy,fmat,base) 317 L_INT lxy; char fmat; int base; 318 #endif 319 { int digs[20]; int *dptr; char k; 320 #ifndef MULD2 321 register char *cp1; 322 cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;} 323 sprintf(cp1,base==16 ? "%X" : "%D",lxy); 324 cp1=digs; while (*digitptr++= *cp1++); --digitptr; 325 #else 326 L_REAL f ,g; long q; 327 #ifdef vax 328 INT lx,ly; 329 ly=lxy; lx=(lxy>>16)&0xFFFF; 330 #endif 331 dptr=digs; 332 IF fmat=='D' ORF fmat=='r' 333 THEN f=itol(lx,ly); 334 IF f<0 THEN *digitptr++='-'; f = -f; FI 335 ELSE 336 IF lx==-1 337 THEN *digitptr++='-'; f=leng(-ly); 338 ELSE f=leng(lx); f *= itol(1,0); f += leng(ly); 339 FI 340 IF fmat=='x' THEN *digitptr++='#'; FI 341 FI 342 WHILE f 343 DO q=f/base; g=q; 344 *dptr++ = f-g*base; 345 f=q; 346 OD 347 IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI 348 WHILE dptr!=digs 349 DO k = *--dptr; 350 *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); 351 OD 352 #endif 353 } 354 355 #define MAXIFD 5 356 struct { 357 int fd; 358 int r9; 359 } istack[MAXIFD]; 360 int ifiledepth; 361 362 iclose(stack, err) 363 { 364 IF err 365 THEN IF infile 366 THEN close(infile); infile=0; 367 FI 368 WHILE --ifiledepth >= 0 369 DO IF istack[ifiledepth].fd 370 THEN close(istack[ifiledepth].fd); 371 FI 372 OD 373 ifiledepth = 0; 374 ELIF stack == 0 375 THEN IF infile 376 THEN close(infile); infile=0; 377 FI 378 ELIF stack > 0 379 THEN IF ifiledepth >= MAXIFD 380 THEN error(TOODEEP); 381 FI 382 istack[ifiledepth].fd = infile; 383 istack[ifiledepth].r9 = var[9]; 384 ifiledepth++; 385 infile = 0; 386 ELSE IF infile 387 THEN close(infile); infile=0; 388 FI 389 IF ifiledepth > 0 390 THEN infile = istack[--ifiledepth].fd; 391 var[9] = istack[ifiledepth].r9; 392 FI 393 FI 394 } 395 396 oclose() 397 { 398 IF outfile!=1 399 THEN flushbuf(); close(outfile); outfile=1; 400 FI 401 } 402 403 endline() 404 { 405 406 if (maxpos <= charpos()) 407 printf("\n"); 408 } 409