]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl tweak bregex.c to get REG_ICASE working with regcomp and re_search
authorEric Bollengier <eric@eb.homelinux.org>
Mon, 23 Apr 2007 21:22:18 +0000 (21:22 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Mon, 23 Apr 2007 21:22:18 +0000 (21:22 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4610 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/lib/breg.c
bacula/src/lib/breg.h
bacula/src/lib/bregex.c
bacula/src/lib/bregex.h

index 6c9a4ef560a04093f24c54c7043d3fee1ae31765..8c53e6a93baec6b03c9cc7e033d885894993277a 100644 (file)
@@ -245,17 +245,7 @@ char *BREGEXP::replace(const char *fname)
 {
    success = false;            /* use this.success to known if it's ok */
    int flen = strlen(fname);
-#ifndef HAVE_REGEX_H
-   int i;
-   check_pool_memory_size(lcase, flen);
-   for(i=0; fname[i] ; i++) {
-      lcase[i] = tolower(fname[i]);
-   }
-   lcase[i] = '\0';
-   int rc = re_search(&preg, (BREGEX_CAST char*) lcase, flen, 0, flen, &regs);
-#else
    int rc = re_search(&preg, (BREGEX_CAST char*) fname, flen, 0, flen, &regs);
-#endif
 
    if (rc < 0) {
       Dmsg0(500, "bregexp: regex mismatch\n");
index fa639f17a879e8a6c9dd89ea7ca2fcff63cd8301..9c1e50a8c7d6c0dbc4dbafa7cf3f5ecabc817090 100644 (file)
@@ -68,7 +68,6 @@ public:
    /* private */
    POOLMEM *expr;              /* search epression */
    POOLMEM *subst;             /* substitution */
-   POOLMEM *lcase;             /* fname in lower case when using bregexp.c */
    regex_t preg;               /* regex_t result of regcomp() */
    struct re_registers regs;   /* contains match */
    char *eor;                  /* end of regexp in expr */
index 9ded1b67be35535cf74fb066b84dce386b5c5ec5..939c84cdc28a38ec48756297ca4a2e38be11f794 100644 (file)
@@ -30,6 +30,9 @@
  *
  * This file modified to work with Bacula and C++ by
  *    Kern Sibbald, April 2006
+ *
+ * This file modified to work with REG_ICASE and Bacula by
+ *    Eric Bollengier April 2007
  */
 /*
    Bacula® - The Network Backup Solution
@@ -1461,9 +1464,15 @@ int regcomp(regex_t * bufp, const char *regex, int cflags)
    memset(bufp, 0, sizeof(regex_t));
    bufp->cflags = cflags;
    if (bufp->cflags & REG_ICASE) {
-      // ICI passer regex en lcase
+      char *p, *lcase = bstrdup(regex);
+      for( p = lcase; *p ; p++) {
+        *p = tolower(*p);
+      } 
+      re_compile_pattern(bufp, (unsigned char *)lcase);
+      bfree(lcase);
+   } else {
+      re_compile_pattern(bufp, (unsigned char *)regex);
    }
-   re_compile_pattern(bufp, (unsigned char *)regex);
    if (got_error) {
       return -1;
    }
@@ -1475,7 +1484,6 @@ int regexec(regex_t * preg, const char *string, size_t nmatch,
 {
    int stat;
    int len = strlen(string);
-   // ICI passer string en lcase
    struct re_registers regs;
    stat = re_search(preg, (unsigned char *)string, len, 0, len, &regs);
    /* stat is the start position in the string base 0 where       
@@ -1492,6 +1500,10 @@ size_t regerror(int errcode, regex_t * preg, char *errbuf, size_t errbuf_size)
 
 void regfree(regex_t * preg)
 {
+   if (preg->lcase) {
+      free_pool_memory(preg->lcase);
+      preg->lcase = NULL;
+   }
 }
 
 int re_match(regex_t * bufp, unsigned char *string, int size, int pos,
@@ -1890,7 +1902,7 @@ int re_match(regex_t * bufp, unsigned char *string, int size, int pos,
 #undef PREFETCH
 #undef NEXTCHAR
 
-int re_search(regex_t * bufp, unsigned char *string, int size, int pos,
+int re_search(regex_t * bufp, unsigned char *str, int size, int pos,
               int range, regexp_registers_t regs)
 {
    unsigned char *fastmap;
@@ -1901,6 +1913,21 @@ int re_search(regex_t * bufp, unsigned char *string, int size, int pos,
    int dir;
    int ret;
    unsigned char anchor;
+   unsigned char *string = str;
+
+   if (bufp->cflags & REG_ICASE) { /* we must use string in lowercase */
+      int len = strlen((const char *)str);
+      if (!bufp->lcase) {
+        bufp->lcase = get_pool_memory(PM_FNAME);
+      }
+      check_pool_memory_size(bufp->lcase, len+1);
+      unsigned char *dst = (unsigned char *)bufp->lcase;
+      while (*string) {
+        *dst++ = tolower(*string++);
+      }
+      *dst = '\0';
+      string = (unsigned char *)bufp->lcase;
+   }
 
 // assert(size >= 0 && pos >= 0);
 // assert(pos + range >= 0 && pos + range <= size);     /* Bugfix by ylo */
index 8c7778d1c357472c5e2388548d2b7907ba36a34e..aaef2a8a688d49523d75ae8349bea7945f3c0d84 100644 (file)
@@ -107,7 +107,7 @@ struct regex_t
    unsigned char anchor;           /* anchor: 0=none 1=begline 2=begbuf */
    char *errmsg;
    int cflags;                    /* compilation flags */
-   POOLMEM *str_lcase;            /* use to store expression in lcase */
+   POOLMEM *lcase;                /* used by REG_ICASE */
 };