Lines Matching refs:wb

84 static idn_result_t	decompose(workbuf_t *wb, unsigned long c, int compat);
85 static void get_class(workbuf_t *wb);
86 static void reorder(workbuf_t *wb);
87 static void compose(workbuf_t *wb);
88 static idn_result_t flush_before_cur(workbuf_t *wb,
90 static void workbuf_init(workbuf_t *wb);
91 static void workbuf_free(workbuf_t *wb);
92 static idn_result_t workbuf_extend(workbuf_t *wb);
93 static idn_result_t workbuf_append(workbuf_t *wb, unsigned long c);
94 static void workbuf_shift(workbuf_t *wb, int shift);
95 static void workbuf_removevoid(workbuf_t *wb);
110 workbuf_t wb;
116 workbuf_init(&wb);
117 wb.version = version;
122 assert(wb.cur == wb.last);
132 if ((r = decompose(&wb, c, compat)) != idn_success)
138 get_class(&wb);
143 for (; wb.cur < wb.last; wb.cur++) {
144 if (wb.cur == 0) {
146 } else if (wb.class[wb.cur] > 0) {
152 reorder(&wb);
162 if (do_composition && wb.class[0] == 0)
163 compose(&wb);
172 if (wb.cur > 0 && wb.class[wb.cur] == 0) {
174 r = flush_before_cur(&wb, &to, &tolen);
182 if (do_composition && wb.cur > 0 && wb.class[0] == 0) {
191 wb.cur--;
192 compose(&wb);
193 wb.cur++;
199 r = flush_before_cur(&wb, &to, &tolen);
211 workbuf_free(&wb);
216 decompose(workbuf_t *wb, unsigned long c, int compat) {
221 r = idn__unicode_decompose(wb->version, compat, wb->ucs4 + wb->last,
222 wb->size - wb->last, c, &dec_len);
225 wb->last += dec_len;
228 return (workbuf_append(wb, c));
230 if ((r = workbuf_extend(wb)) != idn_success)
232 if (wb->size > WORKBUF_SIZE_MAX) {
245 get_class(workbuf_t *wb) {
248 for (i = wb->cur; i < wb->last; i++)
249 wb->class[i] = idn__unicode_canonicalclass(wb->version,
250 wb->ucs4[i]);
254 reorder(workbuf_t *wb) {
259 assert(wb != NULL);
261 i = wb->cur;
262 c = wb->ucs4[i];
263 class = wb->class[i];
265 while (i > 0 && wb->class[i - 1] > class) {
266 wb->ucs4[i] = wb->ucs4[i - 1];
267 wb->class[i] =wb->class[i - 1];
269 wb->ucs4[i] = c;
270 wb->class[i] = class;
275 compose(workbuf_t *wb) {
284 assert(wb != NULL && wb->class[0] == 0);
286 cur = wb->cur;
287 ucs4 = wb->ucs4;
288 class = wb->class;
289 ver = wb->version;
322 workbuf_removevoid(wb);
326 flush_before_cur(workbuf_t *wb, unsigned long **top, size_t *tolenp) {
327 if (*tolenp < wb->cur)
330 memcpy(*top, wb->ucs4, sizeof(**top) * wb->cur);
331 *top += wb->cur;
332 *tolenp -= wb->cur;
333 workbuf_shift(wb, wb->cur);
339 workbuf_init(workbuf_t *wb) {
340 wb->cur = 0;
341 wb->last = 0;
342 wb->size = WORKBUF_SIZE;
343 wb->ucs4 = wb->ucs4_buf;
344 wb->class = wb->class_buf;
348 workbuf_free(workbuf_t *wb) {
349 if (wb->ucs4 != wb->ucs4_buf) {
350 free(wb->ucs4);
351 free(wb->class);
356 workbuf_extend(workbuf_t *wb) {
357 int newsize = wb->size * 3;
359 if (wb->ucs4 == wb->ucs4_buf) {
360 wb->ucs4 = malloc(sizeof(wb->ucs4[0]) * newsize);
361 wb->class = malloc(sizeof(wb->class[0]) * newsize);
363 wb->ucs4 = realloc(wb->ucs4, sizeof(wb->ucs4[0]) * newsize);
364 wb->class = realloc(wb->class, sizeof(wb->class[0]) * newsize);
366 if (wb->ucs4 == NULL || wb->class == NULL)
373 workbuf_append(workbuf_t *wb, unsigned long c) {
376 if (wb->last >= wb->size && (r = workbuf_extend(wb)) != idn_success)
378 wb->ucs4[wb->last++] = c;
383 workbuf_shift(workbuf_t *wb, int shift) {
386 assert(wb != NULL && wb->cur >= shift);
388 nmove = wb->last - shift;
389 (void)memmove(&wb->ucs4[0], &wb->ucs4[shift],
390 nmove * sizeof(wb->ucs4[0]));
391 (void)memmove(&wb->class[0], &wb->class[shift],
392 nmove * sizeof(wb->class[0]));
393 wb->cur -= shift;
394 wb->last -= shift;
398 workbuf_removevoid(workbuf_t *wb) {
400 int last = wb->last;
403 if (wb->class[i] >= 0) {
405 wb->ucs4[j] = wb->ucs4[i];
406 wb->class[j] = wb->class[i];
411 wb->cur -= last - j;
412 wb->last = j;