/*
 * Bioinfo Animal Pictures Archive - Search CGI script
 * APAsrch.c - Using GET method
 * Resulting program : APAsrch.cgi
 * Kim, Jinsuk  [jskim@bioinfo.kordic.re.kr]
 */

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

#define LIST "sizeANDlist"	/* file name list by  '\ls -FCs > sizeANDlist'  */
#define ARCH_DIR "animal"	/* virtual directory of the archive */
#define WEB_MASTER "jskim@bioinfo.kordic.re.kr"	/* Web master's email */
#define ACC_NUM_FILE "log/cgi_counter.dat"

void strlower(char *org_s) /* small capitalize a string */
{
	char c, buf[256];
	int i;

	for(i=0; i<=strlen(org_s); i++) {
		if ( isalpha(org_s[i]) && isupper(org_s[i]) )
			org_s[i] = org_s[i] + 32;
	}
	buf[i] = '\0';
}

int APAsrch(char *fname, int flag)
{
	FILE *fp;	/* file pointers to open index files */
	int i, j;	/* general purposes */
	int k=0;	/* number of retrieval in a index file */
	int fsize;	/* file size in Kbytes */
	char *query, target[255], buf[255];

	query = getenv("QUERY_STRING");	/* get string of GET method */
	query = query+3;
	strlower(query);

	/* File Open Error detection */
	if ( (fp=fopen(fname, "r")) == NULL ) {
		printf("<B>List file open error.</B><P>\n");
		printf("Contact <A HREF=\"mailto:%s\">", WEB_MASTER);
		printf("<I>Web master</I></A>.<P>\n");
		exit(1);
	}
	fgets( buf, 255, fp);	/* remove first line of LIST1 */

	if ( !strcmp(query, "all") ) {
	while (!feof(fp)) {
		fscanf(fp, "%d %s", &fsize, target);
		printf("<LI><A HREF=\"%s%d/%s\">", ARCH_DIR, flag, target);
		printf("%s</A> (%dKb)\n", target, fsize);
		k++;
	}
	}
	else {
	while (!feof(fp)) {
		fscanf(fp, "%d %s", &fsize, target);
		strcpy(buf, target);
		strlower(target);
		if ( strstr(target, query) ) {
			printf("<LI><A HREF=\"%s%d/%s\">", ARCH_DIR, flag, buf);
			printf("%s%d/%s</A> (%dKb)\n", ARCH_DIR, flag, buf, fsize);
			k++;
		}
	}
	}
	fclose(fp);

	return k;
}

main()
{
	char *target;
	int num_retrieval=0;
	long int n;
	FILE *fp;

	target=getenv("QUERY_STRING");	/* get string of GET method */
	if (strstr(target, "qt=")) target=target+3;
	else target="\0";

	printf("Content-type: text/html%c%c",10,10);
	printf("<HTML>");

       	printf("<HEAD>\n");
       	printf("<TITLE>Bioinfo Animal Pictures Archive Search \"%s\"</TITLE>\n", target);
       	printf("</HEAD>\n");

	printf("<body bgcolor=\"white\">\n");
	printf("<IMG SRC=APAsrch.gif><br>\n");
	printf("<hr>This CGI program is old-fashioned. Try new\n");
	printf("<a href=\"APAsrch2.cgi?qt=%s\"><tt><font size=+1>", target);
	printf("<b>APAsrch2.cgi</b></font></tt></a>,\n");
	printf("which supports searching with wild card characters, \n");
	printf("downloading image through mail, image preview, \n");
	printf("and enhanced image view.\n");
        printf("<HR SIZE=5>\n");

	if (strlen(target) > 0) {
       		printf("<UL>\n");
		num_retrieval += APAsrch("sizeANDlist1", 1);
		num_retrieval += APAsrch("sizeANDlist2", 2);
		num_retrieval += APAsrch("sizeANDlist3", 3);
		num_retrieval += APAsrch("sizeANDlist4", 4);
		num_retrieval += APAsrch("sizeANDlist5", 5);
		num_retrieval += APAsrch("sizeANDlist6", 6);
		num_retrieval += APAsrch("sizeANDlist7", 7);
       		printf("</UL>\n");

		if (num_retrieval <= 0) {
			printf("Sorry, currently this archive has no ");
			printf("<B><I>%s</I></B> image.<P>\n", target); 
		}
		else {
			printf("%d images and descritions of ", num_retrieval);
			printf("<B><I>%s</B></I> found.<P>\n", target);
		}
	}
	else {
		printf("<P><B>Enter Search Keywords</B>\n");
	}
	printf("<FORM METHOD=\"GET\" ACTION=\"APAsrch.cgi\">\n");

	printf("<HR SIZE=5>\n");
	printf("<TABLE BORDER=0>\n<TR>\n");
	printf("<TD><B>Search:</B></TD><TD><INPUT NAME=\"qt\" SIZE=30 VALUE=\"\">\n");
	printf("<INPUT TYPE=submit VALUE=\"Run Query\">\n");
	printf("<INPUT TYPE=reset VALUE=\"Clear Query Text\"></TD>\n");
	printf("</TR>\n<TR>\n<TD><B>Tips:</B></TD>\n");
	printf("<TD>Case-insensitive; Partial words will be matched; Use singular noun</TD>\n");
	printf("</TR>\n</TABLE>\n");

	printf("</FORM>\n<P>\n<HR SIZE=5>\n");

	printf("<CENTER><P>\n");
	printf("[ <A HREF=\"/\">BIOINFO HOME</A> ]<BR>\n");
	printf("[ <A HREF=\"/animal/\">Animal Pictures Archive Home</A> ]<BR>\n");
	printf("[ <A HREF=\"/animal/movies/\">Animal Movies</A> ]<BR>\n");
	printf("<HR WIDTH=400 SIZE=5>\n");
	printf("<HR WIDTH=300 SIZE=5>\n");
	printf("<HR WIDTH=200 SIZE=5>\n");
	printf("</CENTER>\n");
	printf("</HTML>");

	if((fp=fopen(ACC_NUM_FILE, "r"))==NULL){
                printf("<I>OOPS! Counter File Open Error</I>");
                exit(1);
        }
	fscanf(fp,"%d",&n);
	fclose(fp);

	if((fp=fopen(ACC_NUM_FILE, "w"))==NULL){
                printf("<I>OOPS! Counter File Open Error</I>");
                exit(1);
        }
	fprintf(fp,"%d\n",n+1);
	fclose(fp);

	exit(0);
}
