Ejemplo n.º 1
0
static int
cc_cmp(const void *a, const void *b)
{
    const uint32_t *ua = (const uint32_t *)a;
    const uint32_t *ub = (const uint32_t *)b;

    return _wind_combining_class(*ua) - _wind_combining_class(*ub);
}
Ejemplo n.º 2
0
/* 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]);
    }
}
Ejemplo n.º 3
0
static int
combine(const uint32_t *in, size_t in_len,
	uint32_t *out, size_t *out_len)
{
    unsigned i;
    int ostarter;
    unsigned o = 0;
    int old_cc;

    for (i = 0; i < in_len;) {
	while (i < in_len && _wind_combining_class(in[i]) != 0) {
	    out[o++] = in[i++];
	}
	if (i < in_len) {
	    if (o >= *out_len)
		return WIND_ERR_OVERRUN;
	    ostarter = o;
	    out[o++] = in[i++];
	    old_cc   = -1;

	    while (i < in_len) {
		uint32_t comb;
		uint32_t v[2];
		int cc;

		v[0] = out[ostarter];
		v[1] = in[i];

		cc = _wind_combining_class(in[i]);
		if (old_cc != cc && (comb = find_composition(v, 2))) {
		    out[ostarter] = comb;
		} else if (cc == 0) {
		    break;
		} else {
		    if (o >= *out_len)
			return WIND_ERR_OVERRUN;
		    out[o++] = in[i];
		    old_cc   = cc;
		}
		++i;
	    }
	}
    }
    *out_len = o;
    return 0;
}
Ejemplo n.º 4
0
static void
canonical_reorder(uint32_t *tmp, size_t tmp_len)
{
    size_t i;

    for (i = 0; i < tmp_len; ++i) {
	int cc = _wind_combining_class(tmp[i]);
	if (cc) {
	    size_t j;
	    for (j = i + 1;
		 j < tmp_len && _wind_combining_class(tmp[j]);
		 ++j)
		;
	    canonical_reorder_sequence(&tmp[i], j - i);
	    i = j;
	}
    }
}
Ejemplo n.º 5
0
static void
canonical_reorder(uint32_t *tmp, size_t tmp_len)
{
    unsigned i;

    for (i = 0; i < tmp_len; ++i) {
	int cc = _wind_combining_class(tmp[i]);
	if (cc) {
	    size_t j;
	    for (j = i + 1;
		 j < tmp_len && _wind_combining_class(tmp[j]);
		 ++j)
		;
	    qsort(&tmp[i], j - i, sizeof(unsigned),
		  cc_cmp);
	    i = j;
	}
    }
}