From 1ac9ce60b27157e014ed5b3c70548e6552608e48 Mon Sep 17 00:00:00 2001 From: Arne Goedeke <el@laramies.com> Date: Mon, 10 Jun 2013 00:18:21 +0200 Subject: [PATCH] use string range information to optimize utf8_to_string/string_to_utf8 --- src/builtin_functions.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/builtin_functions.c b/src/builtin_functions.c index 28451e5e5e..b24aed6030 100644 --- a/src/builtin_functions.c +++ b/src/builtin_functions.c @@ -1969,11 +1969,20 @@ PMOD_EXPORT void f_string_to_utf8(INT32 args) ptrdiff_t i,j; INT_TYPE extended = 0; PCHARP src; + INT32 min, max; get_all_args("string_to_utf8", args, "%W.%i", &in, &extended); len = in->len; + check_string_range(in, 1, &min, &max); + + if (min >= 0 && max <= 0x7f) { + /* 7bit string -- already valid utf8. */ + pop_n_elems(args - 1); + return; + } + for(i=0,src=MKPCHARP_STR(in); i < in->len; INC_PCHARP(src,1),i++) { unsigned INT32 c = EXTRACT_PCHARP(src); if (c & ~0x7f) { @@ -2115,9 +2124,18 @@ PMOD_EXPORT void f_utf8_to_string(INT32 args) int shift = 0; ptrdiff_t i,j=0; INT_TYPE extended = 0; + INT32 min, max; get_all_args("utf8_to_string", args, "%S.%i", &in, &extended); + check_string_range(in, 1, &min, &max); + + if (min >= 0 && max <= 0x7f) { + /* 7bit string -- already valid utf8. */ + pop_n_elems(args - 1); + return; + } + for(i=0; i < in->len; i++) { unsigned int c = STR0(in)[i]; len++; -- GitLab