diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aquarela/smbrep.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aquarela/smbrep.c')
-rwxr-xr-x | sys/src/cmd/aquarela/smbrep.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/sys/src/cmd/aquarela/smbrep.c b/sys/src/cmd/aquarela/smbrep.c new file mode 100755 index 000000000..923ad851a --- /dev/null +++ b/sys/src/cmd/aquarela/smbrep.c @@ -0,0 +1,67 @@ +#include "headers.h" + +int +smbmatch(char *name, Reprog *rep) +{ + Resub sub; + sub.sp = nil; + sub.ep = nil; + if (regexec(rep, name, &sub, 1) && sub.sp == name && *sub.ep == 0) + return 1; + return 0; +} + +Reprog * +smbmkrep(char *pattern) +{ + Reprog *r; + int l; + char *tmp, *p, *q, *t; + l = strlen(pattern); + tmp = smbemalloc(l * 5 + 1); + t = tmp; + p = pattern; + while (*p) { + if (*p == '*') { + if (p[1] == '.') { + strcpy(t, "[^.]*"); + t += 5; + p++; + } + else { + *t++ = '.'; + *t++ = '*'; + p++; + } + } + else if (*p == '?') { + for (q = p + 1; *q && *q == '?'; q++) + ; + if (*q == 0 || *q == '.') { + /* at most n copies */ + strcpy(t, "[^.]?"); + t += 5; + p++; + } + else { + /* exactly n copies */ + strcpy(t, "[^.]"); + t += 4; + p++; + } + } + else if (strchr(".+{}()|\\^$", *p) != 0) { + /* regexp meta */ + *t++ = '\\'; + *t++ = *p++; + } + else + *t++ = *p++; + } + *t = 0; + smblogprintif(smbglobals.log.rep, "%s => %s\n", pattern, tmp); + r = regcomp(tmp); + free(tmp); + return r; +} + |