From bd2a07691df6beb2bbe480f856c3801a67f16d68 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 27 Sep 2022 17:19:59 +0200 Subject: [PATCH] Backport from xs. --- html.c | 6 +++--- xs_regex.h | 51 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/html.c b/html.c index 0d1c27a..7651a5b 100644 --- a/html.c +++ b/html.c @@ -21,7 +21,7 @@ d_char *not_really_markdown(char *content, d_char **f_content) /* global changes */ { /* backticks */ - xs *ml = xs_regex_matchall(wrk, "`[^`]+`"); + xs *ml = xs_regex_match(wrk, "`[^`]+`"); p = ml; while (xs_list_iter(&p, &v)) { @@ -34,7 +34,7 @@ d_char *not_really_markdown(char *content, d_char **f_content) { /* double asterisks */ - xs *ml = xs_regex_matchall(wrk, "\\*\\*[^\\*]+\\*\\*"); + xs *ml = xs_regex_match(wrk, "\\*\\*[^\\*]+\\*\\*"); p = ml; while (xs_list_iter(&p, &v)) { @@ -47,7 +47,7 @@ d_char *not_really_markdown(char *content, d_char **f_content) { /* single asterisks */ - xs *ml = xs_regex_matchall(wrk, "\\*[^\\*]+\\*"); + xs *ml = xs_regex_match(wrk, "\\*[^\\*]+\\*"); p = ml; while (xs_list_iter(&p, &v)) { diff --git a/xs_regex.h b/xs_regex.h index 75ccfc3..9221233 100644 --- a/xs_regex.h +++ b/xs_regex.h @@ -4,21 +4,23 @@ #define _XS_REGEX_H -d_char *xs_regex_match(char *str, char *rx, int count); -#define xs_regex_matchall(str, rx) xs_regex_match(str, rx, 0xfffffff) +d_char *xs_regex_split_n(const char *str, const char *rx, int count); +#define xs_regex_split(str, rx) xs_regex_split_n(str, rx, 0xfffffff) +d_char *xs_regex_match_n(const char *str, const char *rx, int count); +#define xs_regex_match(str, rx) xs_regex_match_n(str, rx, 0xfffffff) #ifdef XS_IMPLEMENTATION #include -d_char *xs_regex_match(char *str, char *rx, int count) -/* returns a list with upto count matches */ +d_char *xs_regex_split_n(const char *str, const char *rx, int count) +/* splits str by regex */ { regex_t re; regmatch_t rm; - d_char *list = NULL; int offset = 0; - char *p; + d_char *list = NULL; + const char *p; if (regcomp(&re, rx, REG_EXTENDED)) return NULL; @@ -26,22 +28,51 @@ d_char *xs_regex_match(char *str, char *rx, int count) list = xs_list_new(); while (count > 0 && !regexec(&re, (p = str + offset), 1, &rm, offset > 0 ? REG_NOTBOL : 0)) { - /* add the first part */ - list = xs_list_append_m(list, p + rm.rm_so, rm.rm_eo - rm.rm_so); - - /* add the asciiz */ + /* add first the leading part of the string */ + list = xs_list_append_m(list, p, rm.rm_so); list = xs_str_cat(list, ""); + /* add now the matched text as the separator */ + list = xs_list_append_m(list, p + rm.rm_so, rm.rm_eo - rm.rm_so); + list = xs_str_cat(list, ""); + + /* move forward */ offset += rm.rm_eo; count--; } + /* add the rest of the string */ + list = xs_list_append(list, p); + regfree(&re); return list; } + +d_char *xs_regex_match_n(const char *str, const char *rx, int count) +/* returns a list with upto count matches */ +{ + d_char *list = xs_list_new(); + xs *split = NULL; + char *p, *v; + int n = 0; + + /* split */ + p = split = xs_regex_split_n(str, rx, count); + + /* now iterate to get only the 'separators' (odd ones) */ + while (xs_list_iter(&p, &v)) { + if (n & 0x1) + list = xs_list_append(list, v); + + n++; + } + + return list; +} + #endif /* XS_IMPLEMENTATION */ #endif /* XS_REGEX_H */