5 * toto est beau => titi est beau
22 breg_t *breg_new(char *regexp)
24 Dmsg0(500, "breg: creating new breg_t object\n");
25 RUNSCRIPT *cmd = (RUNSCRIPT *)malloc(sizeof(RUNSCRIPT));
26 memset(cmd, 0, sizeof(RUNSCRIPT));
34 int compute_dest_len(char *fname, char *subst,
35 regmatch_t *pmatch, int nmatch)
41 if (!fname || !subst || !pmatch || !nmatch) {
46 if (pmatch[0].rm_so < 0) {
50 for (p = subst++; *p ; p = subst++) {
51 /* match $1 \1 back references */
52 if ((*p == '$' || *p == '\\') && ('0' <= *subst && *subst <= '9')) {
55 /* we check if the back reference exists */
56 if (no < nmatch && pmatch[no].rm_so >= 0 && pmatch[no].rm_eo >= 0) {
57 len += pmatch[no].rm_eo - pmatch[no].rm_so;
59 return 0; /* back reference missing or reference number > nmatch */
66 /* $0 is replaced by subst */
67 len -= pmatch[0].rm_eo - pmatch[0].rm_so;
68 len += strlen(fname) + 1;
77 bool extract_regexp(char *motif, regex_t *preg, POOLMEM **subst)
79 if (!motif || !preg || !subst) {
82 /* extract 1st part */
83 POOLMEM *dest = bstrdup(motif);
85 char *search = motif + 1;
88 bool found_motif = false;
90 while (*search && !ok) {
91 if (*search == sep && *dest == '\\') {
92 *dest++ = *++search; /* we skip separator */
94 } else if (*search == sep) {
96 if (found_motif) { /* already have found motif */
99 replace = dest; /* get replaced string */
106 *dest = '\0'; /* in case of */
108 if (!ok || !found_motif) {
117 /* rechercher le 1er car sans \ devant */
118 /* compiler la re dans preg */
119 /* extraire le subst */
120 /* verifier le nombre de reference */
123 /* dest is long enough */
124 char *edit_subst(char *fname, char *subst, regmatch_t *pmatch, char *dest)
131 /* il faut recopier fname dans dest
132 * on recopie le debut fname -> pmatch[0].rm_so
135 for (i = 0; i < pmatch[0].rm_so ; i++) {
139 /* on recopie le motif de remplacement (avec tous les $x) */
141 for (p = subst++; *p ; p = subst++) {
142 /* match $1 \1 back references */
143 if ((*p == '$' || *p == '\\') && ('0' <= *subst && *subst <= '9')) {
146 len = pmatch[no].rm_eo - pmatch[no].rm_so;
147 bstrncpy(dest + i, fname + pmatch[no].rm_so, len);
155 strcpy(dest + i, fname + pmatch[0].rm_eo);
160 /* return jcr->subst_fname or fname */
161 char *fname_subst(JCR *jcr, char *fname)
169 int rc = regcomp(&preg, pat, REG_EXTENDED);
172 regerror(rc, &preg, prbuf, sizeof(prbuf));
173 printf("Regex compile error: %s\n", prbuf);
177 const int nmatch = 30;
178 regmatch_t pmatch[nmatch];
179 rc = regexec(&preg, fname, nmatch, pmatch, 0);
183 regerror(rc, &preg, prbuf, sizeof(prbuf));
184 printf("Regex error: %s\n", prbuf);
188 int len = compute_dest_len(fname, subst,
192 dest = (char *)malloc(len);
193 edit_subst(fname, subst, pmatch, dest);