#include <stdio.h>
#include <string.h>
#include "cgiutils.h"

#define hexdigit(X) (isdigit((X)) ? (X)-'0' : (isupper((X)) ? (X)-'A' + 10 : (X)-'a' + 10))

main()
{
  int i, j, r, g, b ;
  int *rarray, *garray, *barray, nregs ;
  char *s, *list, *rle_fname, rle_fname_full[256], *nregs_str ;
  char *width_str ;
  int item_width ;

  /* hex digits here are number plus 'A' */

  decode_query_string("f", &rle_fname, "n", &nregs_str, 
		      "w", &width_str, "l",&list, NULL) ;

  item_width = atoi(width_str) ;

  nregs = atoi(nregs_str) ;
  rarray = (int *)malloc(sizeof(int) * nregs) ;
  garray = (int *)malloc(sizeof(int) * nregs) ;
  barray = (int *)malloc(sizeof(int) * nregs) ;

  for (i = 0 ; i < nregs ; i++) 
    rarray[i] = garray[i] = barray[i] = 255 ; /* white */

  s = list ;
  while (*s != '\0') {
    r = hexdigit(*s)*16 + hexdigit(*(s+1)) ;
    s += 2 ;
    g = hexdigit(*s)*16 + hexdigit(*(s+1)) ;
    s += 2 ;
    b = hexdigit(*s)*16 + hexdigit(*(s+1)) ;
    s += 2 ;
    /* now start reading three-digit region numbers until a delimiter
       or EOL is hit; delimiter is 'Q' */
    while (*s != 'Q' && *s != '\0') {
      i = 0 ;
      for (j=0 ; j < item_width ; j++, s++) 
	i = (i << 4) | hexdigit(*s) ;
      rarray[i] = r ; garray[i] = g ; barray[i] = b ;
    }
    if (*s == 'Q') s++ ;
  }

  printf("Content-type: image/gif\n\n") ;
  fflush(stdout) ;

  sprintf(rle_fname_full, "./%s", rle_fname) ;

  rle22gif(rle_fname_full, nregs, 0, rarray, garray, barray) ;
 
}
