From b669cf67883dcd16437a7e631bcb17e348bb5aed Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 22 Jul 2021 07:56:26 -0700 Subject: pure-rel-path-p: rewrite without regex. * stream.c (volume_name_p): New static function. (plp_regex): Static variable removed. (pure_rel_path_p): Rewrite using lower-level string manipulation, and using volume_name_p instead of a cached regex. (stream_init): Remove reference to plp_regex. --- stream.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/stream.c b/stream.c index 68ace85a..00e0228d 100644 --- a/stream.c +++ b/stream.c @@ -4913,6 +4913,19 @@ static val volume_prefix_p(const wchar_t *str) return nil; } +static val volume_name_p(const wchar_t *str) +{ + for (; *str; str++) { + if (iswalnum(*str)) + continue; + if (*str == ':') + return t; + break; + } + + return nil; +} + val portable_abs_path_p(val path) { val self = lit("portable-abs-path-p"); @@ -4942,30 +4955,24 @@ val abs_path_p(val path) return volume_prefix_p(str); } -static val plp_regex; - val pure_rel_path_p(val path) { - val ch; - val len = length_str(path); + val self = lit("pure-rel-path-p"); + const wchar_t *str = c_str(path, self); - if (len == zero) + if (str[0] == 0) return t; - if ((ch = chr_str(path, zero)) == chr('/') || ch == chr('\\')) + if (str[0] == '/' || str[0] == '\\') return nil; - if (len == one) - return ch == chr('.') ? nil : t; + if (str[1] == 0) + return str[0] == '.' ? nil : t; - if (ch == chr('.') && - ((ch = chr_str(path, one)) == chr('/') || ch == chr('\\'))) + if (str[0] == '.' && (str[1] == '/' || str[1] == '\\')) return nil; - if (!plp_regex) - plp_regex = regex_compile(lit("[A-Za-z0-9]+:"), nil); - - if (match_regex(path, plp_regex, zero)) + if (volume_name_p(str)) return nil; return t; @@ -5378,7 +5385,6 @@ void iobuf_list_empty(void) void stream_init(void) { - prot1(&plp_regex); prot1(&top_stderr); detect_format_string(); -- cgit v1.2.3