7 typedef struct Trie Trie;
8 typedef struct Var Var;
23 Var *vlist, **vlistp = &vlist;
32 if(v == nil) sysfatal("malloc: %r");
33 setmalloctag(v, getcallerpc(&n));
43 h = 0xcbf29ce484222325ULL;
46 h *= 0x100000001b3ULL;
58 if((int)d == 0) r += 32, d >>= 32;
59 r += ((d & 0xffff0000) != 0) << 4;
60 r += ((d & 0xff00ff00) != 0) << 3;
61 r += ((d & 0xf0f0f0f0) != 0) << 2;
62 r += ((d & 0xcccccccc) != 0) << 1;
63 r += ((d & 0xaaaaaaaa) != 0);
77 t = emalloc(sizeof(Var));
83 d = (h ^ t->hash) << 64 - t->l >> 64 - t->l;
84 if(d == 0 || t->l == 0){
87 tp = &t->c[h >> t->l & 1];
90 s = emalloc(sizeof(Trie));
93 s->c[t->hash >> s->l & 1] = t;
95 tp = &s->c[h >> s->l & 1];
104 v = (Var*) trieget(hash(n));
113 if(strcmp(v->name, n) == 0)
115 for(vp = (Var**)&v->trie.c[0]; (v = *vp) != nil; vp = (Var**)&v->trie.c[0])
116 if(strcmp(v->name, n) == 0)
118 v = emalloc(sizeof(Var));
126 return isalnum(c) || c == '_' || c == '-' || c >= 0x80;
130 enum { TEOF = -1, TVAR = -2 };
146 while(c >= 0 && isspace(c) && c != '\n');
150 while(c >= 0 && c != '\n');
151 if(c < 0) return TEOF;
154 if(c < 0) return TEOF;
158 while(c = Bgetc(bin), c >= 0 && isvarchar(c))
159 if(p < lexbuf + sizeof(lexbuf) - 1)
181 static int *clbuf, nclbuf;
192 min = strtol(lexbuf, &p, 10);
193 if(p == lexbuf || *p != 0 || min < 0) goto syntax;
201 if(t != ',') goto syntax;
204 max = strtol(lexbuf, &p, 10);
205 if(p == lexbuf || *p != 0 || max < 0) goto syntax;
209 if(t != ']') goto syntax;
213 clbuf = realloc(clbuf, (nclbuf + 32) * sizeof(int));
216 clbuf[n++] = not * varget(lexbuf)->n;
227 sysfatal("unexpected token %d", t);
232 satrange1(s, clbuf, n, min, max< 0 ? n : max);
234 satadd1(s, clbuf, n);
237 sysfatal("syntax error");
241 int oneflag, multiflag;
246 fprint(2, "usage: %s [-1m] [file]\n", argv0);
251 main(int argc, char **argv)
257 case '1': oneflag++; break;
258 case 'm': multiflag++; break;
264 bin = Bfdopen(0, OREAD);
267 bin = Bopen(argv[0], OREAD);
271 if(bin == nil) sysfatal("Bopen: %r");
273 if(s == nil) sysfatal("satnew: %r");
277 bout = Bfdopen(1, OWRITE);
278 while(satmore(s) > 0){
279 for(v = vlist; v != nil; v = v->next)
280 if(satval(s, v->n) > 0)
281 Bprint(bout, "%s ", v->name);
288 bout = Bfdopen(1, OWRITE);
289 for(v = vlist; v != nil; v = v->next)
290 if(satval(s, v->n) > 0)
291 Bprint(bout, "%s ", v->name);
297 bout = Bfdopen(1, OWRITE);
298 for(v = vlist; v != nil; v = v->next)
299 Bprint(bout, "%s %d\n", v->name, satval(s, v->n));