summaryrefslogtreecommitdiff
path: root/source4/heimdal/lib/wind/normalize.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/heimdal/lib/wind/normalize.c')
-rw-r--r--source4/heimdal/lib/wind/normalize.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/source4/heimdal/lib/wind/normalize.c b/source4/heimdal/lib/wind/normalize.c
index 102c577e66..3c68ea8660 100644
--- a/source4/heimdal/lib/wind/normalize.c
+++ b/source4/heimdal/lib/wind/normalize.c
@@ -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;
}
}