7 // Convert globbish pattern to regular expression
10 // * any non-slash characters
11 // ... any characters including /
12 // ? any single character except /
13 // [a-z] character class
14 // [~a-z] negated character class
18 glob2regexp(char *glob)
22 int boe; // beginning of path element
24 s = malloc(20*(strlen(glob)+1));
32 if(p[0] == '.' && p[1] == '.' && p[2] == '.'){
41 strcpy(w, "([^./][^/]*)?");
66 if(*p == '^' || *p == '\\')
74 if(strchr("()|^$[]*?+\\.", *p)){
97 werrstr("glob syntax error");
104 typedef struct Pattern Pattern;
115 loadexcludefile(char *file)
122 if((b = Bopen(file, OREAD)) == nil)
123 sysfatal("open %s: %r", file);
124 for(n=1; (p=Brdstr(b, '\n', 1)) != nil; free(p), n++){
126 while(q > p && isspace((uchar)*(q-1)))
135 if(strncmp(p, "include ", 8) == 0){
137 }else if(strncmp(p, "exclude ", 8) == 0){
140 sysfatal("%s:%d: line does not begin with include or exclude", file, n);
143 fprint(2, "%s:%d: warning: space in pattern\n", file, n);
145 if((re = glob2regexp(p+8)) == nil)
146 sysfatal("%s:%d: bad glob pattern", file, n);
148 pattern = vtrealloc(pattern, (npattern+1)*sizeof pattern[0]);
149 pattern[npattern].re = re;
150 pattern[npattern].include = inc;
157 excludepattern(char *p)
161 if((re = glob2regexp(p)) == nil)
162 sysfatal("bad glob pattern %s", p);
164 pattern = vtrealloc(pattern, (npattern+1)*sizeof pattern[0]);
165 pattern[npattern].re = re;
166 pattern[npattern].include = 0;
171 includefile(char *file)
175 for(p=pattern, ep=p+npattern; p<ep; p++)
176 if(regexec(p->re, file, nil, 0))