diff options
-rw-r--r-- | eval.c | 1 | ||||
-rw-r--r-- | lib.c | 19 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | stdlib/doc-syms.tl | 1 | ||||
-rw-r--r-- | txr.1 | 20 |
5 files changed, 42 insertions, 0 deletions
@@ -7144,6 +7144,7 @@ void eval_init(void) reg_fun(intern(lit("upcase-str"), user_package), func_n1(upcase_str)); reg_fun(intern(lit("downcase-str"), user_package), func_n1(downcase_str)); reg_fun(intern(lit("string-extend"), user_package), func_n3o(string_extend, 2)); + reg_fun(intern(lit("string-finish"), user_package), func_n1(string_finish)); reg_fun(intern(lit("stringp"), user_package), func_n1(stringp)); reg_fun(intern(lit("lazy-stringp"), user_package), func_n1(lazy_stringp)); reg_fun(intern(lit("length-str"), user_package), func_n1(length_str)); @@ -4843,6 +4843,25 @@ val string_extend(val str, val tail, val finish_in) return str; } +val string_finish(val str) +{ + val self = lit("string-finish"); + type_check(self, str, STR); + + { + cnum len = c_fixnum(length_str(str), self); + cnum alloc = c_fixnum(str->st.alloc, self); + + if (alloc > len + 1) { + alloc = len + 1; + str->st.str = chk_wrealloc(str->st.str, alloc); + set(mkloc(str->st.alloc, str), num_fast(alloc)); + } + } + + return str; +} + val stringp(val str) { switch (type(str)) { @@ -885,6 +885,7 @@ val copy_str(val str); val upcase_str(val str); val downcase_str(val str); val string_extend(val str, val tail, val finish); +val string_finish(val str); val stringp(val str); val lazy_stringp(val str); val length_str(val str); diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl index 8284884b..2f95f333 100644 --- a/stdlib/doc-syms.tl +++ b/stdlib/doc-syms.tl @@ -1819,6 +1819,7 @@ ("string-decode" "N-033502F8") ("string-encode" "N-033502F8") ("string-extend" "N-03D5358A") + ("string-finish" "N-0295275B") ("string-lt" "N-03ABBED1") ("stringp" "N-00BB392B") ("strsignal" "N-00234BED") @@ -24339,6 +24339,26 @@ allocation intended to improves the performance of subsequent .code string-extend calls. +.coNP Function @ string-finish +.synb +.mets (string-finish << string ) +.syne +.desc +The +.code string-finish +function removes excess allocation from +.meta string +that may have been produced by previous calls to +.codn string-extend . + +Note: if the most recent call to string +.code string-extend +specified a true value for the +.meta final +parameter, then calling +.code string-finish +is unnecessary and does nothing. + .coNP Function @ stringp .synb .mets (stringp << obj ) |