diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2026-02-20 00:08:11 -0500 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2026-02-20 00:08:11 -0500 |
| commit | 144c8eaeb8b593560ee418e40567a3e79f6537d2 (patch) | |
| tree | 5e196b88515363c5e5ad650540a475c9007b203c /src/stdlib | |
| parent | 99245c958d6077217e5e05749b0dd731b4e78d8e (diff) | |
Fix has_extension() logic
Diffstat (limited to 'src/stdlib')
| -rw-r--r-- | src/stdlib/paths.c | 17 |
1 files changed, 13 insertions, 4 deletions
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 |
