#include <stdio.h>
#include <stdlib.h>
#include "gd.h"

struct parameter 
  {
  char piece[256];
  char rotate[256];
  char x[256];
  char y[256];
  }

html_error()
  {
  printf("Content-type: text/html\n\n");
  printf("File open error");
  exit(1);
  }

void parse_extra(char *extra_path, struct parameter paramlist[])
  {
  char *charp,*slash1,*slash2,*slash3,*slash4;
  int i=0,j,k;

  for(j=1;j<strlen(extra_path);j++)
    {
    if((extra_path[j-1] == '/')&&(extra_path[j] == '/'))
      {
      for(k=j;k<strlen(extra_path);k++)
        {
        extra_path[k] = extra_path[k+1];
        }
      }
    }
  charp = extra_path;
  charp++;

  while(i<255)
    {
    slash1 = strchr(charp,'/');
    if(slash1)
      slash2 = strchr(slash1+1,'/');
    else
      html_error();
    if(slash2)
      slash3 = strchr(slash2+1,'/');
    else
      {
      strcpy(paramlist[i].piece,charp);
      strcpy(paramlist[i].rotate,"ISMAP");
      strcpy(paramlist[i].x,"ISMAP");
      strcpy(paramlist[i].y,"ISMAP");
      strcpy(paramlist[i+1].piece,"LAST");
      break;
      }
    if(slash3)
      slash4 = strchr(slash3+1,'/');
    else
      html_error();

    *slash1=0;
    *slash2=0;
    *slash3=0;

    strcpy(paramlist[i].piece,charp);
    strcpy(paramlist[i].rotate,slash1+1);
    strcpy(paramlist[i].x,slash2+1);

    if(!slash4)
      {
      strcpy(paramlist[i].y,slash3+1);
      strcpy(paramlist[i+1].piece,"LAST");
      break;
      }

    if(strchr(slash4+1,'/'))
      {
      *slash4=0;
      strcpy(paramlist[i].y,slash3+1);
      charp=slash4+1;
      i++;
      }
    else
      {
      *slash4=0;
      strcpy(paramlist[i].y,slash3+1);
      strcpy(paramlist[i+1].piece,slash4+1);
      strcpy(paramlist[i+1].rotate,"ISMAP");
      strcpy(paramlist[i+1].x,"ISMAP");
      strcpy(paramlist[i+1].y,"ISMAP");
      strcpy(paramlist[i+2].piece,"LAST");
      break;
      }
    }
  }

main(int argc, char *argv[])
  {
  char graphic_char, *extra_path, piece_file_name[256], *comma;
  FILE *tangmap_fp, *piece_fp;
  struct parameter paramlist[256];
  gdImagePtr output_image, input_image, piece_image;
  int j,white;

  extra_path = getenv("PATH_INFO");
  if(extra_path)                       /* If called with params, parse them.*/
    parse_extra(extra_path,paramlist);
  else                                 /* If not, return full map.       */
    {
    if(!(tangmap_fp = fopen("/home/users/c/crywalt/public_html/tangoes/tangmaps.gif","r")))
      html_error();
    input_image = gdImageCreateFromGif(tangmap_fp);
    output_image = gdImageCreate(input_image->sx,input_image->sy);
    gdImageCopy(output_image,
                input_image,
                0,0,
                0,0,
                input_image->sx,input_image->sy);
    printf("Content-type: multipart/x-mixed-replace;boundary=ThisRandomString\n");
    printf("\n--ThisRandomString\n");
    printf("Content-type: image/gif\n\n");
    gdImageGif(output_image,stdout);
    printf("\n--ThisRandomString\n");
    gdImageDestroy(output_image);
    exit(1);
    }
  /* use param list to generate Tangoes map */
  if(!(tangmap_fp = fopen("/home/users/c/crywalt/public_html/tangoes/tangmaps.gif","r")))
    html_error();
  input_image = gdImageCreateFromGif(tangmap_fp);
  output_image = gdImageCreate(input_image->sx,input_image->sy);
  gdImageCopy(output_image,
              input_image,
              0,0,
              0,0,
              input_image->sx,input_image->sy);
  j=0;
  while((strcmp(paramlist[j].piece,"LAST"))&&(j<255))
    {
    sprintf(piece_file_name,"/home/users/c/crywalt/public_html/tangoes/tang%snsc.gif",paramlist[j].piece);
    if(!(piece_fp = fopen(piece_file_name,"r")))
      html_error();
    piece_image = gdImageCreateFromGif(piece_fp);
    fclose(piece_fp);
    if((!strcmp(paramlist[j].piece,"6"))||
       (!strcmp(paramlist[j].piece,"7")))
      gdImageCopy(output_image,
                  piece_image,
                  0,input_image->sy/2,
                  0,0,
                  piece_image->sx,piece_image->sy);
    else
      gdImageCopy(output_image,
                  piece_image,
                  0,0,
                  0,0,
                  piece_image->sx,piece_image->sy);
    gdImageDestroy(piece_image);
    j++;
    }
  printf("Content-type: multipart/x-mixed-replace;boundary=ThisRandomString\n");
  printf("\n--ThisRandomString\n");
  printf("Content-type: image/gif\n\n");
  gdImageGif(output_image,stdout);
  printf("\n--ThisRandomString\n");
  gdImageDestroy(output_image);
  }

