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

#define hexdigit(X) ((X) >= 'A' && (X) <= 'F' ? 10+(X)-'A' : (X) >= 'a' && (X) <= 'f' ? 10+(X)-'a' : (X)-'0')

static void decode_pair_string(old, new1, new2)
char *old, **new1, **new2 ;
{
  char *new ;
  int i, j ;

  *new1 = (char *)malloc(sizeof(char) * (strlen(old)+1)) ;
  *new2 = (char *)malloc(sizeof(char) * (strlen(old)+1)) ;
  *new1[0] = *new2[0] = '\0' ;
  i = 0 ;
  new = *new1 ;
  j = 0 ;
  while (old[i] != '\0') {
    switch(old[i]) {
    case '+':
      new[j++] = ' ' ;
      i++ ; 
      break ;
    case '%':
      if (!strncmp(old+i, "%0D%0A", 6)) { /* CR-LF - want to skip CR */
	i += 3 ;
      } 
      else {
	new[j++] = (char)(hexdigit(old[i+1])*16 + hexdigit(old[i+2])) ;
	i += 3 ;
      }
      break ;
    case '=':
      new[j] = '\0' ;
      new = *new2 ;
      j = 0 ;
      i++ ;
      break ;
    default:
      new[j++] = old[i] ;
      i++ ;
      break ;
    }
  }
  if (new == *new2) new[j] = '\0' ;
}

main(int argc, char *argv[])
{
  char *str, *old, *new1, *new2 ;
  char fname[FILENAME_MAX] ;
  FILE *fp ;
  int len, i, j ;

  sprintf(fname, "/tmp/cvte%s", argv[1]) ;
  fp = fopen(fname, "w") ;

  if (!strcmp(getenv("REQUEST_METHOD"), "GET")) {
    old = getenv("QUERY_STRING") ;
    len = strlen(old) ;
  }
  else { /* post */
    len = atoi(getenv("CONTENT_LENGTH")) ;
    old = (char *)malloc(sizeof(char) * (len+1)) ;
    fread(old, sizeof(char), len, stdin) ;
    old[len] = '\0' ;
  }

  i = 0 ; j=0 ;
  while (i < len) {
    while (old[i] != '\0' && old[i] != '&') i++ ;
    old[i++] = '\0' ;
    decode_pair_string(old+j, &new1, &new2) ;
    j=i ;

    str = malloc(sizeof(char) * (1 + strlen(new1) + strlen(new2))) ;
    fprintf(fp, "cgi_%s=\"", new1) ;
    {
      char *s = new2 ;
      while (*s != '\0') {
	switch (*s) {
	case '\n':
	  fputs("\\n", fp) ;
	  break ;
	case '\\': case '$': case '`': case '"':
	  putc('\\', fp) ; putc(*s, fp) ;
	  break ;
	default:
	  putc(*s, fp) ;
	  break ;
	}
	s++ ;
      }
    }
    fputs("\"\n", fp) ;
  }
  fclose(fp) ;
  printf("%s\n", fname) ;
}
