summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aquarela/smbrep.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/aquarela/smbrep.c67
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;
+}
+