21 int compile_regex (regex_t * r,
const char * regex_text)
23 int status = regcomp (r, regex_text, REG_EXTENDED);
25 char error_message[2048];
26 regerror (status, r, error_message, 2048);
27 printf (
"Regex error compiling '%s': %s\n",
28 regex_text, error_message);
44 int count_matches(
const char *regex_text,
const char *to_match) {
49 ret = compile_regex(&r, regex_text);
53 const char * p = to_match;
54 const size_t n_sub_matches = 10;
55 regmatch_t m[n_sub_matches];
57 int nomatch = regexec(&r, p, n_sub_matches, m, 0);
80 int find_match(
const char *regex_text,
const char *to_match,
81 size_t *sind,
size_t *eind) {
86 ret = compile_regex(&r, regex_text);
90 const char * p = to_match;
91 const size_t n_sub_matches = 10;
92 regmatch_t m[n_sub_matches];
93 int nomatch = regexec(&r, p, n_sub_matches, m, 0);
116 int find_matches(
const char *regex_text,
const char *to_match,
117 size_t **sind,
size_t **eind) {
122 ret = compile_regex(&r, regex_text);
126 const size_t n_sub_matches = 50;
127 regmatch_t m[n_sub_matches];
128 int nomatch = regexec(&r, to_match, n_sub_matches, m, 0);
131 while (n_match < n_sub_matches) {
132 if ((m[n_match].rm_so == -1) && (m[n_match].rm_eo == -1)) {
138 *sind = (
size_t*)realloc(*sind, n_match*
sizeof(
size_t));
139 *eind = (
size_t*)realloc(*eind, n_match*
sizeof(
size_t));
142 for (i = 0; i < n_match; i++) {
143 (*sind)[i] = m[i].rm_so;
144 (*eind)[i] = m[i].rm_eo;
166 int regex_replace_nosub(
char *buf,
const size_t len_buf,
167 const char *re,
const char *rp,
168 const size_t nreplace) {
172 int ret = compile_regex(&r, re);
176 size_t len_rp = strlen(rp);
178 const size_t ngroups = r.re_nsub + 1;
179 regmatch_t *m = (regmatch_t*)malloc(ngroups *
sizeof(regmatch_t));
180 size_t len_m, rem_s, rem_l, delta_siz;
182 size_t cur_siz = strlen(buf);
185 if ((nreplace > 0) && (creplace >= nreplace)) {
186 printf(
"regex_replace_nosub: Maximum of %d replacements reached\n",
190 int nomatch = regexec(&r, p, ngroups, m, 0);
196 len_m = m[0].rm_eo - m[0].rm_so;
197 delta_siz = len_rp - len_m;
198 if ((cur_siz + delta_siz + 1) > len_buf) {
199 printf(
"regex_replace_nosub: Relacement will exceed buffer.\n");
204 rem_l = cur_siz - (cur_pos + m[0].rm_eo);
205 rem_s = m[0].rm_so + len_rp;
206 memmove(p + rem_s, p + m[0].rm_eo, rem_l + 1);
208 strncpy(p + m[0].rm_so, rp, len_rp);
212 cur_siz += delta_siz;
232 int get_subrefs(
const char *buf,
size_t **refs) {
235 int ret = compile_regex(&r,
"\\$([[:digit:]])");
239 const size_t ngroups = r.re_nsub + 1;
241 printf(
"ERROR: regex could not find subgroup\n");
245 regmatch_t *m = (regmatch_t*)malloc(ngroups *
sizeof(regmatch_t));
247 const size_t max_ref = 10;
249 uint8_t *ref_bytes = (uint8_t*)malloc((max_ref + 1)*
sizeof(uint8_t));
250 for (i = 0; i <= max_ref; i++)
254 const size_t max_grp = 2;
259 int nomatch = regexec(&r, p, ngroups, m, 0);
265 if ((m[1].rm_so == -1) && (m[1].rm_eo == -1)) {
270 igrp_len = m[1].rm_eo - m[1].rm_so;
271 if (igrp_len > max_grp) {
272 printf(
"Number longer than %d digits unlikely.\n", (
int)max_grp);
278 strncpy(igrp, p + m[1].rm_so, igrp_len);
282 if (iref > max_ref) {
283 printf(
"Reference to substr %d exceeds limit (%d)\n",
284 (
int)iref, (
int)max_ref);
295 for (i = 0; i <= max_ref; i++) {
299 *refs = (
size_t*)realloc(*refs, nref*
sizeof(
size_t));
301 for (i = 0, ir = 0; i <= max_ref; i++) {
329 int regex_replace_sub(
char *buf,
const size_t len_buf,
330 const char *re,
const char *rp,
331 const size_t nreplace) {
334 int ret = compile_regex(&r, re);
339 const size_t ngroups = r.re_nsub + 1;
340 regmatch_t *m = (regmatch_t*)malloc(ngroups *
sizeof(regmatch_t));
341 char rp_sub[2*len_buf];
342 char re_sub[len_buf];
344 size_t len_m, rem_s, rem_l, delta_siz, len_rp;
346 size_t cur_siz = strlen(buf);
351 if ((nreplace > 0) && (creplace >= nreplace)) {
352 printf(
"regex_replace_nosub: Maximum of %d replacements reached\n",
356 int nomatch = regexec(&r, p, ngroups, m, 0);
363 int nref = get_subrefs(rp, &refs);
365 printf(
"Error gettings subrefs\n");
372 for (j = 0; j < nref; j++) {
374 strcpy(igrp, p + m[i].rm_so);
375 igrp[m[i].rm_eo - m[i].rm_so] = 0;
376 sprintf(re_sub,
"\\$%d", (
int)i);
377 ret = regex_replace_nosub(rp_sub, 2*len_buf, re_sub, igrp, 0);
379 printf(
"regex_replace_sub: Error replacing substring $%d.\n", (
int)i);
387 len_m = m[0].rm_eo - m[0].rm_so;
388 delta_siz = len_rp - len_m;
389 if ((cur_siz + delta_siz + 1) > len_buf) {
390 printf(
"regex_replace_sub: Relacement will exceed buffer.\n");
396 rem_l = cur_siz - (cur_pos + m[0].rm_eo);
397 rem_s = m[0].rm_so + len_rp;
398 memmove(p + rem_s, p + m[0].rm_eo, rem_l + 1);
400 strncpy(p + m[0].rm_so, rp_sub, len_rp);
402 p += m[0].rm_so + len_rp;
403 cur_pos += m[0].rm_so + len_rp;
404 cur_siz += delta_siz;