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