Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#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;
}