/* * NameHan.c - Using GET method * NameHan.cgi * Kim, Jinsuk [jskim@bioinfo.kordic.re.kr] */ #include "NameHan.h" /* stringÀÌ ¿µ¹®À̸é YES, ¾Æ´Ï¸é (ÇÑ±Û ¶Ç´Â Ư¼ö¹®ÀÚ) NO¸¦ return */ int IsEnglish(string) char *string; { int i; for (i=0; i 126 ) { return NO; } } return YES; } void PrintMsg(content, align, color) char *content; char *align; char *color; { printf("

", align, color); printf("%s

\n", content); } void MakeDic(line, KEdic) char *line; KorEngDict *KEdic; { char *ptr; char buf[2048]; char buf2[2048]; char buf3[2048]; int x, y; for (x=0, y=0; x»çÀü¿À·ù: [%s]
\n", line); return; } KEdic->hn=0; KEdic->en=0; strcpy(buf, line); /* Çѱ۸í ÃßÃâ */ ptr = (char *) strstr(buf, ";"); *(ptr) = '\0'; strcpy(buf2, buf); strcpy(buf, ptr+1); do { if ( !(ptr=(char *)strstr(buf2, ",")) ) { strcpy(KEdic->han[KEdic->hn], buf2); KEdic->hn++; break; } *(ptr) = '\0'; strcpy(buf3, ptr+1); strcpy(KEdic->han[KEdic->hn], buf2); strcpy(buf2, buf3); KEdic->hn++; } while (1); /* ¿µ¾î¸í ÃßÃâ */ ptr = (char *) strstr(buf, ";"); *(ptr) = '\0'; strcpy(buf2, buf); strcpy(buf, ptr+1); do { if ( !(ptr=(char *)strstr(buf2, ",")) ) { strcpy(KEdic->eng[KEdic->en], buf2); KEdic->en++; break; } *(ptr) = '\0'; strcpy(buf3, ptr+1); strcpy(KEdic->eng[KEdic->en], buf2); strcpy(buf2, buf3); KEdic->en++; } while (1); /* À̸í¹ý ÃßÃâ */ ptr = (char *) strstr(buf, ";"); *(ptr) = '\0'; strcpy(buf2, buf); strcpy(buf, ptr+1); strcpy(KEdic->sci, buf2); /* ¼³¸í ÃßÃâ */ strcpy(KEdic->desc, buf); } void SearchHan(query) char *query; { FILE *fp; KorEngDict KEdic; char buf[2048]; int x, y; int found=0, flag; if ( (fp=fopen(KOR_ENG_DICT, "r")) == NULL ) { fclose(fp); PrintMsg("ÇÑ¿µ»çÀüÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.", CENTER, RED); printf("

", WEB_MASTER); printf("°ü¸®ÀÚ¿¡°Ô ÆíÁö¸¦ ÁֽʽÿÀ.

\n"); return; } if ( !strcmp(query, "__¸ðµÎº¸±â__") ) { printf("
\n"); while (fgets(buf, 2048, fp)) { *(buf+(strlen(buf)-1)) = '\0'; MakeDic(buf, &KEdic); printf("
"); for (x=0; x"); if (strlen(KEdic.sci) > 0) printf("(%s)\n", KEdic.sci); printf("
"); for (x=0; x", x+1, \ CGI_APA_SEARCH, buf); printf("%s ", KEdic.eng[x]); } printf("\n"); found++; } printf("
\n"); return; } flag = NO; printf("
\n"); while (fgets(buf, 2048, fp)) { *(buf+(strlen(buf)-1)) = '\0'; MakeDic(buf, &KEdic); for (x=0; x"); for (x=0; x"); if (strlen(KEdic.sci) > 0) printf("(%s)\n", KEdic.sci); printf("
"); for (x=0; x", x+1, \ CGI_APA_SEARCH, buf); printf("%s ", KEdic.eng[x]); } printf("
%s

\n", KEdic.desc); found++; flag = NO; } printf("

\n"); if (found == 0) { PrintMsg("ã´Â °Ë»ö¾î¿¡ ÇØ´çÇÏ´Â Ç׸ñÀÌ »çÀü¿¡ ¾ø½À´Ï´Ù.", CENTER, RED); PrintMsg("µ¿ÀǾ º¸´Ù ªÀº ÇüÅÂÀÇ ´Ü¾î¸¦ ÀÔ·ÂÇØº¸½Ê½Ã¿À.", CENTER, GREEN); PrintMsg("¿¹: ¹ü -> È£¶ûÀÌ, À̸® -> ´Á´ë, ¾Þ¹«»õ -> ¾Þ¹«", CENTER, BROWN); } } int main() { FILE *fp; getentry entries[10]; long int i, x, y; char query[256]; strcpy(query, "\0"); printf("content-type: text/html\n\n"); /* HTML Header */ #ifdef FILEOUT printf("Debugging Mode\n"); i = 0; strcpy(entries[0].name, "query"); strcpy(entries[0].val, "È£¶ûÀÌ"); #else i = ProcessGetMethod( entries ); #endif for (x=0; x<=i; x++) { if (!strcasecmp(entries[x].name, "query")) { strcpy(query, entries[x].val); trim(query); } } printf(""); printf("\n"); if ( strlen(query) > 0) printf("Bioinfo µ¿¹°±×¸²Ã¢°í °Ë»ö \"%s\"\n", query); else printf("Bioinfo µ¿¹°±×¸²Ã¢°í °Ë»ö\n"); printf("\n"); printf("\n"); printf("
\n"); printf("
\n"); printf("
\n"); printf("
Çѱ۰˻ö\n"); printf("¿µ¾î°Ë»ö\n"); printf("
\n"); printf("
\n", CGI_HAN_SEARCH); printf("
\n", query); printf("
\n"); printf("Çѱ۰˻öÀº µ¿¹°À̸§ ÇÑ¿µ»çÀüÀ» °Ë»öÇÕ´Ï´Ù. Çѱ۴ܾî Çϳª¸¦ "); printf("ÀÔ·ÂÇØÁֽʽÿÀ.\nÇѱ۸íÀ» ¸ðµÎ º¸½Ã·Á¸é"); printf("\n¿©±â", CGI_HAN_SEARCH); printf("¸¦\n´­·¯ÁֽʽÿÀ.\n"); printf("
\n"); printf("
\n"); printf("
\n"); printf("
\n", CGI_APA_SEARCH); printf("
\n"); printf("
\n"); printf("Tips:"); printf("Case-insensitive; Able to use wild card characters * and ?; Singular noun search; \n"); printf("Examples - WOLF*HOWL, "); printf("ALLIGAT?R\n"); printf("
\n"); printf("
\n"); printf("
\n

\n"); if ( strlen(query) > 0 && !IsEnglish(query) ) { SearchHan(query); } else if ( strlen(query) > 0 && IsEnglish(query) ) { PrintMsg("¿µ¾î´Ü¾î¸¦ ÀÔ·ÂÇϼ̽À´Ï´Ù.", CENTER, BLUE); printf("

"); printf("¿µ¾î·Î Á÷Á¢ °Ë»öÇϰíÀÚ Çϸé"); printf("¿©±â(%s)¸¦", CGI_APA_SEARCH, \ query, query); printf("´­·¯ÁֽʽÿÀ.

\n"); } else { PrintMsg("°Ë»öÇÒ ´Ü¾î¸¦ ÀÔ·ÂÇϽʽÿÀ", CENTER, BROWN); } printf("
\n"); printf("

\n"); printf("[ µ¿¹°±×¸²Ã¢°í ]
\n",\ APA_HOME); printf("


\n"); printf("
\n"); printf("
\n"); if((fp=fopen(ACC_NUM_FILE, "r"))==NULL) PrintMsg("ÆÄÀÏ¿­±â¿À·ù", CENTER, RED); else { fscanf(fp,"%d", &x); fclose(fp); printf("%d

\n", x); } if((fp=fopen(ACC_NUM_FILE, "w"))==NULL) PrintMsg("ÆÄÀÏ¿­±â¿À·ù", CENTER, RED); else { fprintf(fp,"%d\n",x+1); fclose(fp); } /* query logging */ if((fp=fopen(QUERY_LOG_FILE, "a"))==NULL) PrintMsg("ÆÄÀÏ¿­±â¿À·ù", CENTER, RED); else { fprintf(fp,"%d %s\n", x, query); fclose(fp); } exit(0); } /* NCSA Web Library */ void getword(char *word, char *line, char stop) { int x = 0, y; for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while (line[y++] = line[x++]); } char * makeword(char *line, char stop) { int x = 0, y; char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1)); for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while (line[y++] = line[x++]); return word; } char * fmakeword(FILE * f, char stop, int *cl) { int wsize; char *word; int ll; wsize = 102400; ll = 0; word = (char *) malloc(sizeof(char) * (wsize + 1)); while (1) { word[ll] = (char) fgetc(f); if (ll == wsize) { word[ll + 1] = '\0'; wsize += 102400; word = (char *) realloc(word, sizeof(char) * (wsize + 1)); } --(*cl); if ((word[ll] == stop) || (feof(f)) || (!(*cl))) { if (word[ll] != stop) ll++; word[ll] = '\0'; return word; } ++ll; } } char x2c(char *what) { register char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return (digit); } void unescape_url(char *url) { register int x, y; for (x = 0, y = 0; url[y]; ++x, ++y) { if ((url[x] = url[y]) == '%') { url[x] = x2c(&url[y + 1]); y += 2; } } url[x] = '\0'; } void plustospace(char *str) { register int x; for (x = 0; str[x]; x++) if (str[x] == '+') str[x] = ' '; } int rind(char *s, char c) { register int x; for (x = strlen(s) - 1; x != -1; x--) if (s[x] == c) return x; return -1; } int getline(char *s, int n, FILE * f) { register int i = 0; while (1) { s[i] = (char) fgetc(f); if (s[i] == CR) s[i] = fgetc(f); if ((s[i] == 0x4) || (s[i] == LF) || (i == (n - 1))) { s[i] = '\0'; return (feof(f) ? 1 : 0); } ++i; } } void send_fd(FILE * f, FILE * fd) { int num_chars = 0; char c; while (1) { c = fgetc(f); if (feof(f)) return; fputc(c, fd); } } /* coded by armian@www.kordic.re.kr */ int ProcessGetMethod(entries) getentry *entries; { char *cl; int x, m; if (strcmp(getenv("REQUEST_METHOD"), "GET")) { printf("This script should be referenced with a METHOD of GET.\n"); printf("If you don't understand this, see this "); printf("forms overview.%c", 10); exit(1); } cl = getenv("QUERY_STRING"); if ( strlen(cl) <= 0 ) { /* printf("No query information to decode.\n"); */ return -1; } for (x = 0; cl[0] != '\0'; x++) { m = x; getword(entries[x].val, cl, '&'); plustospace(entries[x].val); unescape_url(entries[x].val); getword(entries[x].name, entries[x].val, '='); } return m; }