|
// // $Date: 2002/02/16 09:15:50 $ // $Revision: 1.9 $ // // POBox APIを使ったPOBox Serverを実装 // // ・USEWNNが定義されているときは動的曖昧検索を頑張って行なうかわりに // Jserverに変換を依頼する。 // ・skkservはEUCの漢字の読みを受けつけるが、この版はローマ字を // 受けつけるようになっている。(普通のSKKでは使えない) #include#include #include "server.h" #include "poboxlib.h" //////////////////////////////////////////////////////////////////////////////////////////// #include struct timeval ts,te; static void timebegin() { gettimeofday(&ts,NULL); } static long timeend() { long t; gettimeofday(&te,NULL); t = (te.tv_sec - ts.tv_sec) * 1000000 + (te.tv_usec - ts.tv_usec); return t; } //////////////////////////////////////////////////////////////////////////////////////////// #define POBOXSERVERPORT 1178 #define MAXCANDS 100 #define MAXWORDLEN 100 unsigned char *cands[MAXCANDS],*candspat[MAXCANDS]; int process(int); unsigned char context[MAXCLIENT][MAXWORDLEN]; char *revision = "$Revision: 1.9 $"; int poboxdebug = 0; // POBoxDict learndic = { "./learndic", POBOXDICT_STANDARD, POBOXDICT_TEXT, 0 // not read-only }; #ifdef USESARY POBoxDict sarydic = { "./staticdic", POBOXDICT_STANDARD, POBOXDICT_SARY, 1 // read-only }; #endif #ifdef USELOOKUP POBoxDict lookupdic = { "./staticdic", POBOXDICT_STANDARD, POBOXDICT_LOOKUP, 1 // read-only }; #endif main(int argc, char **argv) { int i; if(argc > 1) poboxdebug = 1; if(pobox_init() < 0) exit(0); if(pobox_usedict(&learndic) < 0) exit(0); #ifdef USESARY if(pobox_usedict(&sarydic) < 0) exit(0); #endif #ifdef USELOOKUP if(pobox_usedict(&lookupdic) < 0) exit(0); #endif server(POBOXSERVERPORT,process); pobox_finish(); } process(int sock) { unsigned char buf[1000],combuf[BUFSIZE]; unsigned char w[100],p[100]; int i,n; char *host; char *pat; int patlen; if((n = read(sock, &combuf[0], BUFSIZE)) <= 0) return -1; combuf[n] = '\0'; while(n > 0 && (combuf[n-1] == '\n' || combuf[n-1] == '\r')){ combuf[n-1] = '\0'; n--; } if(poboxdebug) printf("command: [%s]\n",combuf); switch(combuf[0]){ case '0': pobox_usedict(NULL); // save all existing changes return -1; // this makes the server's main routine disconnect case '1': for(pat=combuf+1;*pat;pat++){ if(isupper(*pat)) *pat = tolower(*pat); } pat = combuf+1; patlen = strlen(pat); pobox_context(context[sock],strlen(context[sock])); if(pat[patlen-1] == ' '){ pobox_searchmode(0); pat[patlen-1] = '\0'; } else { pobox_searchmode(POBOX_EXACT); } n = pobox_search(pat); pobox_getcands(cands,candspat,0,n); if(n == 0){ sprintf(buf,"4%s\n",pat); } else { strcpy(buf,"1\t"); for(i=0;i< n;i++){ strcat(buf,cands[i]); strcat(buf,"\t"); } strcat(buf,"\n"); } if(write(sock, buf, strlen(buf)) < 0) return -1; return 0; case '2': if(write(sock, revision+11, strlen(revision)-13) < 0) return -1; return 0; case '3': host = "dummyhost"; if(write(sock,host,strlen(host)) < 0) return(-1); return 0; case '4': strcpy(context[sock],combuf+1); if(write(sock,"1\n",2) < 0) return -1; return 0; case '5': n = sscanf(combuf+1,"%s %s",w,p); if(write(sock,"1\n",2)<0) return -1; if(n == 2){ for(pat=p;*pat;pat++){ if(isupper(*pat)) *pat = tolower(*pat); } pobox_regword(&learndic,w,p,NULL); strcpy(context[sock],w); } return 0; case '6': n = sscanf(combuf+1,"%s %s",w,p); if(write(sock,"1\n",2)<0) return -1; if(n == 2){ pobox_delword(&learndic,w,p); } return 0; case '7': printf("save dict\n"); if(write(sock,"1\n",2) < 0) return -1; // pobox_usedict(NULL); // pobox_savedic(...)?? pobox_save(&learndic); return 0; case '8': n = sscanf(combuf+1,"%d",&i); if(write(sock,"1\n",2) < 0) return -1; if(n == 1){ pobox_select(i); strcpy(context[sock],cands[i]); } return 0; case 'Q': exit(0); default: return -1; } }