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