s4:heimdal: import lorikeet-heimdal-201009250123 (commit 42cabfb5b683dbcb97d583c397b8...
[sfrench/samba-autobuild/.git] / source4 / heimdal / lib / wind / normalize.c
index 102c577e66455c993c5753024e4c24faadd2e4e2..3c68ea866007a174d4eb2e93d48f271c84f30e1d 100644 (file)
@@ -164,13 +164,32 @@ compat_decomp(const uint32_t *in, size_t in_len,
     return 0;
 }
 
-static int
-cc_cmp(const void *a, const void *b)
+static void
+swap_char(uint32_t * a, uint32_t * b)
+{
+    uint32_t t;
+    t = *a;
+    *a = *b;
+    *b = t;
+}
+
+/* Unicode 5.2.0 D109 Canonical Ordering for a sequence of code points
+ * that all have Canonical_Combining_Class > 0 */
+static void
+canonical_reorder_sequence(uint32_t * a, size_t len)
 {
-    const uint32_t *ua = (const uint32_t *)a;
-    const uint32_t *ub = (const uint32_t *)b;
+    size_t i, j;
 
-    return _wind_combining_class(*ua) - _wind_combining_class(*ub);
+    if (len <= 1)
+       return;
+
+    for (i = 1; i < len; i++) {
+       for (j = i;
+            j > 0 &&
+                _wind_combining_class(a[j]) < _wind_combining_class(a[j-1]);
+            j--)
+           swap_char(&a[j], &a[j-1]);
+    }
 }
 
 static void
@@ -186,7 +205,7 @@ canonical_reorder(uint32_t *tmp, size_t tmp_len)
                 j < tmp_len && _wind_combining_class(tmp[j]);
                 ++j)
                ;
-           qsort(&tmp[i], j - i, sizeof(tmp[0]), cc_cmp);
+           canonical_reorder_sequence(&tmp[i], j - i);
            i = j;
        }
     }