in src/couch_quickjs/quickjs/libunicode.c [1513:1586]
static int unicode_prop_ops(CharRange *cr, ...)
{
va_list ap;
CharRange stack[POP_STACK_LEN_MAX];
int stack_len, op, ret, i;
uint32_t a;
va_start(ap, cr);
stack_len = 0;
for(;;) {
op = va_arg(ap, int);
switch(op) {
case POP_GC:
assert(stack_len < POP_STACK_LEN_MAX);
a = va_arg(ap, int);
cr_init(&stack[stack_len++], cr->mem_opaque, cr->realloc_func);
if (unicode_general_category1(&stack[stack_len - 1], a))
goto fail;
break;
case POP_PROP:
assert(stack_len < POP_STACK_LEN_MAX);
a = va_arg(ap, int);
cr_init(&stack[stack_len++], cr->mem_opaque, cr->realloc_func);
if (unicode_prop1(&stack[stack_len - 1], a))
goto fail;
break;
case POP_CASE:
assert(stack_len < POP_STACK_LEN_MAX);
a = va_arg(ap, int);
cr_init(&stack[stack_len++], cr->mem_opaque, cr->realloc_func);
if (unicode_case1(&stack[stack_len - 1], a))
goto fail;
break;
case POP_UNION:
case POP_INTER:
case POP_XOR:
{
CharRange *cr1, *cr2, *cr3;
assert(stack_len >= 2);
assert(stack_len < POP_STACK_LEN_MAX);
cr1 = &stack[stack_len - 2];
cr2 = &stack[stack_len - 1];
cr3 = &stack[stack_len++];
cr_init(cr3, cr->mem_opaque, cr->realloc_func);
if (cr_op(cr3, cr1->points, cr1->len,
cr2->points, cr2->len, op - POP_UNION + CR_OP_UNION))
goto fail;
cr_free(cr1);
cr_free(cr2);
*cr1 = *cr3;
stack_len -= 2;
}
break;
case POP_INVERT:
assert(stack_len >= 1);
if (cr_invert(&stack[stack_len - 1]))
goto fail;
break;
case POP_END:
goto done;
default:
abort();
}
}
done:
assert(stack_len == 1);
ret = cr_copy(cr, &stack[0]);
cr_free(&stack[0]);
return ret;
fail:
for(i = 0; i < stack_len; i++)
cr_free(&stack[i]);
return -1;
}