#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void DecodeStr(char *szString);
char DecodeHex(char *str);

void main(int argc, char *argv[])
{
int lSize;
FILE * fileGuestBook;
char * szMethod;
char szBuf[1024];
char szSrcBuf[1024];
char szTemp[1024];
char * szPtr;
char * szPtrValue;
char * szParam;

printf("<html><head><title>Guest book by Den'",
"</title></head><body background=\"back.gif\">");
printf("<h1><u>Our Guest Book</u></h1>");

fileGuestBook = fopen("guestbk.dat","r");
if(fileGuestBook != NULL)
{
while(!feof(fileGuestBook))
{
fgets(szBuf, 1024, fileGuestBook);
if(ferror(fileGuestBook))
 break;
fputs(szBuf, stdout);
}
fclose(fileGuestBook);
}
szMethod = getenv("REQUEST_METHOD");
if(!strcmp(szMethod, "POST"))
{
lSize = atoi(getenv("CONTENT_LENGTH"));
fread(szBuf, lSize, 1, stdin);

fileGuestBook = fopen("guestbk.dat", "a+");
printf("hr");
fwrite("<hr>", 4, 1, fileGuestBook);
szBuf[lSize] = '/0'; strcpy(szSrcBuf, szBuf);
DecodeStr(szSrcBuf);
szBuf[lSize] = '&'; szBuf[lSize + 1] = '\0';
szParam = szBuf; szPtr = strchr(szParam, '&');
if(szPtr != NULL)
{
*szPtr = '\0'; DecodeStr(szParam);
szPtrValue = strchr(szParam, '='); szPtrValue++;
printf("<a href=\"mailto:%s\">%s</a><br>", szPtrValue, szPtrValue);
sprintf(szTemp, "<a href=\"mailto:%s\">%s</a><br>", szPtrValue, szPtrValue);
fwrite(szTemp, strlen(szTemp), 1, fileGuestBook);
}
szParam = szPtr + 1; szPtr = strchr(szParam, '&');
if(szPtr != NULL)
{
*szPtr = '\0'; DecodeStr(szParam);
szPtrValue = strchr(szParam, '='); szPtrValue++;
printf("<address><b>%s, ", szPtrValue);
sprintf(szTemp, "<adress><b>%s, ", szPtrValue);
fwrite(szTemp, strlen(szTemp), 1, fileGuestBook);
}
szParam = szPtr + 1; szPtr = strchr(szParam, '&');
if(szPtr != NULL)
{
*szPtr = '\0'; DecodeStr(szParam);
szPtrValue = strchr(szParam, '='); szPtrValue++;
printf("%s</address></b>", szPtrValue);
sprintf(szTemp, "%s</address></b>", szPtrValue);
fwrite(szTemp, strlen(szTemp), 1, fileGuestBook);
}
szParam = szPtr + 1; szPtr = strchr(szParam, '&');
if(szPtr != NULL)
{
*szPtr = '\0'; DecodeStr(szParam);
szPtrValue = strchr(szParam, '='); szPtrValue++;
printf("<p>%s", szPtrValue);
sprintf(szTemp, "<p>%s", szPtrValue);
fwrite(szTemp, strlen(szTemp), 1, fileGuestBook);
}
printf("</body></html>");
fclose(fileGuestBook);
return;
 }
}
void DecodeStr(char *szString)
{
int src;
int dst;
char ch;
for(src=0, dst=0; szString[src]; src++, dst++)
{
ch=szString[src];
ch = (ch == '+') ? ' ' : ch;
szString[dst] = ch;
if(ch == '%')
{
szString[dst] = DecodeHex(&szString[src + 1]);
src += 2;
}
}
szString[dst] = '\0';
}
char DecodeHex( char *str)
{
char ch;
if(str[0] >= 'A')
ch = ((str[0] & 0xdf) - 'A') + 10;
else
ch = str[0] - '0';
ch <<= 4;
if((str[1] >= 'A'))
ch += ((str[1] & 0xdf) - 'A') + 10;
else
ch +=str[1] - '0';
return ch;
}
