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