shithub: jbig2

Download patch

ref: 4f08ba8f347c51f7dd6467f03ab9947fc3fe19e8
parent: 31e0aec4ef57166e8cbdc549e92435bc487ba9bb
author: Sebastian Rasmussen <sebras@gmail.com>
date: Tue Apr 24 00:51:31 EDT 2018

jbig2dec: Enable both huffman tests when running check.

--- a/jbig2_huffman.c
+++ b/jbig2_huffman.c
@@ -713,11 +713,11 @@
    to use in decoding it. 1 = table B.1 (A), 2 = table B.2 (B), and so on */
 /* this test stream should decode to { 8, 5, oob, 8 } */
 
-const byte test_stream[] = { 0xe9, 0xcb, 0xf4, 0x00 };
-const byte test_tabindex[] = { 4, 2, 2, 1 };
+static const byte test_stream[] = { 0xe9, 0xcb, 0xf4, 0x00 };
+static const byte test_tabindex[] = { 4, 2, 2, 1 };
 
 static int
-test_get_word(Jbig2WordStream *self, size_t offset, uint32_t *word)
+test_get_word1(Jbig2WordStream *self, size_t offset, uint32_t *word)
 {
     uint32_t val = 0;
     int ret = 0;
@@ -747,8 +747,7 @@
     return ret;
 }
 
-int
-main(int argc, char **argv)
+static int test1()
 {
     Jbig2Ctx *ctx;
     Jbig2HuffmanTable *tables[5];
@@ -756,8 +755,14 @@
     Jbig2WordStream ws;
     bool oob;
     int32_t code;
+    int i;
+    int success = 0;
 
     ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);
+    if (ctx == NULL) {
+        fprintf(stderr, "Failed to allocate jbig2 context\n");
+        goto cleanup;
+    }
 
     tables[0] = NULL;
     tables[1] = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_A);
@@ -764,8 +769,18 @@
     tables[2] = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_B);
     tables[3] = NULL;
     tables[4] = jbig2_build_huffman_table(ctx, &jbig2_huffman_params_D);
-    ws.get_next_word = test_get_word;
+    if (tables[1] == NULL || tables[2] == NULL || tables[4] == NULL)
+    {
+        fprintf(stderr, "Failed to build huffman tables");
+        goto cleanup;
+    }
+
+    ws.get_next_word = test_get_word1;
     hs = jbig2_huffman_new(ctx, &ws);
+    if (hs == NULL) {
+        fprintf(stderr, "Failed to allocate huffman state");
+        goto cleanup;
+    }
 
     printf("testing jbig2 huffman decoding...");
     printf("\t(should be 8 5 (oob) 8)\n");
@@ -785,17 +800,18 @@
 
     printf("\n");
 
+    success = 1;
+
+cleanup:
+    for (i = 0; i < 5; i++)
+        jbig2_release_huffman_table(ctx, tables[i]);
     jbig2_ctx_free(ctx);
 
-    return 0;
+    return success;
 }
-#endif
 
-#ifdef TEST2
 #include <stdio.h>
 
-/* cc -g -o jbig2_huffman.test2 -DTEST2 jbig2_huffman.c .libs/libjbig2dec.a */
-
 /* a decoding test of each line from each standard table */
 
 /* test code for Table B.1 - Standard Huffman table A */
@@ -2011,7 +2027,7 @@
 } test_stream_t;
 
 static int
-test_get_word(Jbig2WordStream *self, size_t offset, uint32_t *word)
+test_get_word2(Jbig2WordStream *self, size_t offset, uint32_t *word)
 {
     test_stream_t *st = (test_stream_t *) self;
     uint32_t val = 0;
@@ -2042,12 +2058,18 @@
     return ret;
 }
 
-int
-main(int argc, char **argv)
+static int test2()
 {
-    Jbig2Ctx *ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);
+    Jbig2Ctx *ctx;
+    int success = 0;
     int i;
 
+    ctx = jbig2_ctx_new(NULL, 0, NULL, NULL, NULL);
+    if (ctx == NULL) {
+        fprintf(stderr, "Failed to allocate jbig2 context\n");
+        return 0;
+    }
+
     for (i = 0; i < countof(tests); i++) {
         Jbig2HuffmanTable *table;
         Jbig2HuffmanState *hs;
@@ -2056,55 +2078,69 @@
         bool oob;
         int j;
 
-        st.ws.get_next_word = test_get_word;
+        st.ws.get_next_word = test_get_word2;
         st.h = &tests[i];
         printf("testing Standard Huffman table %s: ", st.h->name);
         table = jbig2_build_huffman_table(ctx, st.h->params);
         if (table == NULL) {
-            printf("jbig2_build_huffman_table() returned NULL!\n");
-        } else {
-            /* jbig2_dump_huffman_table(table); */
-            hs = jbig2_huffman_new(ctx, &st.ws);
-            if (hs == NULL) {
-                printf("jbig2_huffman_new() returned NULL!\n");
-            } else {
-                for (j = 0; j < st.h->output_len; j++) {
-                    printf("%d...", st.h->output[j]);
-                    code = jbig2_huffman_get(hs, table, &oob);
-                    if (code == st.h->output[j] && !oob) {
-                        printf("ok, ");
-                    } else {
-                        int need_comma = 0;
-
-                        printf("NG(");
-                        if (code != st.h->output[j]) {
-                            printf("%d", code);
-                            need_comma = 1;
-                        }
-                        if (oob) {
-                            if (need_comma)
-                                printf(",");
-                            printf("OOB");
-                        }
-                        printf("), ");
-                    }
+            fprintf(stderr, "jbig2_build_huffman_table() returned NULL!\n");
+            jbig2_ctx_free(ctx);
+            return 0;
+        }
+        /* jbig2_dump_huffman_table(table); */
+        hs = jbig2_huffman_new(ctx, &st.ws);
+        if (hs == NULL) {
+            fprintf(stderr, "jbig2_huffman_new() returned NULL!\n");
+            jbig2_release_huffman_table(ctx, table);
+            jbig2_ctx_free(ctx);
+            return 0;
+        }
+        for (j = 0; j < st.h->output_len; j++) {
+            printf("%d...", st.h->output[j]);
+            code = jbig2_huffman_get(hs, table, &oob);
+            if (code == st.h->output[j] && !oob) {
+                printf("ok, ");
+            } else {
+                int need_comma = 0;
+
+                printf("NG(");
+                if (code != st.h->output[j]) {
+                    printf("%d", code);
+                    need_comma = 1;
                 }
-                if (st.h->params->HTOOB) {
-                    printf("OOB...");
-                    code = jbig2_huffman_get(hs, table, &oob);
-                    if (oob) {
-                        printf("ok");
-                    } else {
-                        printf("NG(%d)", code);
-                    }
+                if (oob) {
+                    if (need_comma)
+                        printf(",");
+                    printf("OOB");
                 }
-                printf("\n");
-                jbig2_huffman_free(ctx, hs);
+                printf("), ");
             }
-            jbig2_release_huffman_table(ctx, table);
         }
+        if (st.h->params->HTOOB) {
+            printf("OOB...");
+            code = jbig2_huffman_get(hs, table, &oob);
+            if (oob) {
+                printf("ok");
+            } else {
+                printf("NG(%d)", code);
+            }
+        }
+        printf("\n");
+        jbig2_huffman_free(ctx, hs);
+        jbig2_release_huffman_table(ctx, table);
     }
+
     jbig2_ctx_free(ctx);
-    return 0;
+
+    if (i == countof(tests))
+        success = 1;
+
+    return success;
+}
+
+int
+main(int argc, char **argv)
+{
+    return test1() && test2() ? 0 : 1;
 }
 #endif