126416Ssam #ifndef lint
2*29663Ssam static char sccsid[] = "@(#)command.c 1.2 (Berkeley) 07/25/86";
326416Ssam #endif
426416Ssam /*
526416Ssam *
626416Ssam * UNIX debugger
726416Ssam *
826416Ssam */
926416Ssam
1026416Ssam #include "defs.h"
1126416Ssam
1226416Ssam MSG BADEQ;
1326416Ssam MSG NOMATCH;
1426416Ssam MSG BADVAR;
1526416Ssam MSG BADCOM;
1626416Ssam
1726416Ssam MAP txtmap;
1826416Ssam MAP datmap;
1926416Ssam INT executing;
2026416Ssam CHAR *lp;
2126416Ssam INT fcor;
2226416Ssam INT fsym;
2326416Ssam INT mkfault;
2426416Ssam STRING errflg;
2526416Ssam
2626416Ssam CHAR lastc;
2726416Ssam CHAR eqformat[512] = "z";
2826416Ssam CHAR stformat[512] = "X\"= \"^i";
2926416Ssam
3026416Ssam L_INT dot;
3126416Ssam L_INT ditto;
3226416Ssam INT dotinc;
3326416Ssam INT lastcom = '=';
3426416Ssam L_INT var[];
3526416Ssam L_INT locval;
3626416Ssam L_INT locmsk;
3726416Ssam L_INT pid;
3826416Ssam L_INT expv;
3926416Ssam L_INT adrval;
4026416Ssam INT adrflg;
4126416Ssam L_INT cntval;
4226416Ssam INT cntflg;
4326416Ssam
4426416Ssam
4526416Ssam
4626416Ssam
4726416Ssam /* command decoding */
4826416Ssam
command(buf,defcom)4926416Ssam command(buf,defcom)
5026416Ssam STRING buf;
5126416Ssam CHAR defcom;
5226416Ssam {
5326416Ssam REG itype, ptype, modifier, regptr;
5426416Ssam BOOL longpr, eqcom;
5526416Ssam CHAR wformat[1];
5626416Ssam CHAR savc;
5726416Ssam REG L_INT w, savdot;
5826416Ssam STRING savlp=lp;
5926416Ssam IF buf
6026416Ssam THEN IF *buf==EOR
6126416Ssam THEN return(FALSE);
6226416Ssam ELSE lp=buf;
6326416Ssam FI
6426416Ssam FI
6526416Ssam
6626416Ssam REP
6726416Ssam IF adrflg=expr(0)
6826416Ssam THEN dot=expv; ditto=dot;
6926416Ssam FI
7026416Ssam adrval=dot;
7126416Ssam IF rdc()==',' ANDF expr(0)
7226416Ssam THEN cntflg=TRUE; cntval=expv;
7326416Ssam ELSE cntflg=FALSE; cntval=1; lp--;
7426416Ssam FI
7526416Ssam
7626416Ssam IF !eol(rdc())
7726416Ssam THEN lastcom=lastc;
7826416Ssam ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
7926416Ssam lp--; lastcom=defcom;
8026416Ssam FI
8126416Ssam
8226416Ssam switch(lastcom&STRIP) {
8326416Ssam
8426416Ssam case '/':
8526416Ssam itype=DSP; ptype=DSYM;
8626416Ssam goto trystar;
8726416Ssam
8826416Ssam case '=':
8926416Ssam itype=NSP; ptype=0;
9026416Ssam goto trypr;
9126416Ssam
9226416Ssam case '?':
9326416Ssam itype=ISP; ptype=ISYM;
9426416Ssam goto trystar;
9526416Ssam
9626416Ssam trystar:
9726416Ssam IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
9826416Ssam IF lastcom"E
9926416Ssam THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
10026416Ssam FI
10126416Ssam
10226416Ssam trypr:
10326416Ssam longpr=FALSE; eqcom=lastcom=='=';
10426416Ssam switch (rdc()) {
10526416Ssam
10626416Ssam case 'm':
10726416Ssam {/*reset map data*/
10826416Ssam INT fcount;
10926416Ssam MAP *smap;
11026416Ssam UNION{MAP *m; L_INT *mp;}amap;
11126416Ssam
11226416Ssam IF eqcom THEN error(BADEQ); FI
11326416Ssam smap=(itype&DSP?&datmap:&txtmap);
11426416Ssam amap.m=smap; fcount=3;
11526416Ssam IF itype&STAR
11626416Ssam THEN amap.mp += 3;
11726416Ssam FI
11826416Ssam WHILE fcount-- ANDF expr(0)
11926416Ssam DO *(amap.mp)++ = expv; OD
12026416Ssam IF rdc()=='?' THEN smap->ufd=fsym;
12126416Ssam ELIF lastc == '/' THEN smap->ufd=fcor;
12226416Ssam ELSE lp--;
12326416Ssam FI
12426416Ssam }
12526416Ssam break;
12626416Ssam
12726416Ssam case 'L':
12826416Ssam longpr=TRUE;
12926416Ssam case 'l':
13026416Ssam /*search for exp*/
13126416Ssam IF eqcom THEN error(BADEQ); FI
13226416Ssam dotinc=(longpr?4:2); savdot=dot;
13326416Ssam expr(1); locval=expv;
13426416Ssam IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
13526416Ssam IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
13626416Ssam LOOP w=get(dot,itype);
13726416Ssam IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
13826416Ssam dot=inkdot(dotinc);
13926416Ssam POOL
14026416Ssam IF errflg
14126416Ssam THEN dot=savdot; errflg=NOMATCH;
14226416Ssam FI
14326416Ssam psymoff(dot,ptype,"");
14426416Ssam break;
14526416Ssam
14626416Ssam case 'W':
14726416Ssam longpr=TRUE;
14826416Ssam case 'w':
14926416Ssam IF eqcom THEN error(BADEQ); FI
15026416Ssam wformat[0]=lastc; expr(1);
15126416Ssam REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
15226416Ssam errflg=0; dot=savdot;
15326416Ssam IF longpr
15426416Ssam THEN put(dot,itype,expv);
15526416Ssam ELSE put(dot,itype,itol(expv,get(dot,itype)));
15626416Ssam FI
15726416Ssam savdot=dot;
15826416Ssam printf("=%8t"); exform(1,wformat,itype,ptype);
15926416Ssam printc(EOR);
16026416Ssam PER expr(0) ANDF errflg==0 DONE
16126416Ssam dot=savdot;
16226416Ssam chkerr();
16326416Ssam break;
16426416Ssam
16526416Ssam default:
16626416Ssam lp--;
16726416Ssam getformat(eqcom ? eqformat : stformat);
16826416Ssam IF !eqcom
16926416Ssam THEN psymoff(dot,ptype,":%16t");
17026416Ssam FI
17126416Ssam scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
17226416Ssam }
17326416Ssam break;
17426416Ssam
17526416Ssam case '>':
17626416Ssam lastcom=0; savc=rdc();
177*29663Ssam IF (regptr=getreg(savc)) != -1
17826416Ssam THEN IF kcore THEN *(int *)regptr = dot; ELSE
17926416Ssam *(ADDR *)(((ADDR)(&u))+regptr)=dot;
18026416Ssam ptrace(WUREGS, pid, regptr*NBPW,
18126416Ssam *(ADDR *)(((ADDR)(&u))+regptr));
18226416Ssam FI
18326416Ssam ELIF (modifier=varchk(savc)) != -1
18426416Ssam THEN var[modifier]=dot;
18526416Ssam ELSE error(BADVAR);
18626416Ssam FI
18726416Ssam break;
18826416Ssam
18926416Ssam case '!':
19026416Ssam lastcom=0;
19126416Ssam shell(); break;
19226416Ssam
19326416Ssam case '$':
19426416Ssam lastcom=0;
19526416Ssam printtrace(nextchar()); break;
19626416Ssam
19726416Ssam case ':':
19826416Ssam IF !executing
19926416Ssam THEN executing=TRUE;
20026416Ssam subpcs(nextchar());
20126416Ssam executing=FALSE;
20226416Ssam lastcom=0;
20326416Ssam FI
20426416Ssam break;
20526416Ssam
20626416Ssam case 0:
20726416Ssam printf(DBNAME);
20826416Ssam break;
20926416Ssam
21026416Ssam default: error(BADCOM);
21126416Ssam }
21226416Ssam
21326416Ssam flushbuf();
21426416Ssam PER rdc()==';' DONE
21526416Ssam IF buf THEN lp=savlp; ELSE lp--; FI
21626416Ssam return(adrflg ANDF dot!=0);
21726416Ssam }
21826416Ssam
219