Example #1
0
void test_nghttp2_bufs_orb(void)
{
  int rv;
  nghttp2_bufs bufs;

  rv = nghttp2_bufs_init(&bufs, 1000, 3);
  CU_ASSERT(0 == rv);

  *(bufs.cur->buf.last) = 0;

  rv = nghttp2_bufs_orb_hold(&bufs, 15);
  CU_ASSERT(0 == rv);
  CU_ASSERT(0 == nghttp2_buf_len(&bufs.cur->buf));
  CU_ASSERT(0 == nghttp2_bufs_len(&bufs));
  CU_ASSERT(15 == *(bufs.cur->buf.last));

  rv = nghttp2_bufs_orb(&bufs, 240);
  CU_ASSERT(0 == rv);
  CU_ASSERT(1 == nghttp2_buf_len(&bufs.cur->buf));
  CU_ASSERT(1 == nghttp2_bufs_len(&bufs));
  CU_ASSERT(255 == *(bufs.cur->buf.last - 1));

  *(bufs.cur->buf.last) = 0;
  nghttp2_bufs_fast_orb_hold(&bufs, 240);
  CU_ASSERT(240 == *(bufs.cur->buf.last));

  nghttp2_bufs_fast_orb(&bufs, 15);
  CU_ASSERT(255 == *(bufs.cur->buf.last - 1));

  nghttp2_bufs_free(&bufs);
}
Example #2
0
/*
 * Encodes huffman code |sym| into |*dest_ptr|, whose least |rembits|
 * bits are not filled yet.  The |rembits| must be in range [1, 8],
 * inclusive.  At the end of the process, the |*dest_ptr| is updated
 * and points where next output should be placed. The number of
 * unfilled bits in the pointed location is returned.
 */
static ssize_t huff_encode_sym(nghttp2_bufs *bufs, size_t *avail_ptr,
                               size_t rembits, const nghttp2_huff_sym *sym) {
  int rv;
  size_t nbits = sym->nbits;
  uint32_t code = sym->code;

  /* We assume that sym->nbits <= 32 */
  if (rembits > nbits) {
    nghttp2_bufs_fast_orb_hold(bufs, code << (rembits - nbits));
    return (ssize_t)(rembits - nbits);
  }

  if (rembits == nbits) {
    nghttp2_bufs_fast_orb(bufs, code);
    --*avail_ptr;
    return 8;
  }

  nghttp2_bufs_fast_orb(bufs, code >> (nbits - rembits));
  --*avail_ptr;

  nbits -= rembits;
  if (nbits & 0x7) {
    /* align code to MSB byte boundary */
    code <<= 8 - (nbits & 0x7);
  }

  /* we lose at most 3 bytes, but it is not critical in practice */
  if (*avail_ptr < (nbits + 7) / 8) {
    rv = nghttp2_bufs_advance(bufs);
    if (rv != 0) {
      return rv;
    }
    *avail_ptr = nghttp2_bufs_cur_avail(bufs);
    /* we assume that we at least 3 buffer space available */
    assert(*avail_ptr >= 3);
  }

  /* fast path, since most code is less than 8 */
  if (nbits < 8) {
    nghttp2_bufs_fast_addb_hold(bufs, code);
    *avail_ptr = nghttp2_bufs_cur_avail(bufs);
    return (ssize_t)(8 - nbits);
  }

  /* handle longer code path */
  if (nbits > 24) {
    nghttp2_bufs_fast_addb(bufs, code >> 24);
    nbits -= 8;
  }