lib/wind: Canonical ordering can't use unstable sort
This commit is contained in:
@@ -164,13 +164,32 @@ compat_decomp(const uint32_t *in, size_t in_len,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static void
|
||||||
cc_cmp(const void *a, const void *b)
|
swap_char(uint32_t * a, uint32_t * b)
|
||||||
{
|
{
|
||||||
const uint32_t *ua = (const uint32_t *)a;
|
uint32_t t;
|
||||||
const uint32_t *ub = (const uint32_t *)b;
|
t = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = t;
|
||||||
|
}
|
||||||
|
|
||||||
return _wind_combining_class(*ua) - _wind_combining_class(*ub);
|
/* 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)
|
||||||
|
{
|
||||||
|
size_t i, j;
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
@@ -186,7 +205,7 @@ canonical_reorder(uint32_t *tmp, size_t tmp_len)
|
|||||||
j < tmp_len && _wind_combining_class(tmp[j]);
|
j < tmp_len && _wind_combining_class(tmp[j]);
|
||||||
++j)
|
++j)
|
||||||
;
|
;
|
||||||
qsort(&tmp[i], j - i, sizeof(tmp[0]), cc_cmp);
|
canonical_reorder_sequence(&tmp[i], j - i);
|
||||||
i = j;
|
i = j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user