diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-09-03 00:36:10 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-09-03 00:36:10 -0400 |
| commit | 3df85ee6d8e26c6d69544be3352239c63108a554 (patch) | |
| tree | 6e539d94f7b0d3f2045b5d7213f35c8e7111f9a0 | |
| parent | 6c22999eded909b77b1d7718cf3f1dc969b55779 (diff) | |
Add [..int] and [..num]
| -rw-r--r-- | builtins/text.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/builtins/text.c b/builtins/text.c index 32eefd32..c4514892 100644 --- a/builtins/text.c +++ b/builtins/text.c @@ -835,7 +835,7 @@ const char *get_property_name(Text_t text, int64_t *i) if (success) text_index += 1; \ success; }) -#define EAT_MANY(state, cond) ({ int64_t n = 0; while (EAT1(state, cond)) { n += 1; } n; }) +#define EAT_MANY(state, cond) ({ int64_t _n = 0; while (EAT1(state, cond)) { _n += 1; } _n; }) int64_t match_email(Text_t text, int64_t text_index) { @@ -1102,6 +1102,12 @@ int64_t match(Text_t text, Text_t pattern, int64_t text_index, int64_t pattern_i FAIL(); EAT_MANY(&text_state, uc_is_property(grapheme, UC_PROPERTY_XID_CONTINUE)); continue; + } else if (prop_name && strcasecmp(prop_name, "int") == 0) { + EAT1(&text_state, grapheme == '-'); + int64_t n = EAT_MANY(&text_state, uc_is_property(grapheme, UC_PROPERTY_DECIMAL_DIGIT)); + if (n <= 0) + FAIL(); + continue; } else if (prop_name && strcasecmp(prop_name, "ipv4") == 0) { int64_t len = match_ipv4(text, text_index); if (len < 0) @@ -1124,6 +1130,17 @@ int64_t match(Text_t text, Text_t pattern, int64_t text_index, int64_t pattern_i continue; } break; + case 'n': + if (prop_name && strcasecmp(prop_name, "num") == 0) { + EAT1(&text_state, grapheme == '-'); + int64_t pre_decimal = EAT_MANY(&text_state, uc_is_property(grapheme, UC_PROPERTY_DECIMAL_DIGIT)); + bool decimal = (EAT1(&text_state, grapheme == '.') == 1); + int64_t post_decimal = decimal ? EAT_MANY(&text_state, uc_is_property(grapheme, UC_PROPERTY_DECIMAL_DIGIT)) : 0; + if (pre_decimal == 0 && post_decimal == 0) + FAIL(); + continue; + } + break; case 's': if (strcasecmp(prop_name, "start") == 0) { if (text_index != 0) return -1; |
