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) 05/03/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 } 192