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