]> git.sur5r.net Git - bacula/bacula/blob - bacula/patches/testing/resubst.c
ebl first cup of "regexp where"
[bacula/bacula] / bacula / patches / testing / resubst.c
1 #include "bacula.h"
2 #include "bregex.h"
3
4 /* s/toto(.)/titi$1/ 
5  * toto est beau => titi est beau
6  *
7  */
8
9 /* re_match()
10  * compute_dest_len()
11  * check_pool_size()
12  * edit()
13  */
14
15 int compute_dest_len(char *fname, char *subst, 
16                      regmatch_t *pmatch, int nmatch)
17 {
18    int len=0;
19    char *p;
20    if (!fname || !subst || !pmatch || !nmatch) {
21       return 0;
22    }
23
24    /* match failed ? */
25    if (pmatch[0].rm_so < 0) {
26       return 0;
27    }
28
29    int no;
30    for (p = subst++; *p ; p = subst++) {
31       /* match $1 \1 back references */
32       if ((*p == '$' || *p == '\\') && ('0' <= *subst && *subst <= '9')) {
33          no = *subst++ - '0';
34
35          /* we check if the back reference exists */
36          if (no < nmatch && pmatch[no].rm_so >= 0 && pmatch[no].rm_eo >= 0) { 
37             len += pmatch[no].rm_eo - pmatch[no].rm_so;
38          } else {
39             return 0; /* back reference missing or reference number > nmatch */
40          }
41       } else {
42          len++;
43       }
44    }
45
46    /* $0 is replaced by subst */
47    len -= pmatch[0].rm_eo - pmatch[0].rm_so;
48    len += strlen(fname) + 1;
49
50    return len;
51 }
52
53 /* /toto/titi/ 
54  * preg
55  * subst
56  */
57 bool extract_regexp(char *motif, regex_t *preg, POOLMEM **subst)
58 {
59    /* rechercher le 1er car sans \ devant */
60    /* compiler la re dans preg */
61    /* extraire le subst */
62    /* verifier le nombre de reference */
63 }
64
65 /* dest is long enough */
66 char *edit_subst(char *fname, char *subst, regmatch_t *pmatch, char *dest)
67 {
68    int i;
69    char *p;
70
71    /* il faut recopier fname dans dest
72     *  on recopie le debut fname -> pmatch[0].rm_so
73     */
74    
75    for (i = 0; i < pmatch[0].rm_so ; i++) {
76       dest[i] = fname[i];
77    }
78
79    /* on recopie le motif de remplacement (avec tous les $x) */
80
81    int no;
82    int len;
83    for (p = subst++; *p ; p = subst++) {
84       /* match $1 \1 back references */
85       if ((*p == '$' || *p == '\\') && ('0' <= *subst && *subst <= '9')) {
86          no = *subst++ - '0';
87
88          len = pmatch[no].rm_eo - pmatch[no].rm_so;
89          bstrncpy(dest + i, fname + pmatch[no].rm_so, len);
90          i += len;
91
92       } else {
93          dest[i++] = *p;
94       }
95    }
96
97    strcpy(dest + i, fname + pmatch[0].rm_eo);
98
99    return dest;
100 }
101
102 /* return jcr->subst_fname or fname */
103 char *fname_subst(JCR *jcr, char *fname)
104 {
105    /* in JCR */
106    regex_t preg;
107    char *pat="$";
108    char *subst=".old";
109    char *dest=NULL;
110
111    int rc = regcomp(&preg, pat, REG_EXTENDED);
112    if (rc != 0) {
113       char prbuf[500];
114       regerror(rc, &preg, prbuf, sizeof(prbuf));
115       printf("Regex compile error: %s\n", prbuf);
116       return fname;
117    }
118
119    const int nmatch = 30;
120    regmatch_t pmatch[nmatch];
121    rc = regexec(&preg, fname, nmatch, pmatch,  0);
122
123    if (!rc) {
124       char prbuf[500];
125       regerror(rc, &preg, prbuf, sizeof(prbuf));
126       printf("Regex error: %s\n", prbuf);
127       return fname;
128    }
129
130    int len = compute_dest_len(fname, subst, 
131                               pmatch, nmatch);
132
133    if (len) {
134       dest = (char *)malloc(len);
135       edit_subst(fname, subst, pmatch, dest);
136    }
137
138    return dest;
139