diff options
author | default <nobody@localhost> | 2022-09-27 17:19:59 +0200 |
---|---|---|
committer | default <nobody@localhost> | 2022-09-27 17:19:59 +0200 |
commit | bd2a07691df6beb2bbe480f856c3801a67f16d68 (patch) | |
tree | 670e003c571b6de1a563e0f85627d7c96eae7d65 /xs_regex.h | |
parent | 8ac32f0d8186dcac832b131cb9f322f6655014f3 (diff) |
Backport from xs.
Diffstat (limited to 'xs_regex.h')
-rw-r--r-- | xs_regex.h | 49 |
1 files changed, 40 insertions, 9 deletions
@@ -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 <regex.h> -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 first the leading part of the string */ + list = xs_list_append_m(list, p, rm.rm_so); + list = xs_str_cat(list, ""); - /* add the asciiz */ + /* 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 */ |