diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-06-22 19:33:16 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-06-22 19:33:16 -0700 |
commit | eed035b792cb3b1b2723fa2b1ca0dd7fb5e5fe31 (patch) | |
tree | 8f451748a4826c95ed4996f434754a1bdb2befe6 /stream.c | |
parent | b9db5d41cbf4ef8fe1c07bf0f43e01e42e632702 (diff) | |
download | txr-eed035b792cb3b1b2723fa2b1ca0dd7fb5e5fe31.tar.gz txr-eed035b792cb3b1b2723fa2b1ca0dd7fb5e5fe31.tar.bz2 txr-eed035b792cb3b1b2723fa2b1ca0dd7fb5e5fe31.zip |
short-suffix, long-suffix: no match across slash.
* stream.c (short_suffix, long_suffix): Take path separator
characters into account; the suffix must not span across
separators. The trailing separator must also not appear in
the suffix.
* tests/018/path.tl: Test cases added.
* txr.1: Redocumented.
Diffstat (limited to 'stream.c')
-rw-r--r-- | stream.c | 32 |
1 files changed, 30 insertions, 2 deletions
@@ -5016,16 +5016,44 @@ val dir_name(val path) val short_suffix(val name, val alt_in) { + const wchar_t *psc = coerce(const wchar_t *, path_sep_chars); const wchar_t *str = c_str(name); const wchar_t *dot = wcsrchr(str, '.'); - return if3(dot, string(dot + 1), default_null_arg(alt_in)); + const wchar_t *sl = if3(dot, wcspbrk(dot + 1, psc), 0); + + if (!dot || (sl && sl[1])) { + return default_null_arg(alt_in); + } else { + wchar_t *suff = chk_strdup(dot + 1); + if (sl) + suff[sl - (dot + 1)] = 0; + return string_own(suff); + } } val long_suffix(val name, val alt_in) { + const wchar_t *psc = coerce(const wchar_t *, path_sep_chars); const wchar_t *str = c_str(name); const wchar_t *dot = wcschr(str, '.'); - return if3(dot, string(dot + 1), default_null_arg(alt_in)); + + { + const wchar_t *sl; + + while (dot && (sl = wcspbrk(dot, psc)) && sl[1]) { + dot = wcschr(sl + 1, '.'); + sl = wcspbrk(dot, psc); + } + + if (!dot || (sl && sl[1])) { + return default_null_arg(alt_in); + } else { + wchar_t *suff = chk_strdup(dot + 1); + if (sl) + suff[sl - (dot + 1)] = 0; + return string_own(suff); + } + } } val path_cat(val dir_name, val base_name) |