diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-05-20 06:19:06 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-05-20 06:19:06 -0700 |
commit | 8a6c4b6749a94b3adae46e20de577918ca9d8c59 (patch) | |
tree | 817e4f4d9debe2631c789bd5b96d02625afedfd4 /stream.c | |
parent | 2536072b64006004c2999005a1961025725f8bfa (diff) | |
download | txr-8a6c4b6749a94b3adae46e20de577918ca9d8c59.tar.gz txr-8a6c4b6749a94b3adae46e20de577918ca9d8c59.tar.bz2 txr-8a6c4b6749a94b3adae46e20de577918ca9d8c59.zip |
New function: trim-path-seps
* stream.c (trim_path_seps): New function.
(stream_init): trim-path-seps intrinsic registered.
* stream.c (trim_path_seps): Declared.
* tests/018/path.tl: New tests.
* txr.1: Documented.
* stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'stream.c')
-rw-r--r-- | stream.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -5236,6 +5236,24 @@ val trim_long_suffix(val name) } } +val trim_path_seps(val name) +{ + val self = lit("trim-path-seps"); + const wchar_t *str = c_str(name, self); + const wchar_t *psc = L"/\\"; + const wchar_t *fsl = 0; + cnum len = c_num(length_str(name), self); + + if (portable_abs_path_p(name)) + fsl = wcspbrk(str, psc); + + while (len-- > 0) + if (!wcschr(psc, str[len]) || str + len == fsl) + break; + + return string_own(chk_substrdup(str, 0, len + 1)); +} + val add_suffix(val name, val suffix) { val self = lit("add-suffix"); @@ -5604,6 +5622,7 @@ void stream_init(void) reg_fun(intern(lit("long-suffix"), user_package), func_n2o(long_suffix, 1)); reg_fun(intern(lit("trim-short-suffix"), user_package), func_n1(trim_short_suffix)); reg_fun(intern(lit("trim-long-suffix"), user_package), func_n1(trim_long_suffix)); + reg_fun(intern(lit("trim-path-seps"), user_package), func_n1(trim_path_seps)); reg_fun(intern(lit("path-cat"), user_package), func_n0v(path_vcat)); reg_fun(intern(lit("add-suffix"), user_package), func_n2(add_suffix)); reg_varl(intern(lit("path-sep-chars"), user_package), static_str(path_sep_chars)); |