ref: 90fe198243e4d573baf7ba4839099a17bd6c266d
parent: 5a0a14decb8c3810e122396dcb7c6b4f5ee4f4f7
author: Sebastian Rasmussen <sebras@gmail.com>
date: Sun Apr 22 12:11:32 EDT 2018
jbig2dec: Return error code from get_next_word(). Previously Jbig2WordStream's get_next_word() callback sometimes returned error codes. This contradicted the declaration of the callback. However indicating errors and the number of bytes returned upon successful calls is a good idea. The declaration and all implementations of the callback have been adjusted accordingly. This means that jbig2dec now compiles without warnings.
--- a/jbig2.c
+++ b/jbig2.c
@@ -387,21 +387,37 @@
size_t size;
} Jbig2WordStreamBuf;
-static void
+static int
jbig2_word_stream_buf_get_next_word(Jbig2WordStream *self, size_t offset, uint32_t *word)
{
Jbig2WordStreamBuf *z = (Jbig2WordStreamBuf *) self;
const byte *data = z->data;
+ uint32_t val = 0;
+ int ret = 0;
- *word = 0;
- if (offset + 4 < z->size)
- *word = (data[offset] << 24) | (data[offset + 1] << 16) | (data[offset + 2] << 8) | data[offset + 3];
- else if (offset <= z->size) {
- size_t i;
+ if (self == NULL || word == NULL)
+ return -1;
+ if (offset >= z->size)
+ return 0;
- for (i = 0; i < z->size - offset; i++)
- *word |= data[offset + i] << ((3 - i) << 3);
+ if (offset < z->size) {
+ val |= data[offset] << 24;
+ ret++;
}
+ if (offset + 1 < z->size) {
+ val |= data[offset + 1] << 16;
+ ret++;
+ }
+ if (offset + 2 < z->size) {
+ val |= data[offset + 2] << 8;
+ ret++;
+ }
+ if (offset + 3 < z->size) {
+ val |= data[offset + 3];
+ ret++;
+ }
+ *word = val;
+ return ret;
}
Jbig2WordStream *
--- a/jbig2_arith.c
+++ b/jbig2_arith.c
@@ -332,21 +332,42 @@
#ifdef TEST
-static uint32_t
-test_get_word(Jbig2WordStream *self, int offset, uint32_t *word)
+const byte test_stream[] = {
+ 0x84, 0xC7, 0x3B, 0xFC, 0xE1, 0xA1, 0x43, 0x04, 0x02, 0x20, 0x00, 0x00,
+ 0x41, 0x0D, 0xBB, 0x86, 0xF4, 0x31, 0x7F, 0xFF, 0x88, 0xFF, 0x37, 0x47,
+ 0x1A, 0xDB, 0x6A, 0xDF, 0xFF, 0xAC,
+ 0x00, 0x00
+};
+
+static int
+test_get_word(Jbig2WordStream *self, size_t offset, uint32_t *word)
{
- byte stream[] = {
- 0x84, 0xC7, 0x3B, 0xFC, 0xE1, 0xA1, 0x43, 0x04, 0x02, 0x20, 0x00, 0x00,
- 0x41, 0x0D, 0xBB, 0x86, 0xF4, 0x31, 0x7F, 0xFF, 0x88, 0xFF, 0x37, 0x47,
- 0x1A, 0xDB, 0x6A, 0xDF, 0xFF, 0xAC,
- 0x00, 0x00
- };
- if (offset >= sizeof(stream))
- *word = 0;
- else
- *word = (stream[offset] << 24) | (stream[offset + 1] << 16) |
- (stream[offset + 2] << 8) | stream[offset + 3];
- return 0;
+ uint32_t val = 0;
+ int ret = 0;
+
+ if (self == NULL || word == NULL)
+ return -1;
+ if (offset >= sizeof (test_stream))
+ return -1;
+
+ if (offset < sizeof(test_stream)) {
+ val |= test_stream[offset] << 24;
+ ret++;
+ }
+ if (offset + 1 < sizeof(test_stream)) {
+ val |= test_stream[offset + 1] << 16;
+ ret++;
+ }
+ if (offset + 2 < sizeof(test_stream)) {
+ val |= test_stream[offset + 2] << 8;
+ ret++;
+ }
+ if (offset + 3 < sizeof(test_stream)) {
+ val |= test_stream[offset + 3];
+ ret++;
+ }
+ *word = val;
+ return ret;
}
int
--- a/jbig2_huffman.c
+++ b/jbig2_huffman.c
@@ -684,13 +684,34 @@
const byte test_tabindex[] = { 4, 2, 2, 1 };
static int
-test_get_word(Jbig2WordStream *self, int offset, uint32_t *word)
+test_get_word(Jbig2WordStream *self, size_t offset, uint32_t *word)
{
- /* assume test_stream[] is at least 4 bytes */
- if (offset + 3 > sizeof(test_stream))
+ uint32_t val = 0;
+ int ret = 0;
+
+ if (self == NULL || word == NULL)
return -1;
- *word = ((test_stream[offset] << 24) | (test_stream[offset + 1] << 16) | (test_stream[offset + 2] << 8) | (test_stream[offset + 3]));
- return 0;
+ if (offset >= sizeof (test_stream))
+ return 0;
+
+ if (offset < sizeof(test_stream)) {
+ val |= test_stream[offset] << 24;
+ ret++;
+ }
+ if (offset + 1 < sizeof(test_stream)) {
+ val |= test_stream[offset + 1] << 16;
+ ret++;
+ }
+ if (offset + 2 < sizeof(test_stream)) {
+ val |= test_stream[offset + 2] << 8;
+ ret++;
+ }
+ if (offset + 3 < sizeof(test_stream)) {
+ val |= test_stream[offset + 3];
+ ret++;
+ }
+ *word = val;
+ return ret;
}
int
@@ -1957,31 +1978,35 @@
} test_stream_t;
static int
-test_get_word(Jbig2WordStream *self, int offset, uint32_t *word)
+test_get_word(Jbig2WordStream *self, size_t offset, uint32_t *word)
{
- uint32_t val = 0;
test_stream_t *st = (test_stream_t *) self;
+ uint32_t val = 0;
+ int ret = 0;
- if (st != NULL) {
- if (st->h != NULL) {
- if (offset >= st->h->input_len)
- return -1;
- if (offset < st->h->input_len) {
- val |= (st->h->input[offset] << 24);
- }
- if (offset + 1 < st->h->input_len) {
- val |= (st->h->input[offset + 1] << 16);
- }
- if (offset + 2 < st->h->input_len) {
- val |= (st->h->input[offset + 2] << 8);
- }
- if (offset + 3 < st->h->input_len) {
- val |= st->h->input[offset + 3];
- }
- }
+ if (st == NULL || st->h == NULL || word == NULL)
+ return -1;
+ if (offset >= st->h->input_len)
+ return 0;
+
+ if (offset < st->h->input_len) {
+ val |= (st->h->input[offset] << 24);
+ ret++;
}
+ if (offset + 1 < st->h->input_len) {
+ val |= (st->h->input[offset + 1] << 16);
+ ret++;
+ }
+ if (offset + 2 < st->h->input_len) {
+ val |= (st->h->input[offset + 2] << 8);
+ ret++;
+ }
+ if (offset + 3 < st->h->input_len) {
+ val |= st->h->input[offset + 3];
+ ret++;
+ }
*word = val;
- return 0;
+ return ret;
}
int
--- a/jbig2_priv.h
+++ b/jbig2_priv.h
@@ -126,7 +126,7 @@
typedef struct _Jbig2WordStream Jbig2WordStream;
struct _Jbig2WordStream {
- void (*get_next_word)(Jbig2WordStream *self, size_t offset, uint32_t *word);
+ int (*get_next_word)(Jbig2WordStream *self, size_t offset, uint32_t *word);
};
Jbig2WordStream *jbig2_word_stream_buf_new(Jbig2Ctx *ctx, const byte *data, size_t size);