From 144c8eaeb8b593560ee418e40567a3e79f6537d2 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 20 Feb 2026 00:08:11 -0500 Subject: Fix has_extension() logic --- src/stdlib/paths.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/stdlib') diff --git a/src/stdlib/paths.c b/src/stdlib/paths.c index 9d1fad9c..92f40bcf 100644 --- a/src/stdlib/paths.c +++ b/src/stdlib/paths.c @@ -704,10 +704,19 @@ bool Path$has_extension(Path_t path, Text_t extension) { const char *end = strchrnul(base, '/'); int64_t base_len = (int64_t)(end - base); if (base_len <= 0) return false; - if (extension.length == 0) return strchr(base, '.') == NULL; - if (1 + 1 + extension.length > base_len) return false; - return base[base_len - 1 - extension.length] == '.' - && strncmp(base + base_len - extension.length, Text$as_c_string(extension), extension.length) == 0; + if (extension.length == 0) { + const char *dot = strrchr(base, '.'); + return dot == NULL || dot[1] == '\0' || dot == base; + } + const char *ext = Text$as_c_string(extension); + if (ext[0] == '.') { + if (1 + extension.length > base_len) return false; + return strncmp(base + base_len - extension.length, ext, extension.length) == 0; + } else { + if (1 + 1 + extension.length > base_len) return false; + return base[base_len - 1 - extension.length] == '.' + && strncmp(base + base_len - extension.length, ext, extension.length) == 0; + } } public -- cgit v1.2.3