|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)format.c 4.5 4/24/88"; ! 3: #endif ! 4: /* ! 5: * ! 6: * UNIX debugger ! 7: * ! 8: */ ! 9: ! 10: #include "defs.h" ! 11: ! 12: MSG BADMOD; ! 13: MSG NOFORK; ! 14: MSG ADWRAP; ! 15: ! 16: INT mkfault; ! 17: CHAR *lp; ! 18: L_INT maxoff; ! 19: ADDR sigint; ! 20: ADDR sigqit; ! 21: STRING errflg; ! 22: CHAR lastc,peekc; ! 23: L_INT dot; ! 24: INT dotinc; ! 25: L_INT expv; ! 26: L_INT var[]; ! 27: ! 28: ! 29: STRING fphack; ! 30: rdfp() ! 31: { ! 32: return(lastc= *fphack++); ! 33: } ! 34: ! 35: scanform(icount,ifp,itype,ptype) ! 36: L_INT icount; ! 37: STRING ifp; ! 38: { ! 39: STRING fp; ! 40: CHAR modifier; ! 41: INT fcount, init=1; ! 42: L_INT savdot; ! 43: BOOL exact; ! 44: BOOL doit = 1; ! 45: ! 46: WHILE icount ! 47: DO fp=ifp; ! 48: savdot=dot; init=0; ! 49: ! 50: IF init==0 ANDF (exact=(findsym(dot,ptype)==0)) ANDF maxoff ! 51: THEN printf("\n%s:%16t",cursym->n_un.n_name); ! 52: FI ! 53: ! 54: /*now loop over format*/ ! 55: WHILE *fp ANDF errflg==0 ! 56: DO IF digit(modifier = *fp) ! 57: THEN fcount = 0; ! 58: WHILE digit(modifier = *fp++) ! 59: DO fcount *= 10; ! 60: fcount += modifier-'0'; ! 61: OD ! 62: fp--; ! 63: IF fcount==0 THEN fcount = 1; FI ! 64: ELSE fcount = 1; ! 65: FI ! 66: ! 67: IF *fp==0 THEN break; FI ! 68: fp=exform(fcount,fp,itype,ptype); ! 69: OD ! 70: dotinc=dot-savdot; ! 71: dot=savdot; ! 72: ! 73: IF errflg ! 74: THEN IF icount<0 ! 75: THEN errflg=0; break; ! 76: ELSE error(errflg); ! 77: FI ! 78: FI ! 79: IF --icount ! 80: THEN dot=inkdot(dotinc); ! 81: FI ! 82: IF mkfault THEN error(0); FI ! 83: OD ! 84: } ! 85: ! 86: STRING ! 87: exform(fcount,ifp,itype,ptype) ! 88: INT fcount; ! 89: STRING ifp; ! 90: { ! 91: /* execute single format item `fcount' times ! 92: * sets `dotinc' and moves `dot' ! 93: * returns address of next format item ! 94: */ ! 95: POS w; ! 96: L_INT savdot, wx; ! 97: STRING fp; ! 98: CHAR c, modifier, longpr; ! 99: L_REAL fw; ! 100: struct bad_programming { ! 101: L_INT sa; ! 102: INT sb,sc; ! 103: }; ! 104: ! 105: WHILE fcount>0 ! 106: DO fp = ifp; c = *fp; ! 107: longpr=(c>='A')&(c<='Z')|(c=='f')|(c=='4')|(c=='p'); ! 108: IF itype==NSP ORF *fp=='a' ! 109: THEN wx=dot; w=dot; ! 110: ELSE w=get(dot,itype); ! 111: IF longpr ! 112: THEN wx=itol(get(inkdot(2),itype),w); ! 113: ELSE wx=w; ! 114: FI ! 115: FI ! 116: IF c=='F' ! 117: /* ! 118: * This used to be the following, but real C compilers won't ! 119: * let you use a double as a struct! ! 120: * ! 121: * THEN fw.sb=get(inkdot(4),itype); ! 122: * fw.sc=get(inkdot(6),itype); ! 123: */ ! 124: THEN (*(struct bad_programming *)&fw).sb=get(inkdot(4),itype); ! 125: (*(struct bad_programming *)&fw).sc=get(inkdot(6),itype); ! 126: FI ! 127: IF errflg THEN return(fp); FI ! 128: IF mkfault THEN error(0); FI ! 129: var[0]=wx; ! 130: modifier = *fp++; ! 131: dotinc=(longpr?4:2);; ! 132: ! 133: IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI ! 134: ! 135: switch(modifier) { ! 136: ! 137: case SP: case TB: ! 138: break; ! 139: ! 140: case 't': case 'T': ! 141: printf("%T",fcount); return(fp); ! 142: ! 143: case 'r': case 'R': ! 144: printf("%M",fcount); return(fp); ! 145: ! 146: case 'a': ! 147: psymoff(dot,ptype,":%16t"); dotinc=0; break; ! 148: ! 149: case 'p': ! 150: psymoff(var[0],ptype,"%16t"); break; ! 151: ! 152: case 'u': ! 153: printf("%-8u",w); break; ! 154: ! 155: case 'U': ! 156: printf("%-16U",wx); break; ! 157: ! 158: case 'c': case 'C': ! 159: IF modifier=='C' ! 160: THEN printesc(w&LOBYTE); ! 161: ELSE printc(w&LOBYTE); ! 162: FI ! 163: dotinc=1; break; ! 164: ! 165: case 'b': case 'B': ! 166: printf("%-8o", w&LOBYTE); dotinc=1; break; ! 167: ! 168: case '1': ! 169: printf("%-8r", w&LOBYTE); dotinc=1; break; ! 170: ! 171: case '2': ! 172: case 'w': ! 173: printf("%-8r", w); break; ! 174: ! 175: case '4': ! 176: case 'W': ! 177: printf("%-16R", wx); break; ! 178: ! 179: case 's': case 'S': ! 180: savdot=dot; dotinc=1; ! 181: WHILE (c=get(dot,itype)&LOBYTE) ANDF errflg==0 ! 182: DO dot=inkdot(1); ! 183: IF modifier == 'S' ! 184: THEN printesc(c); ! 185: ELSE printc(c); ! 186: FI ! 187: endline(); ! 188: OD ! 189: dotinc=dot-savdot+1; dot=savdot; break; ! 190: ! 191: case 'x': ! 192: printf("%-8x",w); break; ! 193: ! 194: case 'X': ! 195: printf("%-16X", wx); break; ! 196: ! 197: case 'Y': ! 198: printf("%-24Y", wx); break; ! 199: ! 200: case 'q': ! 201: printf("%-8q", w); break; ! 202: ! 203: case 'Q': ! 204: printf("%-16Q", wx); break; ! 205: ! 206: case 'o': ! 207: printf("%-8o", w); break; ! 208: ! 209: case 'O': ! 210: printf("%-16O", wx); break; ! 211: ! 212: case 'i': ! 213: printins(0,itype,w); printc(EOR); break; ! 214: ! 215: case 'd': ! 216: printf("%-8d", w); break; ! 217: ! 218: case 'D': ! 219: printf("%-16D", wx); break; ! 220: ! 221: case 'f': ! 222: fw = 0; ! 223: /* ! 224: * This used to be the following, but real compilers ! 225: * won't let you use a double as a struct! ! 226: * ! 227: * fw.sa = wx; ! 228: */ ! 229: (*(struct bad_programming *)&fw).sa = wx; ! 230: IF (wx & ~0xFFFF00FF) == 0x8000 ! 231: THEN printf("(reserved oprnd)"); ! 232: ELSE printf("%-16.9f", fw); ! 233: FI ! 234: dotinc=4; break; ! 235: ! 236: case 'F': ! 237: (*(struct bad_programming *)&fw).sa = wx; ! 238: IF (wx & ~0xFFFF00FF) == 0x8000 ! 239: THEN printf("%-32s", "(reserved oprnd)"); ! 240: ELSE printf("%-32.18F", fw); ! 241: FI ! 242: dotinc=8; break; ! 243: ! 244: case 'n': case 'N': ! 245: printc('\n'); dotinc=0; break; ! 246: ! 247: case '"': ! 248: dotinc=0; ! 249: WHILE *fp != '"' ANDF *fp ! 250: DO printc(*fp++); OD ! 251: IF *fp THEN fp++; FI ! 252: break; ! 253: ! 254: case '^': ! 255: dot=inkdot(-dotinc*fcount); return(fp); ! 256: ! 257: case '+': ! 258: dot=inkdot(fcount); return(fp); ! 259: ! 260: case '-': ! 261: dot=inkdot(-fcount); return(fp); ! 262: ! 263: default: error(BADMOD); ! 264: } ! 265: IF itype!=NSP ! 266: THEN dot=inkdot(dotinc); ! 267: FI ! 268: fcount--; endline(); ! 269: OD ! 270: ! 271: return(fp); ! 272: } ! 273: ! 274: shell() ! 275: { ! 276: #ifndef EDDT ! 277: INT rc, status, unixpid; ! 278: STRING argp = lp; ! 279: STRING getenv(), shell = getenv("SHELL"); ! 280: #ifdef VFORK ! 281: char oldstlp; ! 282: #endif ! 283: ! 284: if (shell == 0) ! 285: shell = "/bin/sh"; ! 286: WHILE lastc!=EOR DO rdc(); OD ! 287: #ifndef VFORK ! 288: IF (unixpid=fork())==0 ! 289: #else ! 290: oldstlp = *lp; ! 291: IF (unixpid=vfork())==0 ! 292: #endif ! 293: THEN signal(SIGINT,sigint); signal(SIGQUIT,sigqit); ! 294: *lp=0; execl(shell, "sh", "-c", argp, 0); ! 295: _exit(16); ! 296: #ifndef VFORK ! 297: ELIF unixpid == -1 ! 298: #else ! 299: ELIF *lp = oldstlp, unixpid == -1 ! 300: #endif ! 301: THEN error(NOFORK); ! 302: ELSE signal(SIGINT,1); ! 303: WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE ! 304: signal(SIGINT,sigint); ! 305: prints("!"); lp--; ! 306: FI ! 307: #endif ! 308: } ! 309: ! 310: ! 311: printesc(c) ! 312: { ! 313: c &= STRIP; ! 314: IF c==0177 THEN printf("^?"); ! 315: ELIF c<SP ! 316: THEN printf("^%c", c + '@'); ! 317: ELSE printc(c); ! 318: FI ! 319: } ! 320: ! 321: L_INT inkdot(incr) ! 322: { ! 323: L_INT newdot; ! 324: ! 325: newdot=dot+incr; ! 326: IF (dot NEQ newdot) >> 24 THEN error(ADWRAP); FI ! 327: return(newdot); ! 328: } ! 329: ! 330: digit(c) ! 331: { ! 332: return c >= '0' && c <= '9'; ! 333: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.