17 int compile_regex (regex_t * r,
const char * regex_text)
19 int status = regcomp (r, regex_text, REG_EXTENDED);
21 char error_message[2048];
22 regerror (status, r, error_message, 2048);
23 printf (
"Regex error compiling '%s': %s\n",
24 regex_text, error_message);
40 int count_matches(
const char *regex_text,
const char *to_match) {
45 ret = compile_regex(&r, regex_text);
49 const char * p = to_match;
50 const size_t n_sub_matches = 10;
51 regmatch_t m[n_sub_matches];
53 int nomatch = regexec(&r, p, n_sub_matches, m, 0);
76 int find_match(
const char *regex_text,
const char *to_match,
77 size_t *sind,
size_t *eind) {
82 ret = compile_regex(&r, regex_text);
86 const char * p = to_match;
87 const size_t n_sub_matches = 10;
88 regmatch_t m[n_sub_matches];
89 int nomatch = regexec(&r, p, n_sub_matches, m, 0);
112 int find_matches(
const char *regex_text,
const char *to_match,
113 size_t **sind,
size_t **eind) {
118 ret = compile_regex(&r, regex_text);
122 const size_t n_sub_matches = 10;
123 regmatch_t m[n_sub_matches];
124 int nomatch = regexec(&r, to_match, n_sub_matches, m, 0);
128 if ((m[n_match].rm_so == -1) && (m[n_match].rm_eo == -1)) {
134 *sind = (
size_t*)realloc(*sind, n_match*
sizeof(
size_t));
135 *eind = (
size_t*)realloc(*eind, n_match*
sizeof(
size_t));
138 for (i = 0; i < n_match; i++) {
139 (*sind)[i] = m[i].rm_so;
140 (*eind)[i] = m[i].rm_eo;
162 int regex_replace_nosub(
char *buf,
const size_t len_buf,
163 const char *re,
const char *rp,
164 const size_t nreplace) {
168 int ret = compile_regex(&r, re);
172 size_t len_rp = strlen(rp);
174 const size_t ngroups = r.re_nsub + 1;
175 regmatch_t *m = (regmatch_t*)malloc(ngroups *
sizeof(regmatch_t));
176 size_t len_m, rem_s, rem_l, delta_siz;
178 size_t cur_siz = strlen(buf);
181 if ((nreplace > 0) && (creplace >= nreplace)) {
182 printf(
"regex_replace_nosub: Maximum of %d replacements reached\n",
186 int nomatch = regexec(&r, p, ngroups, m, 0);
192 len_m = m[0].rm_eo - m[0].rm_so;
193 delta_siz = len_rp - len_m;
194 if ((cur_siz + delta_siz + 1) > len_buf) {
195 printf(
"regex_replace_nosub: Relacement will exceed buffer.\n");
200 rem_l = cur_siz - (cur_pos + m[0].rm_eo);
201 rem_s = m[0].rm_so + len_rp;
202 memmove(p + rem_s, p + m[0].rm_eo, rem_l + 1);
204 strncpy(p + m[0].rm_so, rp, len_rp);
208 cur_siz += delta_siz;
228 int get_subrefs(
const char *buf,
size_t **refs) {
231 int ret = compile_regex(&r,
"\\$([[:digit:]])");
235 const size_t ngroups = r.re_nsub + 1;
237 printf(
"ERROR: regex could not find subgroup\n");
241 regmatch_t *m = (regmatch_t*)malloc(ngroups *
sizeof(regmatch_t));
243 const size_t max_ref = 10;
245 uint8_t *ref_bytes = (uint8_t*)malloc((max_ref + 1)*
sizeof(uint8_t));
246 for (i = 0; i <= max_ref; i++)
250 const size_t max_grp = 2;
255 int nomatch = regexec(&r, p, ngroups, m, 0);
261 if ((m[1].rm_so == -1) && (m[1].rm_eo == -1)) {
266 igrp_len = m[1].rm_eo - m[1].rm_so;
267 if (igrp_len > max_grp) {
268 printf(
"Number longer than %d digits unlikely.\n", (
int)max_grp);
274 strncpy(igrp, p + m[1].rm_so, igrp_len);
278 if (iref > max_ref) {
279 printf(
"Reference to substr %d exceeds limit (%d)\n",
280 (
int)iref, (
int)max_ref);
291 for (i = 0; i <= max_ref; i++) {
295 *refs = (
size_t*)realloc(*refs, nref*
sizeof(
size_t));
297 for (i = 0, ir = 0; i <= max_ref; i++) {
325 int regex_replace_sub(
char *buf,
const size_t len_buf,
326 const char *re,
const char *rp,
327 const size_t nreplace) {
330 int ret = compile_regex(&r, re);
335 const size_t ngroups = r.re_nsub + 1;
336 regmatch_t *m = (regmatch_t*)malloc(ngroups *
sizeof(regmatch_t));
337 char rp_sub[2*len_buf];
338 char re_sub[len_buf];
340 size_t len_m, rem_s, rem_l, delta_siz, len_rp;
342 size_t cur_siz = strlen(buf);
347 if ((nreplace > 0) && (creplace >= nreplace)) {
348 printf(
"regex_replace_nosub: Maximum of %d replacements reached\n",
352 int nomatch = regexec(&r, p, ngroups, m, 0);
359 int nref = get_subrefs(rp, &refs);
361 printf(
"Error gettings subrefs\n");
368 for (j = 0; j < nref; j++) {
370 strcpy(igrp, p + m[i].rm_so);
371 igrp[m[i].rm_eo - m[i].rm_so] = 0;
372 sprintf(re_sub,
"\\$%d", (
int)i);
373 ret = regex_replace_nosub(rp_sub, 2*len_buf, re_sub, igrp, 0);
375 printf(
"regex_replace_sub: Error replacing substring $%d.\n", (
int)i);
383 len_m = m[0].rm_eo - m[0].rm_so;
384 delta_siz = len_rp - len_m;
385 if ((cur_siz + delta_siz + 1) > len_buf) {
386 printf(
"regex_replace_sub: Relacement will exceed buffer.\n");
392 rem_l = cur_siz - (cur_pos + m[0].rm_eo);
393 rem_s = m[0].rm_so + len_rp;
394 memmove(p + rem_s, p + m[0].rm_eo, rem_l + 1);
396 strncpy(p + m[0].rm_so, rp_sub, len_rp);
398 p += m[0].rm_so + len_rp;
399 cur_pos += m[0].rm_so + len_rp;
400 cur_siz += delta_siz;