#include <stdio.h>    /*  ******* jdiclook.c  ***** */
#include <string.h>   /* jsymbck, shuushifu, remSymb, digit, nengetsu */
#include <ctype.h>    /* diclook, dictread, decompose, kiridashi */
		      /* hantei, yakSaiyo, codeCk */
#include <process.h>  /*             for MS-C & TURBO C++ */
/*     #include <stdlib.h>      for Latice C         */
#include "jehonfnc.h"  /* leftCk */

#define USER


#include "macro.h"


static int  shuushifu(char wdh[]);
static int  remSymb(void);
static void digit(void);
static void hankaku_digit(void);
static int  dictread(int ppt, char jer[], int *page_end, int *Exit_pt);
static int  wdCheck(int j, char jer[]);
/* static int hikiNaoshi(char jpw[], char jer[], int *serrq, int code_ck,int nx, int *Exit_pt, char hzn); */
/* static void shp_nb_del(char *ptsh); */
static void serr_init(void);
static int  decompose(char jer[], int j, char jew[], int *Exit_pt);
static void  kiridashi(char jew[], char egw[], char wdx[], char jpw[],
                                                    char zkw[], int *Exit_pt, char wdw[]);
static int  hantei(char zkw[], char wdw[], char egw[], char jpw[], char wdx[]);
static int  icchi_case(char jpw[], char wdw[], char egw[], char wdx[], char zkw[]);
static int  fukushi_hantei(char jpw[], char wdw[]);
static int  zenchi_hantei(char jpw[], char zkw[], char wdw[]);
static int  miz_onb_mei(int lnw, char wdw[], char jer[]);
static void yakSaiyo(char jpw[], char egw[], char zkw[], char wdx[],
						                               char wdp[], char wdw[]);
static int  codeCk(char egw[]);
static int  leftCk(char z);
static void too_many_yakugo(void);
static void zokusei_saiyou(char egw[], char zkw[], char jpw[], char wdp[]);
static int  nxt_ppt(int nx, int ppt, char wdw[]);

#include "honyavar.h"



int  jsymbck(char wdh[])                /*  記号や数字の処理   */
begin     /* global variables: wc, jwd[], pwd[], caj[][], caz[][], conj_chr */
   register int i;
   int ln, lnh, lndots, j2, symb;
   char jwd0[3], jwd1[JWordLen], jwd2[3], jwd3[3], jwd4[3];

   for (i = 0; i <= YakMaxCt; i++) {
   _  caj[i][0] = '\0';
   _  caz[i][0] = '\0';
   }
   symb = 0;
   if ((strcmp(jwd,"「") == 0) || (strcmp(jwd,"」") == 0)) {
   _  strcpy(jwd,"”");
   _  ptreplace(wdh,2,"”");
   }
   if (strcmp(jwd,"（") == 0) {
   _  strcpy(caj[0],"|(");    /* 大括弧の処理 */
   _  strcpy(caz[0],"|");
   _  symb = 1; /* 注目している日本語単語 jwd[] が記号なら symb = 1 とする。*/
   }
   else {
   _  if (strcmp(jwd,"）") == 0) {
   _  _  strcpy(caj[0],"|)");
   _  _  strcpy(caz[0],"|");
   _  _  symb = 1;
   _  }
   _  else {
   _  _  if (strcmp(jwd,"；") == 0)  {
   _  _  _  strcpy(caj[0],"0;");    /* セミコロンの処理 */
   _  _  _  strcpy(caz[0],"|");  /* 2002.06.30 補足した。*/
   _  _  _  symb = 1; /* 注目している英単語 wd[] が記号なら symb = 1 とする。*/
   _  _  }
   _  _  else {
   _  _  _  if (strcmp(jwd,"’") == 0)  {
   _  _  _  _  caj[0][0] = '|';     /* １重引用符の処理 */
   _  _  _  _  caj[0][1] = '\'';
   _  _  _  _  caj[0][2] = '\0';
   _  _  _  _  strcpy(caz[0],"|");  /* 2002.06.30 補足した。*/
   _  _  _  _  symb = 1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (strcmp(jwd,"”") == 0)  {
   _  _  _  _  _  caj[0][0] = '|';     /* ２重引用符の処理 */
   _  _  _  _  _  caj[0][1] = '\"';
   _  _  _  _  _  caj[0][2] = '\0';
   _  _  _  _  _  strcpy(caz[0],"|");  /* 2002.06.30 補足した。*/
   _  _  _  _  _  symb = 1;
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     symb = shuushifu(wdh);  /*  終止符号の処理  */
   _  _  _  }
   _  _  }
   _  }
   }
   if (! symb) {
   _  if ((strcmp(jwd,"：") == 0) || (*jwd == ':'))  {
   _  _  strcpy(caj[0],"0:");    /* コロンの処理 */
   _  _  strcpy(caz[0],"|");  /* 2002.06.30 補足した。*/
   _  _  symb = 1;
   _  _  if (*jwd == ':') {   /* 半角コロンの場合も同様。*/
   _  _  _  *(jwd + 1) ='\0';   /* 2001.05.29 挿入した。*/
   _  _  _  strcpy(caz[0],"半");
   _  _  }
   _  }
   _  else {
   _  _  if (jwd == strstr(jwd,"・・")) {/* 連続する中黒はピリオドに変換する */
   _  _  _  lndots = (strlen(jwd)/2);
   _  _  _  strcpy(caj[0],"0..........");
   _  _  _  caj[0][lndots + 1] = '\0';
   _  _  _  strcpy(caz[0],"|");  /* 2002.06.30 補足した。*/
   _  _  _  symb = 1;
   _  _  }
   _  _  else {
   _  _  _  if (jwd == strstr(jwd,"...")) {
   _  _  _  _  caj[0][0] = '0';
   _  _  _  _  strcpy(caj[0] + 1,jwd);
   _  _  _  _  strcpy(caz[0],"|");  /* 2002.06.30 補足した。*/
   _  _  _  _  symb = 1;
   _  _  _  }
   _  _  _  else
   _  _  _     symb = remSymb();       /* 挿入文、注釈文を表す記号の処理 */
   _  _  }
   _  }
   }
   if (! symb) {
   _  ln = strlen(jwd);
   _  ptcpy(jwd0,jwd,jwd + 2);
   _  strcpy(jwd1,jwd + 2);        /* 数字の処理  */
   _  if (strstr("０１２３４５６７８９",jwd0)) {
   _  _  if ( wc && (az[wc][0][0] == '#') && (az[wc][0][2] != '1') )
   _  _     symb = 0;
   _  _  else {
   _  _  _  if ( (ln == 4) && strstr("０１２３４５６７８９．",jwd1) ) {
   _  _  _  _  digit();               /* 全角数字の処理 */
   _  _  _  _  symb = 1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  lnh = strlen(wdh);
   _  _  _  _  if ( ((strcmp(jwd1,"，") == 0) || (strcmp(jwd1,"、") == 0)) && (lnh > 10) ) {
   _  _  _  _  _  ptcpy(jwd2,wdh + 4,wdh + 6);
   _  _  _  _  _  ptcpy(jwd3,wdh + 6,wdh + 8);
   _  _  _  _  _  ptcpy(jwd4,wdh + 8,wdh + 10);
   _  _  _  _  _  if ( strstr("０１２３４５６７８９",jwd2) && strstr("０１２３４５６７８９",jwd3) && strstr("０１２３４５６７８９",jwd4) ) {
   _  _  _  _  _  _  digit();    /* 全角数字の区切りの「、」 */
   _  _  _  _  _  _  symb = 1;   /* 2005.10.06 */
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if ( (ln == 2) && (wc >= 0) ) {
   _  _  _  _  _  _  if ( aj[wc][0][1] && strchr("0123456789",aj[wc][0][1]) ) {
   _  _  _  _  _  _  _  digit();               /* 全角数字の処理 */
   _  _  _  _  _  _  _  symb = 1;
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  if ( (strcmp(jn[wc],"第") == 0) && (strcmp(wdh + 2,"課") == 0) ) {
   _  _  _  _  _  _  _  _  digit();               /* 全角数字の処理 */
   _  _  _  _  _  _  _  _  symb = 1;
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  else {
   _  _  if (strchr("0123456789,",*jwd0)) { 
               /* TURBO_C で isdigit() に誤動作あり。*/
   _  _  _  if ( strchr("0123456789,",*(jwd0 + 1)) && (! strchr("0123456789,",*jwd1)) ) { 
   _  _  _     *(jwd + 2) = '\0';
   _  _  _  _  hankaku_digit();     /* 半角数字の処理 */
   _  _  _  _  symb = 1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if ((! strchr("0123456789,",*(jwd + 1))) && (*(jwd0 + 1) != ','))
               /* BOLAND_C で isdigit() に誤動作あり。*/
   _  _  _  _     *(jwd + 1) = '\0';
   _  _  _  _  hankaku_digit();     /* 半角数字の処理 */
   _  _  _  _  symb = 1;
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if ( (('A' <= *jwd0) && (*jwd0 <= 'z')) && (('A' <= *(jwd0 + 1)) && (*(jwd0 + 1) <= 'z')) && ((*jwd1 < 'A') || ('z' < *jwd1))) {
   _  _  _  _  jwd[2] = '\0';              /* isalpha() が効かない。*/
   _  _  _  _  caj[0][0] = '1';
   _  _  _  _  strcpy(caj[0] + 1,jwd);
   _  _  _  _  strcpy(caz[0],"Y|");         /* 2002.08.25 補足した。*/
   _  _  _  _  symb = 1;
   _  _  _  }
   _  _  }
   _  }
   }
   if ((! symb) && (ln == 2)) {
   _  j2 = instr("ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ",jwd);
   _  if (j2) {
   _  _  caj[0][0] = '1';
   _  _  caj[0][1] = 'A' + ((j2 - 1)/2);
   _  _  caj[0][2] = '\0';
   _  _  strcpy(caz[0],"|");  /* 2002.06.30 補足した。*/
   _  _  symb = 1;
   _  }
   }
   return(symb);
end

static int  shuushifu(char wdh[])  /*  終止符号の処理  */
begin  /* global variables: jwd[], caj[][], caz[][] */
   int  symb = 0;
   char *ptper;

   if (strcmp(jwd,"、") == 0)  {  /* カンマの処理  */
   _  strcpy(caj[0],"0,");
   _  symb = 1;
   }
   else {
   _  if (strcmp(jwd,"。") == 0)  { /* ピリオドの処理  */
   _  _  strcpy(caj[0],"0.");
   _  _  strcpy(caz[0],".");
   _  _  symb = 1;
   _  }
   _  else {
   _  _  if (strstr(jwd,"．．"))  {  /*  連続するピリオドの処理  */
   _  _  _  strcpy(caj[0],"0..");
   _  _  _  ptper = wdh + 4;
   _  _  _  while(strstr(ptper,"．") == ptper) {
   _  _  _  _  strcat(jwd,"．");
   _  _  _  _  strcat(caj[0],".");
   _  _  _  _  ptper += 2;
   _  _  _  }
   _  _  _  symb = 1;
   _  _  }
   _  _  else {
   _  _  _  if (strcmp(jwd,"！") == 0)  { /* 感嘆符の処理  */
   _  _  _  _  strcpy(caj[0],"!!");
   _  _  _  _  strcpy(caz[0],"!");
   _  _  _  _  symb = 1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (strcmp(jwd,"？") == 0)  { /* 疑問符の処理  */
   _  _  _  _  _  strcpy(caj[0],"??");
   _  _  _  _  _  strcpy(caz[0],"?");
   _  _  _  _  _  symb = 1;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   if (! symb) {
   _  if (strcmp(jwd,"・") == 0) {
   _  _  strcpy(caj[0],"9 ");
   _  _  symb = 1;
   _  }
   }
   return(symb);
end


static int  remSymb(void)       /* 挿入文、注釈文を表す記号の処理 */
begin   /* global variables:  jwd[], caj[][], caz[][] */
   int  symb = 0;
   char mj;
   
   if ((strcmp(jwd,"-") == 0) || (strcmp(jwd,"--") == 0))  {
   _  sprintf(caj[0],"0 %s ",jwd);         /* マイナス記号の処理  */
   _  symb = 1;   /* もしも "--" が wdh[] の中で対になっていれば */
   }            /*    jpredit() で "%" に変化している。 */
   else {
   _  if (jwd[0] == '%')  { /* パーセント記号 % の処理  */
   _  _  strcpy(caj[0],jwd);
   _  _  strcpy(caz[0],jwd);
   _  _  symb = 1;
   _  }
   _  else {
   _  _  mj = jwd[0];
   _  _  if (mj == '#' || mj == '*' || mj == '%') {
   _  _  _  caj[0][0] = mj;
   _  _  _  caj[0][1] = '\0';
   _  _  _  strcpy(caz[0],jwd);
   _  _  _  symb = 1;
   _  _  }
   _  }
   }
   if (! symb) {
   _  if (strcmp(jwd,"−") == 0) {
   _  _  strcpy(caj[0],"0-");   /* 全角ハイフンの処理  */
   _  _  symb = 1;                      /* 2001.01.17 追加した。 */
   _  }
   }
 return(symb);
end


static void digit(void)  /* 数字の処理 */
begin       /* global variables: jwd[], pwd[], caj[], caz[], aj[][], az[][] */
   char hankaku[17];  /* 全角の数字はすべて半角文字に変換する。 */

   nzentohan(jwd,hankaku);
   strcpy(caj[0],"1");
   strcat(caj[0],hankaku);
   strcpy(caz[0],"n|全");
end

static void hankaku_digit()     /* 半角数字の処理 */
begin       /* global variables: jwd[], pwd[], caj[], caz[], aj[][], az[][] */

   strcpy(caj[0],"1");
   strcat(caj[0],jwd);
   strcpy(caz[0],"n|半");
end


void diclook(int ppt, char wdx[], char wdw[], char wdp[], int *Exit_pt, char hzn)
            /* 辞書を引く */
begin       /* global var: jwd[], pwd[], conj_chr, SERR */
  int j, yn, nx, serrq, page_end, coincide, code_ck;
  unsigned int lnw, errln;
  char jer[256], jew[170], egw[WordLen], jpw[JWordLen], zkw[33], jwdq[JWordLen], *ptcol, *ptbar;

  jer[254] = '\0';
  serrq = SERR;
  if (serrq > 0)
     errln = strlen(jn[SERRNB]);
  while (ppt > 0)  {
  _  nx = dictread(ppt,jer,&page_end,Exit_pt);    /* 辞書からデータを読み込む。 */
  _  if ((! page_end) && (! *Exit_pt)) {
#if defined(USER)
  _  _  if (WATCHPT) {
  _  _  _  color_magenta;
  _  _  _  printf("\n 注目している単語 %s が登録されているはずの頁の１部分です。\n",WTWORD);
  _  _  _  color_white;
  _  _  _  printf("   %s \n",jer);
  _  _  _  if (Dbg2 == 'Y')
  _  _  _     fprintf(dbgfl_pt,"\n 注目している単語 %s が登録されているはずの頁の１部分です。\n    %s \n",WTWORD,jer);
  _  _  }
#endif
  _  _  j = instr(jer,jwd);
  _  _  if ((! j) && (conj_chr == 'D') && (strlen(jwd) >= 6)) {
  _  _  _  strcpy(jwdq,jwd);   /* 「（に）向かっていななく」に対処した。2002.09.10 */
  _  _  _  *(jwdq + strlen(jwd) - 2) = '\0';
  _  _  _  j = instr(jer,jwdq);
  _  _  }
  _  _  lnw = strlen(jwd);
  _  _  if ((! j) && (cnb >= 0) && (caj[cnb][0] == '3') ) /* 辞書に原形だけでなく未然、音便、*/
  _  _     j = miz_onb_mei(lnw,wdw,jer); /* 命令形が登録されている可能性を調べる。2004.08.10 */
  _  _  while (j) {
  _  _  _  if (serrq > 0) {     /* 埋め込み型熟語の失敗回復時の jwd[] チェック */
  _  _  _  _  j = wdCheck(j,jer);
  _  _  _  _  serrq = SERR;
  _  _  _  _  if (! j)
  _  _  _  _     break;
  _  _  _  }
  _  _  _  coincide = decompose(jer,j,jew,Exit_pt);
                /* 辞書のページ jer からひとつの単語の項 jew[] を切り出す。*/
  _  _  _  if (*Exit_pt == 1)
  _  _  _     goto ENDDKL;
  _  _  _  if (coincide) {
  _  _  _  _   kiridashi(jew,egw,wdx,jpw,zkw,Exit_pt,wdw);
                   /* 辞書データから和単語、英訳語、属性を切り出す。*/
  _  _  _  _  if (conj_chr && coincide && *jew)
  _  _  _  _     code_ck = codeCk(egw);  /* 属性コードのチェック */
  _  _  _  _  else
  _  _  _  _     code_ck = 1;
  _  _  _  _  lnw = strlen(jpw);
  _  _  _  _  if (*jpw && code_ck) {
  _  _  _  _  _  lnw = strlen(egw) - 1;
  _  _  _  _  _  if (egw[lnw] == '>') {
  _  _  _  _  _  _  cutoff(egw,lnw - 1,2);
  _  _  _  _  _  _  lnw -= 2;
  _  _  _  _  _  }                /* 訳語に採用するか否かの判定 */
  _  _  _  _  _  yn = hantei(zkw,wdw,egw,jpw,wdx);
  _  _  _  _  _  if (yn)
  _  _  _  _  _     yakSaiyo(jpw,egw,zkw,wdx,wdp,wdw);
                                 /* 新しく訳語に採用する手続き */
  _  _  _  _  }
  _  _  _  }
  _  _  _  if (coincide)
  _  _  _     cutoff(jer,0,strlen(jew));
  _  _  _  else {
  _  _  _  _  ptcol = strchr(jer + j - 1 + strlen(jwd),':');
  _  _  _  _  if (ptcol)
  _  _  _  _     ptptcut(jer,ptcol);
  _  _  _  _  else {
  _  _  _  _  _  beeping(15);
  _  _  _  _  _  printf("\n dictionary data error!!  \n    jer = %s \n",jer);
  _  _  _  _  _  exit(1);
  _  _  _  _  }
  _  _  _  }
  _  _  _  j = instr(jer,jwd);
  _  _  _  if ( (! j) && (cnb > -1) && (strlen(jwd) == 4) && (caj[0][0] == '1') && (wdw + 4 == strstr(wdw + 4,"、")) ) {
  _  _  _  _  ptbar = strstr(caz[0],"|用5");
  _  _  _  _  if (ptbar) {               /* 「話し、そして．．．」に対応した。*/
  _  _  _  _  _  strcpy(jwdq,jwd);       /* 2003.11.22 */
  _  _  _  _  _  strcpy(jwdq + strlen(jwd) - 2,ptbar + 4);
  _  _  _  _  _  j = instr(jer,jwdq);
  _  _  _  _  }
  _  _  _  }
  _  _  _  else {
  _  _  _  _  lnw = strlen(jwd);
  _  _  _  _  if ((! j) && (cnb >= 0) && (caj[cnb][0] == '3') )
  _  _  _  _     j = miz_onb_mei(lnw,wdw,jer);
  _  _  _  }
  _  _  }
  _  _  ppt = nxt_ppt(nx,ppt,wdw); /* 次のレコードポインター ppt を定める。*/
  _  }
  _  else
  _     if (nx == 0)
  _        ppt = -2;
  }
 ENDDKL:;
end


static int dictread(int ppt, char jer[], int *page_end, int *Exit_pt) /* 辞書からデータを読み込む。 */
begin
   int j, nx = -1;
   long ptl;
   char *ptc, *pta;

   rewind(jed);
   ptl = (long)(ppt - 1) * 256L;
   if (fseek(jed,ptl,SEEK_SET)) {
   _  printf("dictionary seek error !! \n");
   _  printf("辞書のあるドライブを正しく指定しましたか？？ \n");
   _  *Exit_pt = 1;
   _  goto ENDDR;
   }
   fread(jer,252,1,jed);
   fscanf(jed,"%4d",&nx);
   *(jer + 251) = '\0';
   *page_end = 0;
   str_rchr(jer,':',ptc,pta);
   if (ptc)
      *(ptc + 1) = '\0';
   else {
   _  if (*jer) {
   _  _  if (*jer == ' ') {
   _  _  _  *jer = '\0';
   _  _  _  *page_end = 1;
   _  _  }
   _  _  else {
   _  _  _  printf("辞書データに欠陥があります。辞書ユーティリティを使って修正してください。\n");
   _  _  _  printf("ppt = %d  jer = %s \n\n",ppt,jer);
   _  _  _  for (j = 0; j <= wc; j++)
   _  _  _     printf("\n  aj[%d][0] = %s \n",j,aj[j][0]);
   _  _  _  *Exit_pt = 1;
   _  _  }
   _  }
   _  else
   _     *page_end = 1;
   }
  ENDDR:
   return(nx);
end
  
static int wdCheck(int j, char jer[])
begin         /* 埋め込み型熟語の失敗による辞書の引き直しの jwd[] チェック */
  /* global variables: SERR, SERRNB, jn[][], jwd[], conj_chr */
   int  j0;
   
     if ((jer + j - 1) == strstr(jer + j - 1,jn[SERRNB])) {
     _  while ( (jer + j - 1) == strstr(jer + j - 1,jn[SERRNB]) ) {
     _  _  printf("\n jn[SERRNB] search:  j = %d,  cnb = %d, caj[cnb] = %s,  jer + j = %s ",j,cnb,caj[cnb],jer + j);
     _  _  j0 = instr(jer + j + 9,jn[SERRNB]);
     _  _  if (! j0)
     _  _    break;
     _  _  else {
     _  _  _  j += (9 + j0);
     _  _  _  printf("\n jn[SERRNB] search No.2 :  j = %d, jwd[] = %s, jer + j - 1 = %s ",j,jwd,jer + j - 1);
     _  _  }
     _  }
     _  serr_init();
     _  j0 = instr(jer + j + 2,jwd);
     _  if (! j0)
     _     j = j0;
     _  else {
     _  _  j += (j0 + 2);
     _  _  printf("\n jn[SERRNB] search 脱出。:  j = %d, jer + j = %s ",j,jer + j);
	 _  }
	 }
   return(j);
end

static void serr_init(void)  /* 失敗した単語のデータを再初期化する。*/
begin     /* global variables: SERR, SERRNB, wnb, jn[][], shpfg */
register int i;

   if (SERRNB > wnb)
      jn[SERRNB][0] = '\0';
   else {
   _  for (i = SERRNB; i <= wnb; i++)
   _     jn[i][0] = '\0';
   }
   SERR = 0;
   shpfg = '\0';
end


static int  decompose(char jer[], int j, char jew[], int *Exit_pt)
begin                     /* 辞書のページからひとつの単語の項を切り出す。*/
   int  lim, ln, lnz, coincide;       /* globale variables: jwd[] */
   char *ptc;

   lim = JWordLen + WordLen + ZokuLen -2;
   ln = strlen(jer);
   coincide = 1;
   if (j > 1 && jer[j - 2] != ':')
      coincide = 0;
   else {
   _  if (j > 1) {
   _  _  cutoff(jer,0,j - 1);
   _  _  ln -= (j - 1);
   _  }
   _  ptc = strchr(jer,':');
   _  lnz = strlen(ptc);
   _  if ((ln - lnz) < lim)
   _     ptcpy(jew,jer,++ptc);
   _  else {
   _  _  *(jew + lim) = '\0';
   _  _  ln -= lnz;
   _  _  printf("１単語のデータが長過ぎます !!   jew = %s  strlen(jew) = %d  jer = %s \n",jew,ln,jer);
   _  _  printf("辞書メンテナンス・ユーティリティで、辞書登録をやり直して下さい！！");
   _  _  for (j = 0; j <= wc; j++)
   _  _     printf("\n  aj[%d][0] = %s \n",j,aj[j][0]);
   _  _  *Exit_pt = 1;
   _  }
   }
   return(coincide);
end

static void  kiridashi(char jew[], char egw[], char wdx[], char jpw[], char zkw[], int *Exit_pt, char wdw[])
       /* 辞書データから英単語、訳語、属性を切り出す。*/
begin  /* global variables: wc, conj_chr, aj[][][] */
   register int j;
   unsigned int  ln, lnx, lnz;
   char *jw, *jt, *ptsp, jpw_head[JWordLen];

   jw = strchr(jew,';');
   if (jw >= jew + JWordLen) {
   _  printf("日本語単語が長過ぎます !!  jew = %s \n",jew);
   _  printf("辞書メンテナンス・ユーティリティで、辞書登録をやり直して下さい！！");
   _  for (j = 0; j <= wc; j++)
   _    printf("\n  aj[%d][0] = %s \n",j,aj[j][0]);
   _  *Exit_pt = 1;
   _  goto ENDKIRI;
   }
   ptcpy(jpw,jew,jw);
   lnx = instrc(wdx,'#');
   if (lnx)
	  lnx--;
   else
      lnx = strlen(wdx);
   ln = instrc(jpw,'#');
   if (ln)
	  ln--;
   else
      ln = strlen(jpw);
   if ( (lnx > ln) || ((conj_chr == '1') && (ln > 4) && ((cnb < 0) || ((! strchr(caz[0],'ｻ')) && strcmp(jwd,"達")))) )
                  /* 倍角１文字にして引き直している場合に対応した。2002.10.25 */
      *jpw = '\0';  /* 既に採用されている日本語単語（熟語）より短いものは捨てる。*/
   else {
   _  jt = strchr(jw + 1,';');
   _  if (jt >= jw + 1 + WordLen) {
   _  _  printf("英単語が長すぎます。 jw = %s,  jw + WordLen = %s \n",jw, jw + WordLen);
   _  _  printf("辞書メンテナンス・ユーティリティで、辞書登録をやり直して下さい！！");
   _  _  for (j = 0; j <= wc; j++)
   _  _     printf("\n  aj[%d][0] = %s \n",j,aj[j][0]);
   _  _  exit(1);
   _  }
   _  if (*(jw + 1) == 'X') {
   _  _  if ((wdw != strstr(wdw,jpw)) && conj_chr && (! strchr("OzY",conj_chr)) && ((conj_chr != '0') || ((wdw + ln) != strstr(wdw + ln,"。"))))
   _  _    *jpw = '\0'; /* 間投詞は活用しないから、conj_chr が空でない時は捨てる。*/
   _  _  else {
   _  _  _  if ((wc == 0) && (aj[0][0][0] == '8')) {
   _  _  _  _  ptsp = strchr(egw + 2,' ');
   _  _  _  _  if (! ptsp)
   _  _  _  _     *jpw = '\0';
   _  _  _  _  else { /* 独立文（格言など）の先頭の冠詞だけ分離している場合 */
   _  _  _  _  _  if (! strchr(ptsp + 2,' '))
   _  _  _  _  _     *jpw = '\0';
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  if (*jpw) {
   _  _  ptcpy(egw,jw + 1,jt);
   _  _  lnz = strlen(jt + 1);
   _  _  if (lnz >= (ZokuLen - 2)) {
   _  _  _  printf("属性が長過ぎます。 ln = %d  属性(zkw) = %s \n",lnz,jt + 1);
   _  _  _  printf("辞書メンテナンス・ユーティリティで、辞書登録をやり直して下さい！！");
   _  _  _  for (j = 0; j <= wc; j++)
   _  _  _     printf("\n  aj[%d][0] = %s \n",j,aj[j][0]);
   _  _  _  *Exit_pt = 1;
   _  _  _  goto ENDKIRI;
   _  _  }
   _  _  ptcpy(zkw,jt + 1,jt + lnz); /* 属性を zkw にコピーする。 */
   _  _  if (*wdx && (ln > (lnx + 1)) && strcmp(wdx,jpw)) {
   _  _  _  ptcpy(jpw_head,jpw,jpw + ln - 2);
   _  _  _  if (wdw == strstr(wdw,jpw_head))
   _  _  _     conj_chr = '\0';
   _  _  }
   _  }
   }
  ENDKIRI:;
end

static int  hantei(char zkw[], char wdw[], char egw[], char jpw[], char wdx[]) /* 訳語に採用するか否かの判定 */
begin             /* global variables: conj_chr, cnb, caz[][], jwd[] */
   unsigned int ln, ln2, lnx;
   int  ja, yn;
   char z, *pts, *pt_bar, *nxt_wd, jgobi[7], jpw_tail[3], zkw1[ZokuLen];

   yn = 5;
   ln = strlen(jpw);
   if ( (conj_chr == '1') && (ln > 4) && ((cnb < 0) || ((! strchr(caz[0],'ｻ')) && strcmp(jwd,"達"))) ) {
   _  yn = 0;
   _  goto END;    /* 辞書引きに１度失敗して引き直しをしている場合。2002.10.25 */
   }
   lnx = strlen(wdx);
   if ( strchr(egw + 1,'<') && (wc < 0) ) {
   _  yn = 0;
   _  goto END;    /* 前の単語を取り込む熟語は文頭には来ない。2005.06.02 */
   }
   ja = instrc(zkw,'<');
   if (*zkw && ja) {
   _  pts = strchr(zkw,'|');
   _  if (pts)
   _     ptcpy(zkw1,zkw,pts);
   _  else
   _     strcpy(zkw1,zkw);
   _  if ((strlen(zkw1) == 3) || (strlen(zkw1) == 4)) {
   _  _  z = zkw[++ja];
   _  _  yn = leftCk(z);    /* return 3 if O.K., else return 0 */
   _  }
   }
   if (yn && (*zkw == '$')) {
   _  ln2 = strlen(wdw);
   _  if (ln2 - ln < 4)   /* '$' に対応する部分の長さが 1 文字以下なら捨てる。*/
   _     yn = 0;
   }
   else {
   _  if ( (conj_chr == 'D') && (cnb >= 0) ) {
   _  _  if ( (strcmp(caj[cnb],egw) == 0) && strstr(caz[cnb],zkw) )
   _  _    yn = 0;  /* 辞書の２重引きを防ぐ条件を加えた。2002.09.10 */
   _  _  else {
   _  _  _  if ( (caj[cnb][0] != '3') && (*egw != '3') )
   _  _  _     yn = 0;
   _  _  }
   _  }
   }
   if ( yn && lnx && (ln <= (lnx - 2)) )
      yn = 0;  /* 既に見つかっている訳語候補より短い候補は捨てる（最長一致法）2002.09.10 */
   if (yn && (strcmp(jpw,"ためる") == 0) && (pts = strstr(wdw,"ために")) && pts && (pts == wdw) && (wc >= 0) && (aj[wc][0][0] == '3') )
      yn = 0; /* 「...するために」と「...をため（る）に」の混同を防いだ。2004.08.04 */
   if (yn && (strcmp(jpw,"かめ") == 0) && (((wdw + 4) == strstr(wdw + 2,"ない")) || ((wdw + 4) == strstr(wdw + 2,"なけ")) || ((wdw + 4) == strstr(wdw + 2,"なか"))) )
      yn = 0; /* 「かめない」が「かめ(jar)」+「ない(there is not)」と成るのを防いだ。 2004.08.25 */
   if ( (wc >= 0) && (cnb >= 0) && (strcmp(jn[wc],"に") == 0) && strstr(caz[cnb],"|に") ) {
   _  pt_bar = strchr(zkw,'|');
   _  if (! pt_bar)
   _     yn = 0;
   _  else {
   _  _  if ( (! strstr(pt_bar + 1,"に")) && strcmp(egw,"3do") )
   _  _     yn = 0; /* １つ前の単語が「に」のときは、「に」格を取らない動詞は捨てる。2004.08.27 */
   _  }
   }
   if (yn) {
   _  if (conj_chr == 'G' && strchr(zkw,'p'))
   _     yn = 0;
		/* "ing"語尾の単語の辞書引きをしている時は、動詞の過去形は捨てる。 */
   _  else {
   _  _  if (instr(wdw,jpw) == 1)
   _  _     yn = icchi_case(jpw,wdw,egw,wdx,zkw); /* 原文の先頭に一致した場合 */
   _  _  else {
   _  _  _  pts = strchr(jpw,'#');
   _  _  _  if (pts) /* 埋め込み型熟語の可能性をさぐる。*/
   _  _  _     yn = umeJukugo(pts,jpw,wdw);  /* conj.c モジュールに有る。*/
   _  _  _  else {
   _  _  _  _  if ((cnb >= 0) && (caj[cnb][0] == '1') && (*egw == '3')) {
   _  _  _  _  _  nxt_wd = wdw + lnx + 2;
   _  _  _  _  _  ptcpy(jgobi,wdw + lnx,nxt_wd);
   _  _  _  _  _  ptcpy(jpw_tail,jpw + lnx,jpw + lnx + 2);
   _  _  _  _  _  if ((strcmp(jgobi,"を") == 0) && (strcmp(jpw_tail,"を") != 0))
   _  _  _  _  _     yn = 0; /* 直後が「を」なら動詞連用形からの派生名詞 */
                             /* ただし、名詞 + 「をする」の場合が有りうる。*/
   _  _  _  _  _  if ((strcmp(jgobi,"に") == 0) && (strcmp(jpw_tail,"る") == 0) && (nxt_wd != strstr(nxt_wd,"行く")) && (nxt_wd != strstr(nxt_wd,"来る")) && (nxt_wd != strstr(nxt_wd,"出")))
   _  _  _  _  _     yn = 0;
                 /* 直後が「に」なら一段活用動詞連用形からの派生名詞 */
   _  _  _  _  }
   _  _  _  _  if (yn) {
   _  _  _  _  _  if (strchr("345",*egw) || (strcmp(egw,"6too") == 0) || ((*egw == 'X') && (strchr(egw,' '))))
   _  _  _  _  _     yn = jkatsuyou(*egw,jpw,wdx,wdw); /* 第２の条件を加えた。2004.04.07 */
						/* conj.c モジュールに有る。*/
   _  _  _  _  _  else {
   _  _  _  _  _  _  if ((*egw == '6') && (cnb < 0))
   _  _  _  _  _  _     yn = fukushi_hantei(jpw,wdw);
 			                /* 副詞の語尾が取れた形かどうか判定する。2000.11.27 */
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  if (*egw == '7')
   _  _  _  _  _  _  _     yn = zenchi_hantei(jpw,zkw,wdw);
			     /* 前置詞の語尾が取れた形かどうか判定する。*/
   _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _     yn = 0;
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
  _  }
   }
  END:;
   return(yn);
end


static int  icchi_case(char jpw[], char wdw[], char egw[], char wdx[], char zkw[])
                                       /* 原文の先頭に一致した場合 */
begin  /* global variables: wnb, cnb, az[][][], caj[][], caz[][]  */

   register int  i;
   unsigned int  lnj;
   int  yn = 1;
   char jgobi[7], nxt_wd[5];

   lnj = strlen(jpw);
   if (strcmp(jpw + lnj - 2,"で") == 0) {
   _  ptcpy(jgobi,wdw + lnj,wdw + lnj + 4);
   _  if ((strcmp(jgobi,"す。") == 0) || (strcmp(jgobi,"すか") == 0))
   _     yn = 0;
   _  else
   _     yn = 1;
   }
   else {
   _  if (strcmp(jpw,"はい") == 0) {
   _  _  ptcpy(jgobi,wdw + lnj,wdw + lnj + 2);
   _  _  if (! strstr("、。！」",jgobi))
   _  _    yn = 0;   /* "...はいちばん"に対応した。2004.07.14  「！」を追加した。2004.07.18 */
   _  _  else
   _  _    yn = 1;
   _  }
   _  else {
   _  _  if (strcmp(jpw,"空の") == 0) {
   _  _  _  ptcpy(jgobi,wdw + lnj,wdw + lnj + 2);
   _  _  _  if (strcmp(jgobi,"上") == 0)
   _  _  _    yn = 0;   /* 「空（くう）の」と「空（そら）の」を区別した。2004.08.28 */
   _  _  _  else
   _  _  _    yn = 1;
   _  _  }
   _  _  else {
   _  _  _  ptcpy(nxt_wd,wdw + lnj,wdw + lnj + 2);
   _  _  _  if (*egw == '6') {
   _  _  _  _  if (strcmp(jpw + lnj - 2,"く") == 0) {
   _  _  _  _  _  if (strcmp(nxt_wd,"て") == 0)
   _  _  _  _  _     yn = 0;              /* 形容詞連用形と副詞の混同 */
   _  _  _  _  _  else
   _  _  _  _  _     yn = 1;
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if (strcmp(jpw + lnj - 2,"に") == 0) {
   _  _  _  _  _  _  if ((cnb >= 0) && (caj[cnb][0] == '5'))
   _  _  _  _  _  _     yn = 1;  /* 「静かな」と「静かに」は両方採用する。2002.07.16 */
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (strcmp(jpw + lnj - 2,"い") == 0) {
   _  _  _  _  _  if ( ((*egw == '1') || (*egw == 'X')) && strstr(az[wnb][0],"OJ") && (strcmp(nxt_wd,"て") == 0) )
   _  _  _  _  _     yn = 0;  /* ２番目の条件を加えた。「...かい？」に対応。 2002.11.17 */
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (((*egw == '4') || (*egw == '3')) && (((wdw + lnj - 2) ==  strstr(wdw + lnj - 2,"いできた")) || ((wdw + lnj - 2) == strstr(wdw + lnj - 2,"いでくる"))))
   _  _  _  _  _  _     yn = 0;  /* 「(風が)なぐ」=>「ないで」に対応した。2001.04.15 */
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  if ( (strcmp(jpw,"も良い") == 0) && ((aj[wc][0][0] != '3') || (! strchr(az[wc][0],'D'))) )
   _  _  _  _  _  _  _     yn = 0; /* "彼女も良いドラマー"に対応した。2002.07.26 */
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if ((strcmp(jpw,"からす") == 0) && ((wdw + lnj) == strstr(wdw + lnj,"べての")))
   _  _  _  _  _     yn = 0;    /* 2004.06.06 追加した。 */
   _  _  _  _  _  else {
   _  _  _  _  _  _  if ((strcmp(jpw,"ことば") == 0) && ((wdw + lnj) == strstr(wdw + lnj,"かり")))
   _  _  _  _  _  _     yn = 0;
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  if (strstr(zkw,"用5す") && (((wdw + lnj) == strstr(wdw + lnj,"て")) || ((wdw + lnj) == strstr(wdw + lnj,"た"))))
   _  _  _  _  _  _  _     yn = 0;        /* 「話し;1talk;yつ|用5す」+「て」に対応した。   2001.02.07 */
                                 /* 「貸し;5rental;c|用5す」+「た」のも対応した。 2001.03.13 */
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  if ( strstr(zkw,"用1る") && ((wdw + lnj) == strstr(wdw + lnj,"に")) && ((wdw + lnj + 2) == strstr(wdw + lnj + 2,jpw)) )
   _  _  _  _  _  _  _  _     yn = 0;   /* 「考え;1thought;sz|用1る」+「に」+「考える」に対応した。2002.08.16 */
   _  _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  _  if ( (*egw == 'X') && ((wdw + lnj) == strstr(wdw + lnj,"った")) )
   _  _  _  _  _  _  _  _  _     yn = 0;  /* 「そうだった」に対応。 2004.07.25 */
   _  _  _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  _  _  yn = 1; /* 原文（wdw）の先頭に一致しているので採用する。 */
   _  _  _  _  _  _  _  _  _  _  if ((cnb >= 0) && *wdx && (wdw != strstr(wdw,wdx)) && (strlen(wdx) == strlen(jpw)))  {
   _  _  _  _  _  _  _  _  _  _  _  for (i = 0; i <= cnb; i++) {
   _  _  _  _  _  _  _  _  _  _  _  _  caj[i][0] = '\0';
   _  _  _  _  _  _  _  _  _  _  _  _  caz[i][0] = '\0';
   _  _  _  _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  _  _  _  cnb = -1;
   _  _  _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   if ( yn && (wc >= 0) && (aj[wc][0][0] == '#') && az[wc][0][2] ) {
   _  if ( (*egw != az[wc][0][2]) && (! ((*egw == '2') && (az[wc][0][2] == '1'))) && (strcmp(jpw,wdw) == 0) )
   _     yn = 0; /* #熟語の埋め込み部分の品詞指定に合致しない訳語候補は捨てる。2005.01.29 */
   }
  return(yn);
end


static int  fukushi_hantei(char jpw[], char wdw[])
   /* 副詞の語尾が取れた形かどうか判定する。*/
begin
   int  yn = 0;
   unsigned int  lnj;
   char *ptwdln, jpwHead[JWordLen];

   lnj = strlen(jpw);
   if (lnj > 3) {
   _  ptwdln = wdw + lnj - 2;
   _  ptcpy(jpwHead,jpw,jpw + lnj - 2);
   }
   else
      *jpwHead = '\0';
   if (*jpwHead && (wdw == strstr(wdw,jpwHead)) && (strcmp(jpw + lnj - 2,"に") == 0) && ((ptwdln == strstr(ptwdln,"だ")) || (ptwdln == strstr(ptwdln,"で")))) {
   _  yn = 1;
   _  conj_chr = '0';
   }
   return(yn);
end



static int  zenchi_hantei(char jpw[], char zkw[], char wdw[])
   /* 前置詞の語尾が取れた形かどうか判定する。*/
begin
   int  yn = 0;
   unsigned int  lnj;
   char *ptbar, *ptwdln, zkw2[ZokuLen], jpwHead[JWordLen];

   lnj = strlen(jpw);
   ptbar = strchr(zkw,'|');
   if (ptbar)
      strcpy(zkw2,ptbar + 1);
   else
      *zkw2 = '\0';
   if (lnj > 3) {
   _  ptwdln = wdw + lnj - 2;
   _  ptcpy(jpwHead,jpw,jpw + lnj - 2);
   }
   else
      *jpwHead = '\0';
   if (ptbar && *jpwHead && strstr(zkw2,"の") && (wdw == strstr(wdw,jpwHead)) && (strcmp(jpw + lnj - 2,"に") == 0) && ((ptwdln == strstr(ptwdln,"だ")) || (ptwdln == strstr(ptwdln,"で"))) && (strcmp(jn[wc],"の") == 0)) {
   _  yn = 1;
   _  ptinsert(ptwdln,"に");
   }
   return(yn);
end


static int  miz_onb_mei(int lnw, char wdw[], char jer[])
      /* 辞書に原形だけでなく未然、音便、命令形が登録されている可能性を調べる。2004.08.10 */
begin         /* global variables: jwd[], cnb, caz[], shs[][], mzn[][], onb[][], mei[][]  */
   int  i, j;
   char jwdq[JWordLen];
   
   j = 0;
   if (  strchr(caz[cnb],'m') && ((wdw + lnw) == strstr(wdw + lnw,"ない")) ) {
   _  strcpy(jwdq,jwd + lnw - 2); /* 辞書に「かなう」と「かなわない」の両方が登録されている場合 */
   _  for (i = 0; i <= 8; i++) {  /* 2004.07.24 */
   _  _  if (strcmp(jwdq,shs[i]) == 0) {
   _  _  _  strcpy(jwdq,jwd);
   _  _  _  strcpy(jwdq + lnw - 2,mzn[i]);
   _  _  _  ptcons_replace(wdw + lnw - 2,2,mzn[i]);
   _  _  _  j = instr(jer,jwdq);
   _  _  _  break;
   _  _  }
   _  }
   }
   else {
   _  if ( strchr(caz[cnb],'D') && ((wdw + lnw + 2) == strstr(wdw + lnw + 2,"いる")) ) {
   _  _  ptcpy(jwdq,wdw + lnw,wdw + lnw + 2); /* 辞書に「かなう」と「かなっている」の両方が登録されている場合 */
   _  _  for (i = 0; i <= 8; i++) {  /* 2004.07.24 */
   _  _  _  if (strcmp(jwdq,shs[i]) == 0) {
   _  _  _  _  ptcons_replace(wdw + lnw,2,onb[i]);
   _  _  _  _  j = instr(jer,jwd);
   _  _  _  _  break;
   _  _  _  }
   _  _  }
   _  }
   _  else {
   _  _  if ( strchr(caz[cnb],'e') && ((wdw + lnw + 2) == strstr(wdw + lnw + 2,"られ")) ) {
   _  _  _  ptcpy(jwdq,wdw + lnw,wdw + lnw + 2); /* 辞書に「かなう」と「かなえられる」の両方が登録されている場合 */
   _  _  _  for (i = 0; i <= 8; i++) {  /* 2004.07.24 */
   _  _  _  _  if (strcmp(jwdq,shs[i]) == 0) {
   _  _  _  _  _  ptcons_replace(wdw + lnw,2,mei[i]);
   _  _  _  _  _  j = instr(jer,jwd);
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(j);
end

static void yakSaiyo(char jpw[], char egw[], char zkw[], char wdx[], char wdp[], char wdw[])                    /* 新しく訳語に採用する手続き */
begin               /* global variables: cnb, caj[], caz[], jwd[], conj_chr */
   int lnw, lnx, lnz, refresh = 1;
   char *pt0, *ptpa, *pt2, conj_chrq[2];

   pt2 = strchr(jpw,'#');
   if (pt2)  /* 「最長一致法」を適用するために、まず、*/
      lnw = strlen(jpw) - strlen(pt2) + 2;     /* 単語の長さを計算する。*/
   else
      lnw = strlen(jpw);
   pt2 = strchr(wdx,'#');
   if (pt2)
      lnx = strlen(wdx) - strlen(pt2) + 2;
   else
      lnx = strlen(wdx);
   pt0 = strchr(caz[cnb],'0');
   ptpa = strchr(caz[cnb],'(');
   if ((lnw == lnx) && ((! pt0) || (ptpa && (ptpa < pt0)) || (conj_chr == '0')))
      refresh = 0;
   else {
   _  if ((wdx[0] == '\0') && (cnb > -1))
   _     refresh = 0;
   _  else {
   _  _  if ((cnb >= 0) && (caj[0][0] == '1') && (egw[0] == '5') && (lnw == (lnx + 2)) && (strcmp(jpw + lnw - 2,"の") == 0))
   _  _     refresh = 0;  /* 2000.12.22. 追加した。*/
   _  }
   }
   if (! refresh) { 
       /* 辞書の日本語見出し語 jpw[] が */
			      /* これまでの最長一致語 wdx[] と同じ長さの場合 */
       /* cnb は今までに採用されている（同一日本語単語の）英訳語候補の個数　*/
   _  cnb++;
   _  if (cnb > YakMaxCt)
   _     too_many_yakugo(); /* 同一日本語の英訳語の数が多すぎる場合の処理 */
   _  if (wdx[0] == '\0')
   _     strcpy(wdx,jpw);
   _  strcpy(caj[cnb],egw);  /* 英訳語 egw[] を cnb 番目の訳語 caj[cnb] */
   _  if (conj_chr && strchr("rD01",conj_chr)) {    /*  として採用する。*/
   _  _  strcpy(caz[cnb],zkw);
   _  _  lnz = strlen(zkw);
   _  _  caz[cnb][lnz] = conj_chr;
   _  _  caz[cnb][lnz + 1] = '\0';
   _  _  if (conj_chr == 'r') { /* 「ありません」=>「ない」の時は第２属性「敬」とする。*/
   _  _  _  lnw = strlen(jpw);
   _  _  _  if ((lnw > 5) && (strcmp(jpw + lnw - 4,"ない") == 0))
   _  _  _     strcat(caz[cnb],"敬");    /* 2001.05.06 追加した。*/
   _  _  }
   _  }
   _  else {
   _  _  if (conj_chr) {
   _  _  _  if (strchr("em",conj_chr)) {
   _  _  _  _  conj_chrq[0] = conj_chr;
   _  _  _  _  conj_chrq[1] = '\0';
   _  _  _  _  strcat(zkw,conj_chrq);
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (conj_chr != 'ｹ') {
   _  _  _  _  _  caz[cnb][0] = conj_chr;
   _  _  _  _  _  caz[cnb][1] = '\0';
   _  _  _  _  }
   _  _  _  }
   _  _  _  strcat(caz[cnb],zkw); /* egw[] の属性 zkw[] を caj[cnb] の属性 */
                                   /* caz[cnb] として採用する。*/
   _  _  _  if ((conj_chr == 'ｹ') && strstr(caz[0],"敬"))  /* 2001.05.10 */
   _  _  _     strcat(caz[cnb],"敬"); /* conj_chr == 'ｹ' は「敬語」属性。*/
   _  _  }                         
   _  _  else {
   _  _  _  strcpy(caz[cnb],zkw);
   _  _  _  if (strlen(jwd) == 2) { /* 日本語文の末尾が１文字の場合（埋め込まれる熟語） */
   _  _  _  _  conj_chr = '1';       /* 2002.10.27 */
   _  _  _  _  strcat(caz[cnb],"1");
   _  _  _  }
   _  _  }
   _  }
   _  if ((! strstr(wdw,wdx)) && strstr(wdw,jpw))
   _     strcpy(wdx,jpw);
   }
   else {
    /* 辞書の日本語見出し語 jpw[] がこれ迄の最長一致語 wdx[] よりも長い場合 */
   _  strcpy(wdx,jpw);   /* wdx[] の値を jpw[] に更新する。*/
   _  strcpy(caj[0],egw); /* 今までの訳語候補は全て捨てて、*/
                                    /* egw[] を 0番目の訳語 caj[0] とする。*/
   _  if (conj_chr)
   _     zokusei_saiyou(egw,zkw,jpw,wdp);
                     /* 活用型変数 conj_chr の値を訳語の属性に採り込む。*/
   _  else
   _     strcpy(caz[0],zkw);
   _  if (caj[1][0]) {  /* 1番目の訳語 caj[1] はゼロで再初期化する。*/
   _  _  caj[1][0] = '\0';
   _  _  caz[1][0] = '\0';
   _  }
   _  cnb = 0;
   _  if ((! strchr(egw,'#')) && (((! conj_chr) && strchr("345",*egw)) || (conj_chr && (! strchr("ersD0",conj_chr)))) ) {
   _  _  strcpy(wdp,jpw);  /* 上の行で conjchr == D の場合を追加した。2002.12.08 */
   _  _  strcpy(jwd,jpw);
   _  }
   }
end


static int  codeCk(char egw[])  /* 属性コードのチェック */
begin                               /* global variable: conj_chr */
   int  code_ck;
   char code, dums[5];

   code_ck = 1;
   code = *egw;
   if (((conj_chr == 'p') || (conj_chr == 'G')) && (code != '3') && (code != '4')) {
   _  if (conj_chr == 'G')
   _     code_ck = 0;
   _  else
   _     if (code != '5')
   _        code_ck = 0;
   }
   else {
   _  if (((conj_chr == 'C') || (conj_chr == 'U')) && (code != '5') && (code != '6') && ((code != '3') || (! strchr(egw,' '))))
   _     code_ck = 0;
   _  else {
   _  _  if ((conj_chr == 'x') && (code != '1') && (code != '2') && (code != '3') && (code != '4')) {
   _  _  _  if ((code != '5') || (strlen(egw) < 6))
   _  _  _     code_ck = 0;
   _  _  _  else {
   _  _  _  _  right(egw,dums,3);
   _  _  _  _  if (strcmp(dums," of") != 0)
   _  _  _  _     code_ck = 0;
   _  _  _  }
   _  _  }
   _  }
   }
   return(code_ck);
end


static int leftCk(char z)      /* 左隣の単語のチェック（「<」型熟語） */
begin                 /* global variables: wc, aj[][][], az[][][] */
   register int i;
   int yn = 0;
   
   for (i=0; i <= YakMaxCt; i++) {
   _  if (! aj[wc][i][0])
   _     break;
   _  if (isdigit(z)) {
   _  _  if (aj[wc][i][0] == z) {
   _  _  _  yn = 3;  /* 品詞コード条件に合致していれば yn = 3 */
   _  _  _  break;
   _  _  }
   _  }
   _  else {
   _  _  if (z == 'p') {
   _  _  _  if (shoyuuCk(jn[wc])) {
   _  _  _  _  yn = 3;
   _  _  _  _  break;
   _  _  _  }
   _  _  }
   _  _  else
   _  _     if (strchr(az[wc][i],z)) {
   _  _     _  yn = 3;
   _  _     _  break;
   _  _     }
   _  }
   }
   return(yn);
end

static void too_many_yakugo(void)
                            /* 同一日本語の英訳語の数が多すぎる場合の処理 */
begin  /* global variables: cnb, wc, jwd[], caj[][], aj[][][] */
   register int pp;
   
   printf("日本語単語 \'%s\' の訳語の数が多すぎます。\n",jwd);
   for (pp = 0; pp < cnb; pp++)
      printf("caj[%d] = %s \n",pp,caj[pp]);
   printf("辞書メンテナンス・ユーティリティで、辞書登録をやり直して下さい！！");
   for (pp = 0; pp <= wc; pp++)
      printf("\n  aj[%d][0] = %s \n",pp,aj[pp][0]);
   exit(1);
end

static void zokusei_saiyou(char egw[], char zkw[], char jpw[], char wdp[])
		     /* 活用型変数 conj_chr の値を訳語の属性に採り込む。*/
begin  /* global variables: conj_chr, caz[][] */
  unsigned int  lnz, lnjp;
  char *pt2;

   if (caz[0][0] && strchr(egw,'#')) {
   _  caz[0][1] = conj_chr;
   _  caz[0][2] = '\0';
   _  strcat(caz[0],zkw);
   }
   else {
   _  strcpy(caz[0],zkw);
   _  pt2 = strchr(caz[0],'|');
   _  if ((conj_chr == 'p') && pt2)
   _     ptinsert(pt2,"p");
   _  else {
   _  _  if ((strcmp(wdp,"して") == 0) && (conj_chr == 'D'))
   _  _     strcat(caz[0],"rD");
   _  _  else {
   _  _  _  lnz = strlen(zkw);
   _  _  _  caz[0][lnz] = conj_chr;
   _  _  _  caz[0][lnz + 1] = '\0';
   _  _  _  if (conj_chr == 'ｹ') { /* 「ありません」=>「ない」の時は第２属性「敬」とする。*/
   _  _  _  _  lnjp = strlen(jpw);  /* 2001.05.06 追加した。*/
   _  _  _  _  if ((lnjp > 5) && (strcmp(jpw + lnjp - 4,"ない") == 0))
   _  _  _  _     strcpy(caz[0] + strlen(caz[0]) - 1,"敬");
   _  _  _  }
   _  _  }
   _  }
   }
end


static int nxt_ppt(int nx, int ppt, char wdw[])
			       /* 次のレコードポインター ppt を定める。*/
begin                  /* global variables: wc, jwd[], aj[][][] */
   register int j;
   
   if (nx == 0)
      ppt = -2;
   else {
   _  if ((nx < MaxNr) && (ppt < nx))
   _     ppt = nx;
   _  else {
   _  _  printf("辞書ポインタのエラー！！ ppt = %d, nx = %d \n",ppt,nx);
   _  _  printf("英単語 %s の辞書引きに失敗しました。 wdw[] = %s \n",jwd,wdw);
   _  _  printf("入力された英文に、英数字以外の記号が含まれていたか、そうでなければ、辞書のポインタ・データに欠陥があります。\n");
   _  _  for (j = 0; j <= wc; j++)
   _  _     printf("\n  aj[%d][0] = %s \n",j,aj[j][0]);
   _  _  exit(1);
   _  }
   }
   return(ppt);
end
