]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/i18n/bocsu.cpp
ICU-531.30.tar.gz
[apple/icu.git] / icuSources / i18n / bocsu.cpp
index 6e771a88b8eb9585d5f7ca2d8ff4a9e6f3c852e3..cfc9816693bc9e0651abc78004877dde9444ade9 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-*   Copyright (C) 2001-2011, International Business Machines
+*   Copyright (C) 2001-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   file name:  bocsu.cpp
 #include "bocsu.h"
 
 /*
- * encode one difference value -0x10ffff..+0x10ffff in 1..3 bytes,
+ * encode one difference value -0x10ffff..+0x10ffff in 1..4 bytes,
  * preserving lexical order
  */
-U_CFUNC uint8_t *
+static uint8_t *
 u_writeDiff(int32_t diff, uint8_t *p) {
     if(diff>=SLOPE_REACH_NEG_1) {
         if(diff<=SLOPE_REACH_POS_1) {
@@ -95,12 +95,11 @@ u_writeDiff(int32_t diff, uint8_t *p) {
  * Note that the identical-level run in a sort key is generated from
  * NFD text - there are never Hangul characters included.
  */
-U_CFUNC void
-u_writeIdenticalLevelRun(const UChar *s, int32_t length, icu::ByteSink &sink) {
+U_CFUNC UChar32
+u_writeIdenticalLevelRun(UChar32 prev, const UChar *s, int32_t length, icu::ByteSink &sink) {
     char scratch[64];
     int32_t capacity;
 
-    UChar32 prev=0;
     int32_t i=0;
     while(i<length) {
         char *buffer=sink.GetAppendBuffer(1, length*2, scratch, (int32_t)sizeof(scratch), &capacity);
@@ -127,28 +126,17 @@ u_writeIdenticalLevelRun(const UChar *s, int32_t length, icu::ByteSink &sink) {
 
             UChar32 c;
             U16_NEXT(s, i, length, c);
-            p=u_writeDiff(c-prev, p);
-            prev=c;
+            if(c==0xfffe) {
+                *p++=2;  // merge separator
+                prev=0;
+            } else {
+                p=u_writeDiff(c-prev, p);
+                prev=c;
+            }
         }
         sink.Append(buffer, (int32_t)(p-reinterpret_cast<uint8_t *>(buffer)));
     }
-}
-
-U_CFUNC int32_t
-u_writeIdenticalLevelRunTwoChars(UChar32 first, UChar32 second, uint8_t *p) {
-    uint8_t *p0 = p;
-    if(first<0x4e00 || first>=0xa000) {
-        first=(first&~0x7f)-SLOPE_REACH_NEG_1;
-    } else {
-        /*
-         * Unihan U+4e00..U+9fa5:
-         * double-bytes down from the upper end
-         */
-        first=0x9fff-SLOPE_REACH_POS_2;
-    }
-
-    p=u_writeDiff(second-first, p);
-    return (int32_t)(p-p0);
+    return prev;
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */