string->nfd: also convert mutable strings already in NFD.
authorChris Hanson <org/chris-hanson/cph>
Fri, 21 Apr 2017 23:22:11 +0000 (16:22 -0700)
committerChris Hanson <org/chris-hanson/cph>
Fri, 21 Apr 2017 23:22:11 +0000 (16:22 -0700)
src/runtime/ustring.scm

index 02919b5717628912a04f187e98c0df47f76a26fd..ee7c65f6dc7f43edb04c9792f84ff606dbcb8c6c 100644 (file)
@@ -820,7 +820,17 @@ USA.
 
 (define (string->nfd string)
   (if (string-in-nfd? string)
-      string
+      (if (and (ustring? string) (not (ustring-mutable? string)))
+         string
+         (unpack-slice string
+           (lambda (string* start end)
+             (let ((result
+                    (immutable-ustring-allocate
+                     (fix:- end start)
+                     (%general-max-cp string* start end))))
+               (%general-copy! result 0 string* start end)
+               (ustring-in-nfd! result)
+               result))))
       (canonical-decomposition&ordering string
        (lambda (string* n max-cp)
          (let ((result (immutable-ustring-allocate n max-cp)))
@@ -834,9 +844,7 @@ USA.
             (ustring-nfd-qc? string 0 (ustring-length string))
             (ustring-in-nfd? string)))
        ((slice? string)
-        (ustring-nfd-qc? (slice-string string)
-                         (slice-start string)
-                         (slice-end string)))
+        (unpack-slice string ustring-nfd-qc?))
        (else
         (error:not-a string? string 'string-in-nfd?))))
 
@@ -909,9 +917,8 @@ USA.
                      (else
                       (loop (string-ref dm 0))
                       (append-char! (string-ref dm 1)))))))))
-    (let ((string ((builder 'build)))
-         (end ((builder 'count)))
-         (max-cp ((builder 'max-cp))))
+    (let* ((string ((builder 'build)))
+          (end (ustring-length string)))
 
       (define (scan-for-non-starter i)
        (if (fix:< i end)