|
|
1.1 root 1: /*
2: * Copyright (c) 1986 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)kdb_command.c 7.4 (Berkeley) 5/3/90
7: */
8:
9: #include "../kdb/defs.h"
10:
11: char *kdbBADEQ;
12: char *kdbNOMATCH;
13: char *kdbBADVAR;
14: char *kdbBADCOM;
15:
16: int kdbexecuting;
17: char *kdblp;
18:
19: char kdblastc;
20: char kdbeqformat[512] = "z";
21: char kdbstformat[512] = "X\"= \"^i";
22:
23: long kdbditto;
24: int kdblastcom = '=';
25: long kdblocval;
26: long kdblocmsk;
27: long kdbexpv;
28:
29: /* command decoding */
30:
31: kdbcommand(buf, defcom)
32: char *buf, defcom;
33: {
34: register itype, ptype, modifier, regptr;
35: int longpr, eqcom;
36: char wformat[1], savc;
37: register long w, savdot;
38: char *savlp=kdblp;
39:
40: if (buf) {
41: if (*buf==EOR)
42: return (0);
43: kdblp=buf;
44: }
45:
46: do {
47: if (kdbadrflg=kdbexpr(0)) {
48: kdbdot=kdbexpv;
49: kdbditto=kdbdot;
50: }
51: kdbadrval=kdbdot;
52: kdbcntflg = (kdbrdc() == ',' && kdbexpr(0));
53: if (kdbcntflg)
54: kdbcntval=kdbexpv;
55: else
56: kdbcntval=1, kdblp--;
57: if (kdbeol(kdbrdc())) {
58: if (!kdbadrflg)
59: kdbdot=kdbinkdot(kdbdotinc);
60: kdblp--; kdblastcom=defcom;
61: } else
62: kdblastcom=kdblastc;
63: switch (kdblastcom&STRIP) {
64:
65: case '/':
66: itype=DSP; ptype=DSYM;
67: goto trystar;
68:
69: case '=':
70: itype=NSP; ptype=0;
71: goto trypr;
72:
73: case '?':
74: itype=ISP; ptype=ISYM;
75: goto trystar;
76:
77: trystar:
78: if (kdbrdc()=='*')
79: kdblastcom |= QUOTE;
80: else
81: kdblp--;
82: if (kdblastcom"E) {
83: itype |= STAR;
84: ptype = (DSYM+ISYM)-ptype;
85: }
86:
87: trypr:
88: longpr=0; eqcom=kdblastcom=='=';
89: switch (kdbrdc()) {
90:
91: case 'L':
92: longpr=1;
93: case 'l':
94: /*search for exp*/
95: if (eqcom)
96: kdberror(kdbBADEQ);
97: kdbdotinc=(longpr?4:2); savdot=kdbdot;
98: (void) kdbexpr(1); kdblocval=kdbexpv;
99: if (kdbexpr(0))
100: kdblocmsk=kdbexpv;
101: else
102: kdblocmsk = -1L;
103: if (!longpr) {
104: kdblocmsk &= 0xFFFF;
105: kdblocval &= 0xFFFF;
106: }
107: for (;;) {
108: w=kdbget(kdbdot,itype);
109: if (kdberrflg || kdbmkfault ||
110: (w&kdblocmsk)==kdblocval)
111: break;
112: kdbdot=kdbinkdot(kdbdotinc);
113: }
114: if (kdberrflg) {
115: kdbdot=savdot;
116: kdberrflg=kdbNOMATCH;
117: }
118: kdbpsymoff(kdbdot,ptype,"");
119: break;
120:
121: case 'W':
122: longpr=1;
123: case 'w':
124: if (eqcom)
125: kdberror(kdbBADEQ);
126: wformat[0]=kdblastc; (void) kdbexpr(1);
127: do {
128: savdot=kdbdot;
129: kdbpsymoff(kdbdot,ptype,":%16t");
130: (void) kdbexform(1,wformat,itype,ptype);
131: kdberrflg=0; kdbdot=savdot;
132: if (longpr)
133: kdbput(kdbdot,itype,kdbexpv);
134: else
135: kdbput(kdbdot,itype,
136: itol(kdbexpv,kdbget(kdbdot,itype)));
137: savdot=kdbdot;
138: kdbprintf("=%8t");
139: (void) kdbexform(1,wformat,itype,ptype);
140: kdbprintc(EOR);
141: } while (kdbexpr(0) && kdberrflg==0);
142: kdbdot=savdot;
143: kdbchkerr();
144: break;
145:
146: default:
147: kdblp--;
148: kdbgetformat(eqcom ? kdbeqformat : kdbstformat);
149: if (!eqcom)
150: kdbpsymoff(kdbdot,ptype,":%16t");
151: kdbscanform(kdbcntval,
152: (eqcom?kdbeqformat:kdbstformat),itype,ptype);
153: }
154: break;
155:
156: case '>':
157: kdblastcom=0; savc=kdbrdc();
158: if ((regptr=kdbgetreg(savc)) != -1)
159: *(int *)regptr = kdbdot;
160: else if ((modifier=kdbvarchk(savc)) != -1)
161: kdbvar[modifier]=kdbdot;
162: else
163: kdberror(kdbBADVAR);
164: break;
165:
166: case '$':
167: kdblastcom=0;
168: kdbprinttrace(kdbnextchar());
169: break;
170:
171: case ':':
172: if (kdbexecuting)
173: break;
174: kdbexecuting=1; kdbsubpcs(kdbnextchar()); kdbexecuting=0;
175: kdblastcom=0;
176: break;
177:
178: case '\0':
179: break;
180:
181: default:
182: kdberror(kdbBADCOM);
183: }
184: kdbflushbuf();
185: } while (kdbrdc()==';');
186: if (buf)
187: kdblp=savlp;
188: else
189: kdblp--;
190: return (kdbadrflg && kdbdot!=0);
191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.