POBox Server - ソース

    //
    //	$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;
    	}
    }