]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl add build_where and escape_string functions
authorEric Bollengier <eric@eb.homelinux.org>
Wed, 4 Apr 2007 20:55:02 +0000 (20:55 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Wed, 4 Apr 2007 20:55:02 +0000 (20:55 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4510 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/patches/testing/breg.c
bacula/patches/testing/breg.h
bacula/patches/testing/bregtest.c

index 07bca726e75038fc09a864f489933dfaac2f8cbf..1dee7128bbac64a6df63618bc7f8451cfdb2d39b 100644 (file)
@@ -173,6 +173,9 @@ bool BREGEXP::extract_regexp(const char *motif)
       if (search[0] == '\\' && search[1] == sep) {
         *dest++ = *++search;       /* we skip separator */ 
 
+      } else if (search[0] == '\\' && search[1] == '\\') {
+        *dest++ = *++search;       /* we skip the second \ */
+
       } else if (*search == sep) {  /* we found end of expression */
         *dest++ = '\0';
 
@@ -348,6 +351,71 @@ char *BREGEXP::edit_subst(const char *fname, struct re_registers *regs)
    return result;
 }
 
+/* escape sep char and \
+ * dest must be long enough (src*2+1)
+ * return end of the string */
+char *bregexp_escape_string(char *dest, char *src, char sep)
+{
+   char *ret = dest;
+   while (*src)
+   {
+      if (*src == sep) {
+        *dest++ = '\\';
+      } else if (*src == '\\') {
+        *dest++ = '\\';
+      }
+      *dest++ = *src++;
+   }
+   *dest = '\0';
+
+   return ret; 
+}
+
+/* build a regexp string with user arguments
+ * don't forget to free ret 
+ */
+char *bregexp_build_where(char *strip_prefix, 
+                          char *add_prefix, 
+                          char *add_suffix)
+{
+   /* strip_prefix = !strip_prefix!!         4 bytes
+    * add_prefix   = !^!add_prefix!          5 bytes
+    * add_suffix   = !([^/])$!$1.add_suffix! 14 bytes
+    */
+   int len=0;
+   char sep = '!';
+   int str_size = (strlen(strip_prefix) + 4 +
+                  strlen(add_prefix)   + 5 +
+                  strlen(add_suffix)   + 14) * 2  + 1;
+
+   POOLMEM *ret = get_memory(str_size);
+   POOLMEM *str_tmp = get_memory(str_size);
+
+   *str_tmp = *ret = '\0';
+   
+   if (*strip_prefix) {
+      len += bsnprintf(ret, str_size - len, "!%s!!",
+                      bregexp_escape_string(str_tmp, strip_prefix, sep));
+   }
+
+   if (*add_suffix) {
+      if (len) ret[len++] = ',';
+
+      len += bsnprintf(ret + len,  str_size - len, "!([^/])$!$1%s!",
+                      bregexp_escape_string(str_tmp, add_suffix, sep));
+   }
+
+   if (*add_prefix) {
+      if (len) ret[len++] = ',';
+
+      len += bsnprintf(ret + len, str_size - len, "!^!%s!", 
+                      bregexp_escape_string(str_tmp, add_prefix, sep));
+   }
+
+   return ret;
+}
+
+
 void BREGEXP::debug()
 {
    printf("expr=[%s]\n", expr);
index 991ad5a2d3c8d77798a1dde7286fcd79b332215d..101f50eee6617c276576f9205da621e02a23b168 100644 (file)
@@ -98,4 +98,14 @@ bool apply_bregexps(const char *fname, alist *bregexps, char **result);
 /* foreach_alist free RUNSCRIPT */
 void free_bregexps(alist *bregexps); /* you have to free alist */
 
+/* get a bregexp string from user arguments */
+char *bregexp_build_where(char *strip_prefix, 
+                          char *add_prefix, 
+                          char *add_suffix);
+
+/* escape a string to regexp format (sep and \) 
+ * dest must be long enough (dest = 2*src + 1)
+ */
+char *bregexp_escape_string(char *dest, char *src, char sep);
+
 #endif /* __BREG_H_ */
index f8cbb92c25d8aa2f3dfb734110cdd2e648b409ca..71eaad3b6b694b3251a7af371cbb6c486d158c46 100644 (file)
@@ -62,6 +62,10 @@ static void usage()
 
 int main(int argc, char *const *argv)
 {
+       printf("%s\n", bregexp_build_where("/tmp", "/opt", ".old"));
+       exit(0);
+
+
    regex_t preg;
    char prbuf[500];
    char *fname = NULL;