#include <stdio.h>
char gif [1024*1024];
char bitmap [1024*1024];
int main (void) {
int screenwidth;
int screenheight;
int pos;
char resflag;
int pixelaspectratio;
int bgcolor;
int imageseperator;
int imageleft;
int imagetop;
int imagewidth;
int imageheight;
int i, j, k, n, length, notice;
int table [1024][1024];
int bytecount, bytecountpos, codesize;
int globalcolormap [3];
char lzw [1024];
strcpy (gif, "GIF87a");
screenwidth = 16;
screenheight = 16;
pos = strlen ("GIF87a");
gif [pos+0] = 0;
gif [pos+1] = screenwidth;
gif [pos+2] = 0;
gif [pos+3] = screenheight;
pos += 4;
resflag = 7;
gif [pos] = resflag;
pos += 1;
bgcolor = 0;
pixelaspectratio = 0;
gif [pos+0] = bgcolor;
gif [pos+1] = pixelaspectratio;
pos += 2;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
imageseperator = 0x2c;
gif [pos] = imageseperator;
pos += 1;
imageleft = 0;
imagetop = 0;
imagewidth = 16;
imageheight = 16;
gif [pos+0] = imageleft;
gif [pos+1] = imagetop;
gif [pos+2] = imagewidth;
gif [pos+3] = imageheight;
pos += 4;
resflag = 7;
gif [pos] = resflag;
pos++;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0x00;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0x00;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0x00;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
globalcolormap [0] = 0xff;
globalcolormap [1] = 0xff;
globalcolormap [2] = 0xff;
gif [pos+0] = globalcolormap [0];
gif [pos+1] = globalcolormap [1];
gif [pos+2] = globalcolormap [2];
pos += 3;
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j+=2) {
bitmap [(i*16)+j + 0] = 1;
bitmap [(i*16)+j + 1] = 2;
}
}
codesize = 4;
gif [pos] = codesize;
pos++;
bytecountpos = pos;
bytecount = 0;
int x;
notice = 0;
for (i = 0, j = 1, length = 1; i < 16*16+1; ) {
for (length = 1; (i + length) < 16*16+1; ) {
for (k = 0; (k < n) && (strncmp (table [k], bitmap+i, length) != 0); k++);
if (k >= n) {
printf ("%i %s\n", notice, table [notice]);
lzw [bytecount] = notice;
strncpy (table [n], bitmap+i, length);
n++;
length--;
bytecount++;
break;
}
else if (k < n) {
notice = k;
length++;
}
}
i = i + length;
}
for (i = 0, x = 0; i < n; i++) {
strcpy (gif + pos, table [i]);
pos = pos + strlen (table [notice]);
x = x + strlen (table [notice]);
}
for (j = 0; j < bytecount; j++) {
gif [pos] = lzw [j];
pos++;
x = x ++;
}
gif [bytecountpos] = x;
gif [pos] = 0;
pos++;
gif [pos] = 0x3b;
pos++;
pos++;
FILE *fp = fopen ("test.gif", "wb");
fwrite (gif, pos, 1, fp);
fclose (fp);
}