diff src/core/ngx_string.c @ 76:da9a3b14312d NGINX_0_1_38

nginx 0.1.38 *) Feature: the "limit_rate" directive is supported in in proxy and FastCGI mode. *) Feature: the "X-Accel-Limit-Rate" response header line is supported in proxy and FastCGI mode. *) Feature: the "break" directive. *) Feature: the "log_not_found" directive. *) Bugfix: the response status code was not changed when request was redirected by the ""X-Accel-Redirect" header line. *) Bugfix: the variables set by the "set" directive could not be used in SSI. *) Bugfix: the segmentation fault may occurred if the SSI page has more than one remote subrequest. *) Bugfix: nginx treated the backend response as invalid if the status line in the header was transferred in two packets; bug appeared in 0.1.29. *) Feature: the "ssi_types" directive. *) Feature: the "autoindex_exact_size" directive. *) Bugfix: the ngx_http_autoindex_module did not support the long file names in UTF-8. *) Feature: the IMAP/POP3 proxy.
author Igor Sysoev <http://sysoev.ru>
date Fri, 08 Jul 2005 00:00:00 +0400
parents 77969b24f355
children 45f7329b4bd0
line wrap: on
line diff
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -753,20 +753,62 @@ ngx_utf_length(ngx_str_t *utf)
             continue;
         }
 
-        if (c < 0xC0) {
-            /* invalid utf */
-            return utf->len;
+        if (c >= 0xc0) {
+            for (c <<= 1; c & 0x80; c <<= 1) {
+                i++;
+            }
+
+            continue;
         }
 
-        for (c <<= 1; c & 0x80; c <<= 1) {
-            i++;
-        }
+        /* invalid utf */
+
+        return utf->len;
     }
 
     return len;
 }
 
 
+u_char *
+ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n)
+{
+    u_char  c;
+
+    if (n == 0) {
+        return dst;
+    }
+
+    for ( /* void */ ; --n; dst++, src++) {
+
+        c = *src;
+        *dst = c;
+
+        if (c < 0x80) {
+            if (*dst != '\0') {
+                continue;
+            }
+
+            return dst;
+        }
+
+        if (c >= 0xc0) {
+            for (c <<= 1; c & 0x80; c <<= 1) {
+               *++dst = *++src;
+            }
+
+            continue;
+        }
+
+        /* invalid utf */
+    }
+
+    *dst = '\0';
+
+    return dst;
+}
+
+
 uintptr_t
 ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
 {