1 #include "headers.h"
2
3 int
smbmatch(char * name,Reprog * rep)4 smbmatch(char *name, Reprog *rep)
5 {
6 Resub sub;
7 sub.sp = nil;
8 sub.ep = nil;
9 if (regexec(rep, name, &sub, 1) && sub.sp == name && *sub.ep == 0)
10 return 1;
11 return 0;
12 }
13
14 Reprog *
smbmkrep(char * pattern)15 smbmkrep(char *pattern)
16 {
17 Reprog *r;
18 int l;
19 char *tmp, *p, *q, *t;
20 l = strlen(pattern);
21 tmp = smbemalloc(l * 5 + 1);
22 t = tmp;
23 p = pattern;
24 while (*p) {
25 if (*p == '*') {
26 if (p[1] == '.') {
27 strcpy(t, "[^.]*");
28 t += 5;
29 p++;
30 }
31 else {
32 *t++ = '.';
33 *t++ = '*';
34 p++;
35 }
36 }
37 else if (*p == '?') {
38 for (q = p + 1; *q && *q == '?'; q++)
39 ;
40 if (*q == 0 || *q == '.') {
41 /* at most n copies */
42 strcpy(t, "[^.]?");
43 t += 5;
44 p++;
45 }
46 else {
47 /* exactly n copies */
48 strcpy(t, "[^.]");
49 t += 4;
50 p++;
51 }
52 }
53 else if (strchr(".+{}()|\\^$", *p) != 0) {
54 /* regexp meta */
55 *t++ = '\\';
56 *t++ = *p++;
57 }
58 else
59 *t++ = *p++;
60 }
61 *t = 0;
62 smblogprintif(smbglobals.log.rep, "%s => %s\n", pattern, tmp);
63 r = regcomp(tmp);
64 free(tmp);
65 return r;
66 }
67
68