summaryrefslogtreecommitdiffstats
path: root/stream.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-06-22 19:33:16 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-06-22 19:33:16 -0700
commiteed035b792cb3b1b2723fa2b1ca0dd7fb5e5fe31 (patch)
tree8f451748a4826c95ed4996f434754a1bdb2befe6 /stream.c
parentb9db5d41cbf4ef8fe1c07bf0f43e01e42e632702 (diff)
downloadtxr-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.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/stream.c b/stream.c
index 00b4f8d8..6c6a6e65 100644
--- a/stream.c
+++ b/stream.c
@@ -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)