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