/media/sda-magnetic/david/Dok-15-2023-11-27/informatik/newC2023-10-23/myc/gif.c


#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);
  
}