5 * toto est beau => titi est beau
15 int compute_dest_len(char *fname, char *subst,
16 regmatch_t *pmatch, int nmatch)
20 if (!fname || !subst || !pmatch || !nmatch) {
25 if (pmatch[0].rm_so < 0) {
30 for (p = subst++; *p ; p = subst++) {
31 /* match $1 \1 back references */
32 if ((*p == '$' || *p == '\\') && ('0' <= *subst && *subst <= '9')) {
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;
39 return 0; /* back reference missing or reference number > nmatch */
46 /* $0 is replaced by subst */
47 len -= pmatch[0].rm_eo - pmatch[0].rm_so;
48 len += strlen(fname) + 1;
57 bool extract_regexp(char *motif, regex_t *preg, POOLMEM **subst)
59 /* rechercher le 1er car sans \ devant */
60 /* compiler la re dans preg */
61 /* extraire le subst */
62 /* verifier le nombre de reference */
65 /* dest is long enough */
66 char *edit_subst(char *fname, char *subst, regmatch_t *pmatch, char *dest)
71 /* il faut recopier fname dans dest
72 * on recopie le debut fname -> pmatch[0].rm_so
75 for (i = 0; i < pmatch[0].rm_so ; i++) {
79 /* on recopie le motif de remplacement (avec tous les $x) */
83 for (p = subst++; *p ; p = subst++) {
84 /* match $1 \1 back references */
85 if ((*p == '$' || *p == '\\') && ('0' <= *subst && *subst <= '9')) {
88 len = pmatch[no].rm_eo - pmatch[no].rm_so;
89 bstrncpy(dest + i, fname + pmatch[no].rm_so, len);
97 strcpy(dest + i, fname + pmatch[0].rm_eo);
102 /* return jcr->subst_fname or fname */
103 char *fname_subst(JCR *jcr, char *fname)
111 int rc = regcomp(&preg, pat, REG_EXTENDED);
114 regerror(rc, &preg, prbuf, sizeof(prbuf));
115 printf("Regex compile error: %s\n", prbuf);
119 const int nmatch = 30;
120 regmatch_t pmatch[nmatch];
121 rc = regexec(&preg, fname, nmatch, pmatch, 0);
125 regerror(rc, &preg, prbuf, sizeof(prbuf));
126 printf("Regex error: %s\n", prbuf);
130 int len = compute_dest_len(fname, subst,
134 dest = (char *)malloc(len);
135 edit_subst(fname, subst, pmatch, dest);