diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2025-03-31 02:17:47 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2025-03-31 02:17:47 -0400 |
| commit | da94f2bc8ceadcec014d8e5b4819f96ab34fecfb (patch) | |
| tree | 6407807a56c30148d2d250226809d1075be83afa /src/stdlib/patterns.c | |
| parent | 7a172be6213839a3d023ba21c3bafd7540a4bfe8 (diff) | |
Move pattern code into patterns file
Diffstat (limited to 'src/stdlib/patterns.c')
| -rw-r--r-- | src/stdlib/patterns.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/stdlib/patterns.c b/src/stdlib/patterns.c index 07a17afb..e274cba9 100644 --- a/src/stdlib/patterns.c +++ b/src/stdlib/patterns.c @@ -1251,6 +1251,26 @@ public Closure_t Text$by_split(Text_t text, Pattern_t pattern) }; } +public Pattern_t Pattern$escape_text(Text_t text) +{ + // TODO: optimize for spans of non-escaped text + Text_t ret = EMPTY_TEXT; + TextIter_t state = NEW_TEXT_ITER_STATE(text); + for (int64_t i = 0; i < text.length; i++) { + uint32_t g = Text$get_main_grapheme_fast(&state, i); + if (g == '{') { + ret = Text$concat(ret, Text("{1{}")); + } else if (g == '?' + || uc_is_property_quotation_mark(g) + || (uc_is_property_paired_punctuation(g) && uc_is_property_left_of_pair(g))) { + ret = Text$concat(ret, Text("{1"), Text$slice(text, I(i+1), I(i+1)), Text("}")); + } else { + ret = Text$concat(ret, Text$slice(text, I(i+1), I(i+1))); + } + } + return ret; +} + public const TypeInfo_t Pattern$info = { .size=sizeof(Pattern_t), .align=__alignof__(Pattern_t), |
