login

<     >

2017-11-02 21:18:05 (UTC-02:00)

Marcel Rodrigues <marcelgmr@gmail.com>

Just read the first key, which must be the clear code.

diff --git a/gifdec.c b/gifdec.c
index f1e5ec8..5f31004 100644
--- a/gifdec.c
+++ b/gifdec.c
@@ -9,6 +9,7 @@
 #include <unistd.h>
 
 #define MIN(A, B) ((A) < (B) ? (A) : (B))
+#define MAX(A, B) ((A) > (B) ? (A) : (B))
 
 typedef struct Palette {
     int size;
@@ -33,6 +34,18 @@ typedef struct GIF {
     uint8_t *frame;
 } GIF;
 
+typedef struct Entry {
+    uint16_t length;
+    uint16_t prefix;
+    uint8_t  suffix;
+} Entry;
+
+typedef struct Table {
+    int bulk;
+    int nentries;
+    Entry *entries;
+} Table;
+
 uint16_t
 read_num(int fd)
 {
@@ -203,8 +216,24 @@ read_ext(GIF *gif)
     }
 }
 
+Table *
+new_table(int key_size)
+{
+    int key;
+    int init_bulk = MAX(1 << (key_size + 1), 0x100);
+    Table *table = malloc(sizeof(*table) + sizeof(Entry) * init_bulk);
+    if (table) {
+        table->bulk = init_bulk;
+        table->nentries = (1 << key_size) + 2;
+        table->entries = (Entry *) &table[1];
+        for (key = 0; key < (1 << key_size); key++)
+            table->entries[key] = (Entry) {1, 0xFFF, key};
+    }
+    return table;
+}
+
 uint16_t
-get_key(GIF *gif, int key_size, int *sub_len, uint8_t *byte)
+get_key(GIF *gif, int key_size, uint8_t *sub_len, uint8_t *byte)
 {
     int bits_read;
     int rpad;
@@ -215,13 +244,13 @@ get_key(GIF *gif, int key_size, int *sub_len, uint8_t *byte)
         rpad = bits_read % 8;
         if (rpad == 0) {
             /* Update byte. */
-            if (sub_len == 0)
+            if (*sub_len == 0)
                 read(gif->fd, sub_len, 1); /* Must be nonzero! */
             read(gif->fd, byte, 1);
             (*sub_len)--;
         }
         frag_size = MIN(key_size - bits_read, 8 - rpad);
-        key |= ((*byte) >> rpad) << bits_read;
+        key |= ((uint16_t) ((*byte) >> rpad)) << bits_read;
     }
     /* Clear extra bits to the left. */
     key &= (1 << key_size) - 1;
@@ -234,12 +263,19 @@ read_image_data(GIF *gif)
     uint8_t sub_len;
     uint8_t byte;
     int key_size;
-    uint16_t key;
+    uint16_t key, clear, stop;
+    Table *table;
 
     read(gif->fd, &byte, 1);
     key_size = (int) byte;
+    clear = 1 << key_size;
+    stop = clear + 1;
+    table = new_table(key_size);
+    key_size++;
     sub_len = 0;
     key = get_key(gif, key_size, &sub_len, &byte);
+    printf("%03X == %03X\n", key, clear);
+    exit(0);
 }
 
 void