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