/* * Bitstream encoder. */ #include "third_party/duktape/duk_internal.h" DUK_INTERNAL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits) { duk_uint8_t tmp; DUK_ASSERT(ctx != NULL); DUK_ASSERT(ctx->currbits < 8); /* This limitation would be fixable but adds unnecessary complexity. */ DUK_ASSERT(bits >= 1 && bits <= 24); ctx->currval = (ctx->currval << bits) | data; ctx->currbits += bits; while (ctx->currbits >= 8) { if (ctx->offset < ctx->length) { tmp = (duk_uint8_t) ((ctx->currval >> (ctx->currbits - 8)) & 0xff); ctx->data[ctx->offset++] = tmp; } else { /* If buffer has been exhausted, truncate bitstream */ ctx->truncated = 1; } ctx->currbits -= 8; } } DUK_INTERNAL void duk_be_finish(duk_bitencoder_ctx *ctx) { duk_small_int_t npad; DUK_ASSERT(ctx != NULL); DUK_ASSERT(ctx->currbits < 8); npad = (duk_small_int_t) (8 - ctx->currbits); if (npad > 0) { duk_be_encode(ctx, 0, npad); } DUK_ASSERT(ctx->currbits == 0); }