/* * add anything that isn't already matched, all matches are lower case */ static char* add(char *pp, int argc, char **argv) { int fd, i; String *s; char *cp; Addr *a; a = nil; for(i = 0; i < argc; i++) a = readaddrs(argv[i], a); fd = open(pp, OWRITE); seek(fd, 0, 2); for(; a != nil; a = a->next){ if(checkaddr(a->val)) continue; s = simplify(a->val); cp = s_to_c(s); fprint(fd, "%q\t%q\n", cp, a->val); if(*cp == '=') newpattern(Texact, cp+1, 0); else if(*cp == '~') newpattern(Tregexp, cp+1, 0); s_free(s); } close(fd); return nil; }
Pattern *s2bits (char *s) { int i,j; char id; Pattern *p=newpattern(); for (i=0; i<16; i++) { switch(s[i]) { case '1': p->maskset|=(1<<(15-i)); case '0': p->maskbits|=(1<<(15-i)); break; default: id=s[i]; j=newvar(p); p->v[j].id=id; p->v[j].hi=15-i; while(s[++i]==id); i--; p->v[j].lo=15-i; break; } } return p; }
/* * patterns are either * ~ regular expression * = exact match string * * all comparisons are case insensitive */ static int readpatterns(char *path) { Biobuf *b; char *p; char *token[2]; int n; int bang; b = Bopen(path, OREAD); if(b == nil) return -1; while((p = Brdline(b, '\n')) != nil){ p[Blinelen(b)-1] = 0; n = tokenize(p, token, 2); if(n == 0) continue; mklower(token[0]); p = token[0]; if(*p == '!'){ p++; bang = 1; } else bang = 0; if(*p == '='){ if(newpattern(Texact, p+1, bang) < 0) return -1; } else if(*p == '~'){ if(newpattern(Tregexp, p+1, bang) < 0) return -1; } else if(strcmp(token[0], "#include") == 0 && n == 2) readpatterns(token[1]); } Bterm(b); return 0; }