DUK_LOCAL duk_uint32_t duk__append_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) { duk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH]; duk_small_int_t len; len = duk_unicode_encode_xutf8((duk_ucodepoint_t) x, buf); DUK_BW_WRITE_ENSURE_BYTES(re_ctx->thr, &re_ctx->bw, buf, len); return (duk_uint32_t) len; }
size_t duk_hbuffer_insert_xutf8(duk_hthread *thr, duk_hbuffer_dynamic *buf, size_t offset, duk_uint32_t codepoint) { duk_uint8_t tmp[DUK_UNICODE_MAX_XUTF8_LENGTH]; size_t len; DUK_ASSERT(thr != NULL); DUK_ASSERT(buf != NULL); DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); /* No range assertion for 'codepoint' */ /* Intentionally no fast path: insertion is not that central */ /* FIXME: cp -> duk_codepoint_t */ len = (size_t) duk_unicode_encode_xutf8((duk_ucodepoint_t) codepoint, tmp); duk_hbuffer_insert_bytes(thr, buf, offset, tmp, len); return len; }
size_t duk_hbuffer_append_xutf8(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_uint32_t codepoint) { duk_uint8_t tmp[DUK_UNICODE_MAX_XUTF8_LENGTH]; size_t len; DUK_ASSERT(thr != NULL); DUK_ASSERT(buf != NULL); DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf)); /* No range assertion for 'codepoint' */ if (codepoint < 0x80 && DUK_HBUFFER_DYNAMIC_GET_SPARE_SIZE(buf) > 0) { /* fast path: ASCII and there is spare */ duk_uint8_t *p = ((duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_CURR_DATA_PTR(buf)) + DUK_HBUFFER_GET_SIZE(buf); *p = (duk_uint8_t) codepoint; buf->size += 1; return 1; } /* FIXME: cp -> duk_codepoint_t */ len = (size_t) duk_unicode_encode_xutf8((duk_ucodepoint_t) codepoint, tmp); duk_hbuffer_insert_bytes(thr, buf, DUK_HBUFFER_GET_SIZE(buf), tmp, len); return len; }