Mercurial > freewnn
view Wnn/jutil/wnnstat.c @ 1:790205f476c0
applied wnn_dec12.diff
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:47:24 +0900 |
parents | bbc77ca4def5 |
children | a7ccf412ba02 |
line wrap: on
line source
/* * $Id: wnnstat.c,v 1.10 2002/05/12 22:51:17 hiroo Exp $ */ /* * FreeWnn is a network-extensible Kana-to-Kanji conversion system. * This file is part of FreeWnn. * * Copyright Kyoto University Research Institute for Mathematical Sciences * 1987, 1988, 1989, 1990, 1991, 1992 * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 * Copyright FreeWnn Project 1999, 2000, 2002 * * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef lint static char *rcs_id = "$Id: wnnstat.c,v 1.10 2002/05/12 22:51:17 hiroo Exp $"; #endif /* lint */ #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <stdio.h> #if STDC_HEADERS # include <stdlib.h> # include <string.h> #else /* !STDC_HEADERS */ # if HAVE_MALLOC_H # include <malloc.h> # endif # if HAVE_STRINGS_H # include <strings.h> # endif #endif /* !STDC_HEADERS */ #if HAVE_UNISTD_H # include <unistd.h> #endif #include "jslib.h" #include "jllib.h" #include "jd_sock.h" #include "commonhd.h" #include "wnn_config.h" #include "wnn_os.h" #include "msg.h" WNN_JSERVER_ID *js; struct wnn_ret_buf rb = { 0, NULL }; #define WNNSTAT_ENV "This_is_wnnstat" #define W_WHO 0 #define W_ENV 1 #define W_ALL 2 #define W_FILE 3 #define W_DIC 4 #define W_DIC_ALL 5 #define W_VERSION 6 #ifdef JAPANESE extern int eujis_to_jis8 (), eujis_to_sjis (); #endif #ifdef CHINESE extern int ecns_to_big5 (); #endif static void printall (), printpat (), err (), usage (), who (), dic (), dic_all (), file_all (), wsttost (), out (); #ifdef CHINESE #ifdef TAIWANESE int ocode = (TTY_TCODE + 6); #else /* TAIWANESE */ int ocode = (TTY_CCODE + 4); #endif /* TAIWANESE */ #else /* CHINESE */ #ifdef KOREAN int ocode = TTY_HCODE; #else /* KOREAN */ int ocode = TTY_KCODE; #endif /* KOREAN */ #endif /* CHINESE */ int com = W_WHO; struct msg_cat *cd; int main (argc, argv) int argc; char **argv; { char *serv; int c, i, j; WNN_ENV_INFO *w; static char lang[64] = { 0 }; extern int optind; extern char *optarg; extern char *getenv (); char nlspath[64]; /* char *p; */ char *server_env = NULL; char *prog = argv[0]; extern char *_wnn_get_machine_of_serv_defs (), *get_server_env (); /* if ((p = getenv("LANG")) != NULL) { strcpy(lang, p); lang[5] = '\0'; } else { lang[0] = '\0'; } if (*lang == '\0') */ strcpy (lang, WNN_DEFAULT_LANG); #ifdef JAPANESE # define OPTSTRING "weEdDfFUSJVL:" #endif #ifdef CHINESE # define OPTSTRING "weEdDfFUBCVL:" #endif # ifdef KOREAN # define OPTSTRING "weEdDfFUKVL:" #endif while ((c = getopt (argc, argv, OPTSTRING)) != EOF) { switch (c) { case 'w': com = W_WHO; break; case 'E': com = W_ALL; break; case 'e': com = W_ENV; break; case 'd': com = W_DIC; break; case 'D': com = W_DIC_ALL; break; case 'f': case 'F': com = W_FILE; break; case 'V': com = W_VERSION; break; case 'U': #ifdef JAPANESE ocode = J_EUJIS; #endif #ifdef CHINESE ocode = C_EUGB; #endif #ifdef KOREAN ocode = K_EUKSC; break; case 'K': ocode = K_KSC; #endif break; #ifdef JAPANESE case 'J': ocode = J_JIS; break; case 'S': ocode = J_SJIS; break; #endif #ifdef CHINESE case 'B': ocode = C_BIG5 + 6; break; case 'C': ocode = C_ECNS11643 + 6; break; #endif /* CHINESE */ case 'L': strcpy (lang, optarg); break; default: usage (); break; } } if (optind) { optind--; argc -= optind; argv += optind; } strcpy (nlspath, LIBDIR); strcat (nlspath, "/%L/%N"); cd = msg_open ("wnnstat.msg", nlspath, lang); rb.buf = (char *) malloc ((unsigned) (rb.size = 0)); if ((server_env = get_server_env (lang)) == NULL) { server_env = WNN_DEF_SERVER_ENV; } if (argc > 1) { serv = argv[1]; } else if (!(serv = getenv (server_env))) { serv = ""; } if (!*serv) { if (serv = _wnn_get_machine_of_serv_defs (lang)) { if ((js = js_open_lang (serv, lang, WNN_TIMEOUT)) == NULL) { serv = ""; } } } if (js == NULL && (js = js_open_lang (serv, lang, WNN_TIMEOUT)) == NULL) { out ("%s:", prog); if (serv && *serv) out (serv); out (wnn_perror_lang (lang)); putchar ('\n'); /* out(" jserver と接続出来ません。\n"); */ exit (-1); } switch (com) { case W_WHO: who (lang); break; case W_ALL: if ((c = js_env_list (js, &rb)) == -1) err (); w = (WNN_ENV_INFO *) rb.buf; printall (w, c); break; case W_ENV: if ((c = js_env_list (js, &rb)) == -1) err (); w = (WNN_ENV_INFO *) rb.buf; printpat (w, c); break; case W_DIC: dic (); break; case W_DIC_ALL: dic_all (); break; case W_FILE: file_all (); break; case W_VERSION: js_version (js, &i, &j); printf ("Jserver Version %x, Jlib Version %x\n", i, j); } js_close (js); exit (0); } static void printall (w, c) WNN_ENV_INFO *w; int c; { int i, j; /* out("Env No.\t環境名\t参照数\t付属語\t辞書数(辞書No.)\t\tファイル\n"); */ out (msg_get (cd, 1, "Env No.\tEnv Name\tRefs\tGrammer\tDicts(Dict No.)\t\tFile\n", NULL)); for (i = 0; i < c; i++, w++) { out ("%d\t%s\t%d\t%d\t%d(", w->env_id, w->env_name, w->ref_count, w->fzk_fid, w->jishomax); for (j = 0; j < w->jishomax; j++) { if (w->jisho[j] != -1) out ("%d ", w->jisho[j]); } out (")\t"); for (j = 0; j < WNN_MAX_FILE_OF_AN_ENV; j++) { if (w->file[j] != -1) out ("%d ", w->file[j]); } putchar ('\n'); } } static void printpat (w, c) WNN_ENV_INFO *w; int c; { int i; /* out("Env No.\t環境名\t参照数\n"); */ out (msg_get (cd, 2, "Env No.\tEnv Name\tRefs\n", NULL)); for (i = 0; i < c; i++, w++) { out ("%d\t%s\t%d\n", w->env_id, w->env_name, w->ref_count); } } static void err () { out (wnn_perror ()); putchar ('\n'); exit (-1); } static void usage () { #ifdef JAPANESE fprintf (stderr, "wnnstat [-weEdDfFUSJV] [-L lang_name] [server_name]\n"); #endif /* JAPANESE */ #ifdef CHINESE fprintf (stderr, "cwnnstat [-weEdDfFUBCV] [-L lang_name] [server_name]\n"); #endif /* CHINESE */ #ifdef KOREAN fprintf (stderr, "kwnnstat [-weEdDfFUKV] [-L lang_name] [server_name]\n"); #endif /* KOREAN */ exit (-1); } static void who (lang) char *lang; { WNN_JWHO *w; int c, k, j; struct wnn_env *env; if ((env = js_connect_lang (js, WNNSTAT_ENV, lang)) == NULL) err (); if ((c = js_who (js, &rb)) == -1) err (); w = (WNN_JWHO *) rb.buf; /* out("ユーザ名:ホスト名\t(ソケットNo.)\t環境番号\n"); */ out (msg_get (cd, 3, "User name:Host name\t(socket)\tEnv No.\n", NULL)); for (k = 0; k < c; k++, w++) { if (w->env[0] == env->env_id) continue; out ("%s:%s\t\t(%d)\t\t", w->user_name, w->host_name, w->sd); for (j = 0; j < WNN_MAX_ENV_OF_A_CLIENT; j++) { if (w->env[j] != -1) { out ("%d ", w->env[j]); } } out ("\n"); } exit (c - 1); } static void dic () { char ch[256]; WNN_DIC_INFO *w; int c, k; if ((c = js_dic_list_all (js, &rb)) == -1) err (); w = (WNN_DIC_INFO *) rb.buf; /* out("No.\t種類\tニックネーム\tファイル\t\n"); */ out (msg_get (cd, 4, "No.\tDict type\tName\tFile\n", NULL)); for (k = 0; k < c; k++, w++) { wsttost (ch, w->comment); out ("%d:%s\t%s\t%d:%s", w->dic_no, w->type & 0xff00 ? ((w->type & 0xff00) == (BWNN_REV_DICT & 0xff00) ? bwnn_dic_types[0x00ff & w->type] : cwnn_dic_types[0x00ff & w->type]) : wnn_dic_types[w->type], ch, w->body, w->fname); if (w->hindo != -1) { out ("(%d)\n", w->hindo); } else { out ("\n"); } } } static void dic_all () { char ch[256]; WNN_DIC_INFO *w; int c, k; if ((c = js_dic_list_all (js, &rb)) == -1) err (); w = (WNN_DIC_INFO *) rb.buf; /* out("No.種類\t正/逆\t語数\t更新(頻)使用 プライオリティ\t[ニックネーム]\tファイル[(頻度)]\t[パスワード(頻度)]\n"); */ out (msg_get (cd, 5, "No.Dict type\tN/R\tWords\tR/W(F)Use Priorty\t[Name]\tFile[(Freq)]\t[Passwd(Freq)]\n", NULL)); for (k = 0; k < c; k++, w++) { wsttost (ch, w->comment); out ("%d:%s\t%s\t%d\t%s(%s)\t%s %d\t", w->dic_no, w->type & 0xff00 ? ((w->type & 0xff00) == (BWNN_REV_DICT & 0xff00) ? bwnn_dic_types[0x00ff & w->type] : cwnn_dic_types[0x00ff & w->type]) : wnn_dic_types[w->type], /* w->rev ? "逆変換":"正変換", w->gosuu, (w->rw)? "不":"可", (w->hindo_rw)? "不":"可", (w->enablef)? "中":"停止", */ w->rev ? msg_get (cd, 6, "Rev", NULL) : msg_get (cd, 7, "Norm", NULL), w->gosuu, (w->rw) ? msg_get (cd, 8, "Y", NULL) : msg_get (cd, 9, "N", NULL), (w->hindo_rw) ? msg_get (cd, 8, "Y", NULL) : msg_get (cd, 9, "N", NULL), (w->enablef) ? msg_get (cd, 10, "Y", NULL) : msg_get (cd, 11, "N", NULL), w->nice); if (*ch) out ("%s\t", ch); out ("%d:%s\t", w->body, w->fname); if (w->hindo != -1) { out ("(%d:%s)\t", w->hindo, w->hfname); } if (w->passwd[0]) out ("%s", w->passwd); if (w->hpasswd[0]) out ("(%s)", w->hpasswd); out ("\n"); } } static void file_all () { char *d; WNN_FILE_INFO_STRUCT *w; int c, k; if ((c = js_file_list_all (js, &rb)) == -1) err (); w = (WNN_FILE_INFO_STRUCT *) rb.buf; /* out("Fid\t種類\t場所\t参照数\t\tファイル名\n"); */ out (msg_get (cd, 12, "Fid\tType\tL/R\tRefs\t\tFile\n", NULL)); for (k = 0; k < c; k++, w++) { switch (w->type) { case WNN_FT_DICT_FILE: /* d = "辞書"; */ d = msg_get (cd, 13, "Dict", NULL); break; case WNN_FT_HINDO_FILE: /* d = "頻度"; */ d = msg_get (cd, 14, "Freq", NULL); break; case WNN_FT_FUZOKUGO_FILE: /* d = "付属語"; */ d = msg_get (cd, 15, "Gram", NULL); break; } out ("%d\t%s\t%s\t%d\t%s\n", w->fid, d, w->localf ? "LOCAL" : "REMOTE", w->ref_count, w->name); } } static void wsttost (c, w) char *c; w_char *w; { while (*w) { if (*w & 0xff00) *c++ = (*w & 0xff00) >> 8; *c++ = *w++ & 0x00ff; } *c = 0; } static void out (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8, *a9, *a10, *a11, *a12, *a13; { int len; char buf[1024]; char jbuf[1024]; sprintf (buf, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); len = strlen (buf); switch (ocode) { #ifdef JAPANESE case J_EUJIS: #endif #ifdef CHINESE case C_EUGB: case (C_EUGB + 4): case (C_ECNS11643 + 6): #endif /* CHINESE */ #ifdef KOREAN case K_EUKSC: #endif strncpy (jbuf, buf, len + 1); break; #ifdef JAPANESE case J_JIS: eujis_to_jis8 (jbuf, buf, len + 1); break; case J_SJIS: eujis_to_sjis (jbuf, buf, len + 1); break; #endif #ifdef CHINESE case (C_BIG5 + 6): ecns_to_big5 (jbuf, buf, len + 1); break; #endif /* CHINESE */ #ifdef KOREAN case K_KSC: euksc_to_ksc (jbuf, buf, len + 1); break; #endif /* KOREAN */ } printf ("%s", jbuf); }