114469Ssam #ifndef lint 2*34078Sbostic static char sccsid[] = "@(#)format.c 4.5 04/24/88"; 314469Ssam #endif 43756Sroot /* 53756Sroot * 63756Sroot * UNIX debugger 73756Sroot * 83756Sroot */ 93756Sroot 103756Sroot #include "defs.h" 113756Sroot 123756Sroot MSG BADMOD; 133756Sroot MSG NOFORK; 143756Sroot MSG ADWRAP; 153756Sroot 163756Sroot INT mkfault; 173756Sroot CHAR *lp; 183756Sroot L_INT maxoff; 193756Sroot ADDR sigint; 203756Sroot ADDR sigqit; 213756Sroot STRING errflg; 223756Sroot CHAR lastc,peekc; 233756Sroot L_INT dot; 243756Sroot INT dotinc; 253756Sroot L_INT expv; 263756Sroot L_INT var[]; 273756Sroot 283756Sroot 293756Sroot STRING fphack; 303756Sroot rdfp() 313756Sroot { 323756Sroot return(lastc= *fphack++); 333756Sroot } 343756Sroot 353756Sroot scanform(icount,ifp,itype,ptype) 363756Sroot L_INT icount; 373756Sroot STRING ifp; 383756Sroot { 393756Sroot STRING fp; 403756Sroot CHAR modifier; 413756Sroot INT fcount, init=1; 423756Sroot L_INT savdot; 433756Sroot BOOL exact; 443756Sroot BOOL doit = 1; 453756Sroot 463756Sroot WHILE icount 473756Sroot DO fp=ifp; 483756Sroot savdot=dot; init=0; 493756Sroot 503756Sroot IF init==0 ANDF (exact=(findsym(dot,ptype)==0)) ANDF maxoff 513756Sroot THEN printf("\n%s:%16t",cursym->n_un.n_name); 523756Sroot FI 533756Sroot 543756Sroot /*now loop over format*/ 553756Sroot WHILE *fp ANDF errflg==0 563756Sroot DO IF digit(modifier = *fp) 573756Sroot THEN fcount = 0; 583756Sroot WHILE digit(modifier = *fp++) 593756Sroot DO fcount *= 10; 603756Sroot fcount += modifier-'0'; 613756Sroot OD 623756Sroot fp--; 6326430Smckusick IF fcount==0 THEN fcount = 1; FI 643756Sroot ELSE fcount = 1; 653756Sroot FI 663756Sroot 673756Sroot IF *fp==0 THEN break; FI 6831707Sbostic fp=exform(fcount,fp,itype,ptype); 693756Sroot OD 703756Sroot dotinc=dot-savdot; 713756Sroot dot=savdot; 723756Sroot 733756Sroot IF errflg 743756Sroot THEN IF icount<0 753756Sroot THEN errflg=0; break; 763756Sroot ELSE error(errflg); 773756Sroot FI 783756Sroot FI 793756Sroot IF --icount 803756Sroot THEN dot=inkdot(dotinc); 813756Sroot FI 823756Sroot IF mkfault THEN error(0); FI 833756Sroot OD 843756Sroot } 853756Sroot 863756Sroot STRING 873756Sroot exform(fcount,ifp,itype,ptype) 883756Sroot INT fcount; 893756Sroot STRING ifp; 903756Sroot { 913756Sroot /* execute single format item `fcount' times 923756Sroot * sets `dotinc' and moves `dot' 933756Sroot * returns address of next format item 943756Sroot */ 953756Sroot POS w; 963756Sroot L_INT savdot, wx; 973756Sroot STRING fp; 983756Sroot CHAR c, modifier, longpr; 993756Sroot L_REAL fw; 100*34078Sbostic struct bad_programming { 1013756Sroot L_INT sa; 1023756Sroot INT sb,sc; 1033756Sroot }; 1043756Sroot 1053756Sroot WHILE fcount>0 1063756Sroot DO fp = ifp; c = *fp; 1073756Sroot longpr=(c>='A')&(c<='Z')|(c=='f')|(c=='4')|(c=='p'); 1083756Sroot IF itype==NSP ORF *fp=='a' 1093756Sroot THEN wx=dot; w=dot; 1103756Sroot ELSE w=get(dot,itype); 1113756Sroot IF longpr 1123756Sroot THEN wx=itol(get(inkdot(2),itype),w); 1133756Sroot ELSE wx=w; 1143756Sroot FI 1153756Sroot FI 1163756Sroot IF c=='F' 117*34078Sbostic /* 118*34078Sbostic * This used to be the following, but real C compilers won't 119*34078Sbostic * let you use a double as a struct! 120*34078Sbostic * 121*34078Sbostic * THEN fw.sb=get(inkdot(4),itype); 122*34078Sbostic * fw.sc=get(inkdot(6),itype); 123*34078Sbostic */ 124*34078Sbostic THEN (*(struct bad_programming *)&fw).sb=get(inkdot(4),itype); 125*34078Sbostic (*(struct bad_programming *)&fw).sc=get(inkdot(6),itype); 1263756Sroot FI 1273756Sroot IF errflg THEN return(fp); FI 1283756Sroot IF mkfault THEN error(0); FI 1293756Sroot var[0]=wx; 1303756Sroot modifier = *fp++; 1313756Sroot dotinc=(longpr?4:2);; 1323756Sroot 1333756Sroot IF charpos()==0 ANDF modifier!='a' THEN printf("%16m"); FI 1343756Sroot 1353756Sroot switch(modifier) { 1363756Sroot 1373756Sroot case SP: case TB: 1383756Sroot break; 1393756Sroot 1403756Sroot case 't': case 'T': 1413756Sroot printf("%T",fcount); return(fp); 1423756Sroot 1433756Sroot case 'r': case 'R': 1443756Sroot printf("%M",fcount); return(fp); 1453756Sroot 1463756Sroot case 'a': 1473756Sroot psymoff(dot,ptype,":%16t"); dotinc=0; break; 1483756Sroot 1493756Sroot case 'p': 1503756Sroot psymoff(var[0],ptype,"%16t"); break; 1513756Sroot 1523756Sroot case 'u': 1533756Sroot printf("%-8u",w); break; 1543756Sroot 1553756Sroot case 'U': 1563756Sroot printf("%-16U",wx); break; 1573756Sroot 1583756Sroot case 'c': case 'C': 1593756Sroot IF modifier=='C' 1603756Sroot THEN printesc(w&LOBYTE); 1613756Sroot ELSE printc(w&LOBYTE); 1623756Sroot FI 1633756Sroot dotinc=1; break; 1643756Sroot 1653756Sroot case 'b': case 'B': 1663756Sroot printf("%-8o", w&LOBYTE); dotinc=1; break; 1673756Sroot 1683756Sroot case '1': 1693756Sroot printf("%-8r", w&LOBYTE); dotinc=1; break; 1703756Sroot 1713756Sroot case '2': 1723756Sroot case 'w': 1733756Sroot printf("%-8r", w); break; 1743756Sroot 1753756Sroot case '4': 1763756Sroot case 'W': 1773756Sroot printf("%-16R", wx); break; 1783756Sroot 1793756Sroot case 's': case 'S': 1803756Sroot savdot=dot; dotinc=1; 1813756Sroot WHILE (c=get(dot,itype)&LOBYTE) ANDF errflg==0 1823756Sroot DO dot=inkdot(1); 1833756Sroot IF modifier == 'S' 1843756Sroot THEN printesc(c); 1853756Sroot ELSE printc(c); 1863756Sroot FI 1873756Sroot endline(); 1883756Sroot OD 1893756Sroot dotinc=dot-savdot+1; dot=savdot; break; 1903756Sroot 1913756Sroot case 'x': 1923756Sroot printf("%-8x",w); break; 1933756Sroot 1943756Sroot case 'X': 1953756Sroot printf("%-16X", wx); break; 1963756Sroot 1973756Sroot case 'Y': 1983756Sroot printf("%-24Y", wx); break; 1993756Sroot 2003756Sroot case 'q': 2013756Sroot printf("%-8q", w); break; 2023756Sroot 2033756Sroot case 'Q': 2043756Sroot printf("%-16Q", wx); break; 2053756Sroot 2063756Sroot case 'o': 2073756Sroot printf("%-8o", w); break; 2083756Sroot 2093756Sroot case 'O': 2103756Sroot printf("%-16O", wx); break; 2113756Sroot 2123756Sroot case 'i': 2133756Sroot printins(0,itype,w); printc(EOR); break; 2143756Sroot 2153756Sroot case 'd': 2163756Sroot printf("%-8d", w); break; 2173756Sroot 2183756Sroot case 'D': 2193756Sroot printf("%-16D", wx); break; 2203756Sroot 2213756Sroot case 'f': 2223756Sroot fw = 0; 223*34078Sbostic /* 224*34078Sbostic * This used to be the following, but real compilers 225*34078Sbostic * won't let you use a double as a struct! 226*34078Sbostic * 227*34078Sbostic * fw.sa = wx; 228*34078Sbostic */ 229*34078Sbostic (*(struct bad_programming *)&fw).sa = wx; 23026430Smckusick IF (wx & ~0xFFFF00FF) == 0x8000 23126430Smckusick THEN printf("(reserved oprnd)"); 23226430Smckusick ELSE printf("%-16.9f", fw); 23326430Smckusick FI 2343756Sroot dotinc=4; break; 2353756Sroot 2363756Sroot case 'F': 237*34078Sbostic (*(struct bad_programming *)&fw).sa = wx; 23826430Smckusick IF (wx & ~0xFFFF00FF) == 0x8000 23926430Smckusick THEN printf("%-32s", "(reserved oprnd)"); 24026430Smckusick ELSE printf("%-32.18F", fw); 24126430Smckusick FI 2423756Sroot dotinc=8; break; 2433756Sroot 2443756Sroot case 'n': case 'N': 2453756Sroot printc('\n'); dotinc=0; break; 2463756Sroot 2473756Sroot case '"': 2483756Sroot dotinc=0; 2493756Sroot WHILE *fp != '"' ANDF *fp 2503756Sroot DO printc(*fp++); OD 2513756Sroot IF *fp THEN fp++; FI 2523756Sroot break; 2533756Sroot 2543756Sroot case '^': 2553756Sroot dot=inkdot(-dotinc*fcount); return(fp); 2563756Sroot 2573756Sroot case '+': 2583756Sroot dot=inkdot(fcount); return(fp); 2593756Sroot 2603756Sroot case '-': 2613756Sroot dot=inkdot(-fcount); return(fp); 2623756Sroot 2633756Sroot default: error(BADMOD); 2643756Sroot } 2653756Sroot IF itype!=NSP 2663756Sroot THEN dot=inkdot(dotinc); 2673756Sroot FI 2683756Sroot fcount--; endline(); 2693756Sroot OD 2703756Sroot 2713756Sroot return(fp); 2723756Sroot } 2733756Sroot 2743756Sroot shell() 2753756Sroot { 2763756Sroot #ifndef EDDT 2773756Sroot INT rc, status, unixpid; 2783756Sroot STRING argp = lp; 2793756Sroot STRING getenv(), shell = getenv("SHELL"); 2803756Sroot #ifdef VFORK 2813756Sroot char oldstlp; 2823756Sroot #endif 2833756Sroot 2843756Sroot if (shell == 0) 2853756Sroot shell = "/bin/sh"; 2863756Sroot WHILE lastc!=EOR DO rdc(); OD 2873756Sroot #ifndef VFORK 2883756Sroot IF (unixpid=fork())==0 2893756Sroot #else 2903756Sroot oldstlp = *lp; 2913756Sroot IF (unixpid=vfork())==0 2923756Sroot #endif 2933756Sroot THEN signal(SIGINT,sigint); signal(SIGQUIT,sigqit); 2943756Sroot *lp=0; execl(shell, "sh", "-c", argp, 0); 2953756Sroot _exit(16); 2963756Sroot #ifndef VFORK 2973756Sroot ELIF unixpid == -1 2983756Sroot #else 2993756Sroot ELIF *lp = oldstlp, unixpid == -1 3003756Sroot #endif 3013756Sroot THEN error(NOFORK); 3023756Sroot ELSE signal(SIGINT,1); 3033756Sroot WHILE (rc = wait(&status)) != unixpid ANDF rc != -1 DONE 3043756Sroot signal(SIGINT,sigint); 3053756Sroot prints("!"); lp--; 3063756Sroot FI 3073756Sroot #endif 3083756Sroot } 3093756Sroot 3103756Sroot 3113756Sroot printesc(c) 3123756Sroot { 3133756Sroot c &= STRIP; 3143756Sroot IF c==0177 THEN printf("^?"); 3153756Sroot ELIF c<SP 3163756Sroot THEN printf("^%c", c + '@'); 3173756Sroot ELSE printc(c); 3183756Sroot FI 3193756Sroot } 3203756Sroot 3213756Sroot L_INT inkdot(incr) 3223756Sroot { 3233756Sroot L_INT newdot; 3243756Sroot 3253756Sroot newdot=dot+incr; 3263756Sroot IF (dot NEQ newdot) >> 24 THEN error(ADWRAP); FI 3273756Sroot return(newdot); 3283756Sroot } 3293756Sroot 3303756Sroot digit(c) 3313756Sroot { 3323756Sroot return c >= '0' && c <= '9'; 3333756Sroot } 334