From 2eaf5d90526ed09fbcd39c23a953efa726746746 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Thu, 12 Feb 2015 01:40:45 +0100 Subject: [PATCH] add some missing type conversions to make h_read_bits work with count>32 --- src/bitreader.c | 4 ++-- src/t_regression.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/bitreader.c b/src/bitreader.c index 3627df5d..fe21e439 100644 --- a/src/bitreader.c +++ b/src/bitreader.c @@ -62,7 +62,7 @@ int64_t h_read_bits(HInputStream* state, int count, char signed_p) { int i; for (i = 0; count > 0; i += 8) { count -= 8; - out |= state->input[state->index++] << i; + out |= (int64_t)state->input[state->index++] << i; } } } else { @@ -99,7 +99,7 @@ int64_t h_read_bits(HInputStream* state, int count, char signed_p) { if (state->endianness & BYTE_BIG_ENDIAN) { out = out << segment_len | segment; } else { // BYTE_LITTLE_ENDIAN - out |= segment << offset; + out |= (int64_t)segment << offset; offset += segment_len; } count -= segment_len; diff --git a/src/t_regression.c b/src/t_regression.c index e342546c..d05cbde0 100644 --- a/src/t_regression.c +++ b/src/t_regression.c @@ -54,7 +54,49 @@ static void test_seq_index_path(void) { g_check_cmp_int64(h_seq_index_path(seq, 0, 1, -1)->uint, ==, 42); } +#define MK_INPUT_STREAM(buf,len,endianness_) \ + { \ + .input = (uint8_t*)buf, \ + .length = len, \ + .index = 0, \ + .bit_offset = 0, \ + .endianness = endianness_ \ + } + +static void test_read_bits_48(void) { + { + HInputStream is = MK_INPUT_STREAM("\x12\x34\x56\x78\x9A\xBC", 6, BIT_LITTLE_ENDIAN | BYTE_LITTLE_ENDIAN); + g_check_cmp_int64(h_read_bits(&is, 32, false), ==, 0x78563412); + g_check_cmp_int64(h_read_bits(&is, 16, false), ==, 0xBC9A); + } + { + HInputStream is = MK_INPUT_STREAM("\x12\x34\x56\x78\x9A\xBC", 6, BIT_LITTLE_ENDIAN | BYTE_LITTLE_ENDIAN); + g_check_cmp_int64(h_read_bits(&is, 31, false), ==, 0x78563412); + g_check_cmp_int64(h_read_bits(&is, 17, false), ==, 0x17934); + } + { + HInputStream is = MK_INPUT_STREAM("\x12\x34\x56\x78\x9A\xBC", 6, BIT_LITTLE_ENDIAN | BYTE_LITTLE_ENDIAN); + g_check_cmp_int64(h_read_bits(&is, 33, false), ==, 0x78563412); + g_check_cmp_int64(h_read_bits(&is, 17, false), ==, 0x5E4D); + } + { + HInputStream is = MK_INPUT_STREAM("\x12\x34\x56\x78\x9A\xBC", 6, BIT_LITTLE_ENDIAN | BYTE_LITTLE_ENDIAN); + g_check_cmp_int64(h_read_bits(&is, 36, false), ==, 0xA78563412); + g_check_cmp_int64(h_read_bits(&is, 12, false), ==, 0xBC9); + } + { + HInputStream is = MK_INPUT_STREAM("\x12\x34\x56\x78\x9A\xBC", 6, BIT_LITTLE_ENDIAN | BYTE_LITTLE_ENDIAN); + g_check_cmp_int64(h_read_bits(&is, 40, false), ==, 0x9A78563412); + g_check_cmp_int64(h_read_bits(&is, 8, false), ==, 0xBC); + } + { + HInputStream is = MK_INPUT_STREAM("\x12\x34\x56\x78\x9A\xBC", 6, BIT_LITTLE_ENDIAN | BYTE_LITTLE_ENDIAN); + g_check_cmp_int64(h_read_bits(&is, 48, false), ==, 0xBC9A78563412); + } +} + void register_regression_tests(void) { g_test_add_func("/core/regression/bug118", test_bug118); g_test_add_func("/core/regression/seq_index_path", test_seq_index_path); + g_test_add_func("/core/regression/read_bits_48", test_read_bits_48); } -- GitLab