login

<     >

2017-11-02 19:32:10 (UTC-02:00)

Marcel Rodrigues <marcelgmr@gmail.com>

First attempt at get_key().

diff --git a/gifdec.c b/gifdec.c
index a380619..f1e5ec8 100644
--- a/gifdec.c
+++ b/gifdec.c
@@ -8,6 +8,8 @@
 #include <fcntl.h>
 #include <unistd.h>
 
+#define MIN(A, B) ((A) < (B) ? (A) : (B))
+
 typedef struct Palette {
     int size;
     uint8_t colors[0x100 * 3];
@@ -201,14 +203,43 @@ read_ext(GIF *gif)
     }
 }
 
+uint16_t
+get_key(GIF *gif, int key_size, int *sub_len, uint8_t *byte)
+{
+    int bits_read;
+    int rpad;
+    int frag_size;
+    uint16_t key;
+
+    for (bits_read = 0; bits_read < key_size; bits_read += frag_size) {
+        rpad = bits_read % 8;
+        if (rpad == 0) {
+            /* Update byte. */
+            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;
+    }
+    /* Clear extra bits to the left. */
+    key &= (1 << key_size) - 1;
+    return key;
+}
+
 void
 read_image_data(GIF *gif)
 {
-    uint8_t key_size;
+    uint8_t sub_len;
+    uint8_t byte;
+    int key_size;
+    uint16_t key;
 
-    read(gif->fd, &key_size, 1);
-    /* TODO: uncompress raster data. */
-    discard_sub_blocks(gif);
+    read(gif->fd, &byte, 1);
+    key_size = (int) byte;
+    sub_len = 0;
+    key = get_key(gif, key_size, &sub_len, &byte);
 }
 
 void