#include <stdio.h>  /* *****  tekiyak.c  ******* */
#include <string.h>  /* tekyk, yakHikaku, cd_cpy,tekKisok,zenbun_cd_ck,tekcd */
#include <process.h>     /*           for MS-C & TURBO C++  */
/*            #include <stdlib.h> ;   for Lattice D         */
#include <ctype.h>   /* posCk, fukuCk, f1jt, Eqcd, sharpCk, eqazck */
                     /* range, azCodeCk, zenbun_comp, zenMatubi, yakusuteMk */
#include "jehonfnc.h" /* yakugoSute, tekDbgDisp, sute_count, zenmetsu */


#define USER
/*  #define QWJTOE  */

#include "macro.h"

static void aj_recover(int BetsuYk);
static void yakHikaku(int ks, char Tekiyakfile[]);
static void cd_cpy(char c0, char c1, char cd[]);
static int  tekKisok(FILE *tekpt, char cd[], int j, int sute);
static char tekcd(void);
static int  posCk(int *saiyo);
static int  fukuCk(int *saiyo);
static int  f1jt(int comma, char tst[], int *saiyo);
static int  Eqcd(char *pj, int jtpt, int comma, int *wdps, int *saiyo);
#if defined(USER)
 static void tek_cnd_copy(char *pj, char tekcnd[]);
#endif
static int  jzCk(char pc, char *pj, char tst[], int wc3);
static int  sharpCk(char *pj, char tst[]);
static int  Rcheck(char tst[]);
#if defined(USER)
 static int  remoteCk(char teknb[], char tekcnd[]);
#else
 static int  remoteCk(void);
#endif
static int  eqazck(char *pj);
static int  range(int *tend, char pc);
static int  azCodeCk(int i, char *pj, char tst[], int tsta, int saiyo);
static int  zenbun_comp(int j, char cd[], int ks);
static int  zenMatubi(char cd[], int lns, int lno, int lnv, char md[],
                                                           int *hit, int yn0);
static int  yakusuteMk(char tcd[], int j);
static void tekDbgDisp(int j);
static int  sute_count(int i, int j, int sute);
static void zenmetsu(void);
static int  yakugoSute(int j, int yn0, int yn1, int sute, int shsw, int mrk[]);
static int  betsuyaku_settei(int BetsuYk, int *tek_ck, int *betsuyaku_hozon);
static void aj0_copy(int stt_i, int end_i);
static int  eneq(char tst[], int i);
static int  en_star_ck(char ec[], char tst[], int i);
static int  en_E_ck(char tst[], char ec[], int *saiyo);
static int  en_S_check(char ec[], char tst[]);
static int  en_dflt(char ec[], char tst[], int i);

#include "honyavar.h"

static char ptek[160], dumt[160];


int  tekyk(int BetsuYk, char egs1[], char egs2[]) /* ******  適訳選択 ******** */
begin   /* global variables: cnb, wnb, csq[], ptek[] */
   register int i;          /* DRV, aj[][][], az[][][], caj[][], caz[][] */
   int ks, tek_ck, betsuyaku_hozon = 0;
   char Tekiyakfile[15];

   Tekiyakfile[0] = DRV;
   Tekiyakfile[1] = '\0';
   strcat(Tekiyakfile,":tekiyaku.jte");
   tek_ck = 0;
   if ((*egs1 && (BetsuYk == 1)) || (*egs2 && (BetsuYk == 2))) {
             /* (BetsuYk == ....) を 導入した。2005.02.27 */
   _  aj_recover(BetsuYk); /* 別訳のための aj[],az[] 回復 */
            /* *egs1, *egs2 は #-エラーのバックトラックの場合を除く条件 */
   }
   while (! tek_ck) {
   _  for (ks = 0; ks <= 2; ks++) {  /* 同じチェックを３回(ks = 0,1,2)くり返す */
   _  _  for (wc = wnb; wc >= 0; wc--) { /* wc 番目の単語の訳語を絞る。 */
   _  _  _  if (aj[wc][1][0]) {
   _  _  _  _  for (i = 0; i <= wnb; i++) /* 訳語候補の比較を始める前に、　*/
   _  _  _  _     csq[i] = aj[i][0][0];   /*   品詞コード列 csq[] を更新する。*/
   _  _  _  _  csq[wnb + 1] = '\0';
   _  _  _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  _  _  if (aj[wc][i][0] == '\0')
   _  _  _  _  _     break;
   _  _  _  _  _  strcpy(caj[i],aj[wc][i]); /* 訳語 aj[wc][i], 属性 az[wc][i] */
   _  _  _  _  _  strcpy(caz[i],az[wc][i]); /* を作業配列 caj[i], caz[i]に copy */
   _  _  _  _  }
   _  _  _  _  if (i <= YakMaxCt)
   _  _  _  _     caj[i][0] = '\0';
   _  _  _  _  cnb = --i;     /* caj[cnb]: ラストの訳語候補 */
      /* 複数の訳語候補を持つ和単語 jn[wc] について、候補たちを比較して絞る。*/
   _  _  _  _  yakHikaku(ks,Tekiyakfile);
   _  _  _  _  for (i = 0; i <= cnb; i++)  {
   _  _  _  _  _  strcpy(aj[wc][i],caj[i]); /* caj[][], caz[][] の値は */
   _  _  _  _  _  strcpy(az[wc][i],caz[i]); /*    aj[][][], az[][][] に戻す。*/
   _  _  _  _  }
   _  _  _  _  while (i <= YakMaxCt) {
   _  _  _  _  _  aj[wc][i][0] = '\0';
   _  _  _  _  _  az[wc][i++][0] = '\0';
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  tek_ck = 1;
                 /* betsuyaku_hozon についての設定を導入した。2005.01.27 */
   _  if (! betsuyaku_hozon)
   _     BetsuYk = betsuyaku_settei(BetsuYk,&tek_ck,&betsuyaku_hozon);
   }
   return(BetsuYk);
end

static void aj_recover(int BetsuYk)
begin  
 /* global variables: wnb, aj[][][], aj0[][][], az[][][], az0[][][], en[][], enp[][] */
   register int i, j;
   
   for (i = 0; i <= WordNumb; i++) {
   _  if (! aj0[i][0][0]) {
   _  _  wnb = i - 1;
   _  _  aj[i][0][0] = '\0';
   _  _  break;
   _  }
   _  for (j = 0; j <= YakMaxCt; j++) {
   _  _  if (! aj0[i][j][0]) {
   _  _  _  aj[i][j][0] = '\0';
   _  _  _  break;
   _  _  }
   _  _  strcpy(aj[i][j],aj0[i][j]);
   _  _  strcpy(az[i][j],az0[i][j]);
   _  }
   _  strcpy(jn[i],jnp[i]);
   }
   if (aj0[i][0][0])
      wnb = WordNumb;
   if (BetsuYk == 1) {
   _  printf("\n\n別訳文の形成\n\n");
   _  if (Dbg2 == 'Y')
   _     fprintf(dbgfl_pt,"\n\n別訳文の形成\n\n");
   _  ++BetsuYk;
   }
end

static void yakHikaku(int ks, char Tekiyakfile[])
   /* 複数の訳語候補を持つ和単語 jn[wc] について、候補たちを比較して絞る。*/
begin /* global variables: wc, cnb, ptek[], pes[], en[][], caj[][], aj[][][] */
   int j, pwct, sute;
   char c0, c1, cd[3];
   FILE *tekpt;
   
   pwct = 0;
   c1 = '\0';
   j = 1;
   ptek[124] = '\0';
   while ((cnb >= 1) && (j <= cnb) && (pwct == 0)) {  /* 適訳規則がつきると pwct = 1 になる。*/
   _  c0 = caj[0][0];
   _  j = 1;
   _  while (j <= cnb) {       /* 訳語候補がつきると j > cnb になる。*/
   _  _  if ((pwct == 1) && (j > 0) && (c1 == caj[j][0]))
   _  _     j++;               /* 次の訳語候補に移る。*/
   _  _  else {
   _  _  _  c1 = caj[j][0];
   _  _  _  sute = 0;
   _  _  _  cd_cpy(c0,c1,cd); /* ２つの品詞コードを大小順に並べて cd[] にコピーする。*/
   _  _  _  if (! sute) {
   _  _  _  _  pwct = 0;
   _  _  _  _  if ((tekpt = fopen(Tekiyakfile,"r")) == NULL) {
   _  _  _  _  _  printf("Tekiyakfile がオープンできませんでした。");
   _  _  _  _  _  exit(1);
   _  _  _  _  }
   _  _  _  _  else   /* 適訳規則ファイルの規則により、訳語を絞る。*/
   _  _  _  _     sute = tekKisok(tekpt,cd,j,sute);
   _  _  _  _  /* 適訳規則チェックが終了。*/
   _  _  _  _  fclose(tekpt);
   _  _  _  _  if ((! sute) && *pes && ks && (aj[wc][0][0] != '8'))
   _  _  _  _     sute = zenbun_comp(j,cd,ks);
   _  _  _  _  if (! sute) {
   _  _  _  _  _  pwct = 1;
   _  _  _  _  _  j++;
   _  _  _  _  }
   _  _  _  _  if (sute > 15)
   _  _  _  _     break;
    /* 訳語候補 caj[j] を捨てた時は sute == 10 で、新しい候補に取り替える。 */
   _  _  _  }
   _  _  }
   _  _  if (sute > 15)
   _  _     break;
            /* 先頭の訳語を捨てた時は sute == 20 で、j -> 1 として、caj[0], caj[j] を更新する。 */
   _  }      /* 相対比較の組合せが尽きると sute == 30 で、次の単語に進む。*/
   _  if (sute == 20)
   _     j = 1;
   _  if (sute == 30)
   _     break;
   }
end

static void cd_cpy(char c0, char c1, char cd[])
begin            /* ２つの品詞コードを大小順に並べて cd[] にコピーする。*/

   if (c0 < c1)  {
   _  cd[0] = c0;
   _  cd[1] = c1;
   }
   else  {
   _  cd[0] = c1;
   _  cd[1] = c0;
   }
   cd[2] = '\0';
end

static int  tekKisok(FILE *tekpt, char cd[], int j, int sute)
                      /* 適訳規則ファイルの規則により、訳語を絞る。*/
begin                  /* global variables: ptek[], dumt[] */
   int ln;
   char tf, tcd[3], ptekq[160];

   while(fgets(ptekq,156,tekpt))  {
   _  if (! strstr(ptekq,"***")) {
   _  _  ln = strlen(ptekq);
   _  _  if (ln > 155) {
   _  _  _  printf("\n 適訳規則が長過ぎます。ptek = %s \n",ptek);
   _  _  _  printf("\n  長さ = %d  これを 155 文字以内に削ってください。\n",ln);
   _  _  _  exit(1);
   _  _  }
   _  _  else
   _  _     strcpy(ptek,ptekq);
   _  _  tcd[0] = ptek[0];
   _  _  tcd[1] = ptek[1];
   _  _  tcd[2] = '\0';
   _  _  if (cd[0]<tcd[0] || (cd[0]==tcd[0] && cd[1]<tcd[1]))
   _  _     break;    /* 適訳規則の品詞コード列の方が大きくなったら終了する。*/
   _  _  if (cd[0]==tcd[0] && cd[1]==tcd[1]) {
                                   /* 小さい内はスキップして次の規則に進む。*/
   _  _  _  strcpy(dumt,ptek);
   _  _  _  tf = tekcd();        /* 適訳規則の適用条件の合否を判定する。*/
   _  _  _  if (tf == 'T')  {  /* tf == 'T' なら合格、tf == '\0' なら失格 */
   _  _  _  _  sute = yakusuteMk(tcd,j);
                       /* 適訳規則を適用して、一方の候補を捨てる。*/
   _  _  _  _  if (sute)      /* sute == 0 なら、次の規則を読みに行く。 */
   _  _  _  _     break;
   _  _  _  }
   _  _  }
   _  }
   }
   return(sute);
end


static char tekcd(void)    /* **** 適訳規則の適用条件をチェックする。 ***** */
begin  /*  static global variable: dumt[] */

   int comma, jtpt, wdps, mitei, saiyo;
   char tf, *pj, *dump;
#if defined(USER)
   int  ln;
   char teknb[5], tekcnd[50];
#endif

   tf = '\0';
#if defined(USER)
   ln = strlen(dumt);
   ptcpy(teknb,dumt + ln - 6,dumt + ln - 2);
#endif
   comma = posCk(&saiyo);   /* 原文中における対象語の位置をチェックする条件 */
   if (saiyo > 0) {
   _  mitei = 1;
   _  jtpt = 0;
   _  dump = dumt;
   _  pj = strchr(dump,'=');
   _  while (pj)  {
#if defined(USER)
   _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0))
   _  _     tek_cnd_copy(pj,tekcnd);
	   /* これからチェックに入る１つの適用条件を tekcnd[] にコピーする。*/
#endif
   _  _  jtpt = Eqcd(pj,jtpt,comma,&wdps,&saiyo);
   _  _  if ((saiyo < 1) && (*pj == ' ')) {
   _  _  _  mitei = 0;               /* 等号条件: saiyo = 1 なら合格 */
#if defined(USER)
   _  _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0)) {
   _  _  _  _  beeping(2);
   _  _  _  _  printf("\n 適訳規則 %s は等号条件 %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  _  if (Dbg2 == 'Y')
   _  _  _  _     fprintf(dbgfl_pt,"\n 適訳規則 %s は不等号条件  %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  }
#endif
   _  _  _  break;
   _  _  }
   _  _  dump = pj + 2;
   _  _  pj = strchr(dump,'=');
   _  }
   _  if (mitei) {
   _  _  dump = dumt;
   _  _  pj = strstr(dump,"<>");
   _  _  while(pj)  {
#if defined(USER)
   _  _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0))
   _  _  _     tek_cnd_copy(pj,tekcnd);
	   /* これからチェックに入る１つの適用条件を tekcnd[] にコピーする。*/
#endif
   _  _  _  jtpt = Eqcd(pj,jtpt,comma,&wdps,&saiyo);
   _  _  _  if ((saiyo >= 0) && (*pj == ' ')) {
   _  _  _  _  mitei = 0;         /* 不等号条件: saiyo = -1 なら合格 */
#if defined(USER)
   _  _  _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0)) {
   _  _  _  _  _  beeping(2);
   _  _  _  _  _  printf("\n 適訳規則 %s は不等号条件 %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  _  _  if (Dbg2 == 'Y')
   _  _  _  _  _     fprintf(dbgfl_pt,"\n 適訳規則 %s は不等号条件  %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  _  }
#endif
   _  _  _  _  break;
   _  _  _  }
   _  _  _  dump = pj + 2;
   _  _  _  pj = strstr(dump,"<>");
   _  _  }
   _  }
   _  if (mitei)
#if defined(USER)
   _     mitei = remoteCk(teknb,tekcnd); /* 前方・後方の単語のチェック */
#else
   _     mitei = remoteCk();
#endif
   _  if (mitei) {
   _  _  dump = dumt;
   _  _  pj = strstr(dump,"<<");
   _  _  if (! pj)
   _  _     pj = strstr(dump,">>>");
   _  _  while(pj) {
#if defined(USER)
   _  _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0))
   _  _  _     tek_cnd_copy(pj,tekcnd);
#endif
   _  _  _  saiyo = ineqck(pj,'T');
		    /* 数値に関する大小関係のチェック: saiyo = 0 なら失格 */
		/* 文法規則条件のチェックと共有。bunpcnd.cモジュールに在る。*/
   _  _  _  if (saiyo == 0) {
   _  _  _  _  mitei = 0;
#if defined(USER)
   _  _  _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0)) {
   _  _  _  _  _  beeping(2);
   _  _  _  _  _  printf("\n 適訳規則 %s は数値に関する大小条件  %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  _  }
#endif
   _  _  _  _  break;
   _  _  _  }   /* 文法規則条件のチェックと共有。bunpcnd.cモジュールに在る。*/
   _  _  _ *pj = ' ';
   _  _  _ *(pj + 1) = ' ';
   _  _  _  pj = strstr(dump,"<<");
   _  _  _  if (! pj)
   _  _  _     pj = strstr(dump,">>>");
   _  _  }
   _  }
   _  if (mitei)
   _     tf = 'T';
   }
#if defined(USER)
   else {
   _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0)) {
   _  _  beeping(2);
   _  _  printf("\n 適訳規則");
   _  _  color_light_blue;
   _  _  printf(" %s ",dumt);
   _  _  color_white;
   _  _  if (saiyo == -5)
   _  _     printf("は原文の複文、複数文条件 'FK' or 'PLS' を満足しないので失格となりました。\n");
   _  _  else
   _  _     printf("は原文中の位置の条件 'FT' or 'LT' を満足しないので失格となりました。\n");
   _  }
   }
#endif
   return(tf);
end

#if defined(USER)
static void tek_cnd_copy(char *pj, char tekcnd[])
begin    /* デバッグ表示用に、チェックする適用条件をコピーする。*/
   char *pta, *ptz;
   
   if (*(pj - 3) == ';')
      pta = pj - 2;
   else {
   _  if (*(pj - 4) == ';')
   _     pta = pj - 3;
   _  else
   _     pta = pj - 4;
   }
   ptz = strchr(pj,';'); /* ; から ; までが１つの適用条件。これをコピーする。*/
   ptcpy(tekcnd,pta,ptz);
end
#endif



static int  posCk(int *saiyo) /* 原文中における対象語の位置をチェックする条件 */
begin        /* global variables: wc, wnb, ptek[], aj[][][] */
   int comma;
   char b;

   *saiyo = 1;
   if (strstr(ptek,";FT;") && (wc > 0)) {
   _  b = aj[wc - 1][0][0];             /* "FT"（先頭）条件のチェック */
   _  if (! strchr("0?!|*",b))
   _     *saiyo = 0;
   }
   if (*saiyo && strstr(ptek,";LT;") && (wc < wnb)) {
   _  b = aj[wc + 1][0][0];             /* "LT"（末尾）条件のチェック */
   _  if (! strchr("0?!|",b))
   _     *saiyo = 0;
   }
   if (*saiyo && strstr(ptek,";FK;"))
      comma = fukuCk(saiyo);                /* "FK"（複文・重文）チェック */
   if ((*saiyo > 0) && strstr(ptek,";PLS;")) {
   _  comma = plrSts();      /* 原文が複数の文から成る事をチェックする。*/
   _  if (comma == - 1)      /* bunpcnd モジュールに有る。 */
   _     *saiyo = -5;
   }
   return(comma);
end

static int  fukuCk(int *saiyo) /* 原文が複文（または重文）である事をチェックする。*/
begin                    /* global variables; wc, wnb, aj[][][], jn[][] */
   register int i, j;
   int  comma;

   *saiyo = -5;
   if (wc >= 2) {
   _  comma = 0;
            /* 現在位置 jn[wc] から文頭に遡って、接続詞またはコンマを捜す。*/
   _  for (i = wc - 1; i >= 1; i--) {
   _  _  if ((aj[i][0][0] == '9') || strcmp(jn[i],"、") == 0) {
   _  _  _  comma = i;
   _  _  _  if (strcmp(jn[i - 1],"、") == 0)
   _  _  _     comma--;
   _  _  _  break;
   _  _  }
   _  _  if (strcmp(jn[i],"。") == 0)
   _  _     break;
   _  }
   _  if (comma) {
   _  _  for (i = comma + 1; i <= wnb; i++) {
   _  _  _  if (aj[i][0][0] == '3' && (aj[i][1][0] == '\0' || aj[i][1][0] == '3'))
   _  _  _     break; /* コンマの位置より後ろに動詞が存在する事のチェック */
   _  _  }
   _  _  if (i < wnb) {
   _  _  _  for (i = comma - 1; i >= 0; i--) {
   _  _  _  _  if (aj[i][0][0] == '3' && (aj[i][1][0] == '\0' || aj[i][1][0] == '3'))
   _  _  _  _     break; /* コンマの位置より前に動詞が存在する事のチェック */
   _  _  _  }
   _  _  _  if (i > 0)
   _  _  _     *saiyo = 1;
   _  _  _  else {
   _  _  _  _  for (j = 0; j <= YakMaxCt; j++) {
   _  _  _  _  _  if (aj[0][j][0] == '3') {
   _  _  _  _  _  _  *saiyo = 1;
   _  _  _  _  _  _  break;
   _  _  _  _  _  }
   _  _  _  _  _  else
   _  _  _  _  _     if (! aj[0][j][0])
   _  _  _  _  _        break;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   else
      comma = -1;
   return(comma);
end


static int  f1jt(int comma, char tst[], int *saiyo)
begin /* カンマより前の、品詞コードjc、属性tcの単語の位置を*jtpt に代入する。 */
   register int i;
   int  jtpt = -1;
   char jc, tc;

   *saiyo = -1;
   jc = tst[0];
   tc = tst[1];
   for (i = comma - 1; i >= 0; i--) {
   _  if (aj[i][0][0] == jc && aj[i][1][0] == '\0' && strchr(az[i][0],tc)) {
   _  _  jtpt = i;
   _  _  *saiyo = 1;
   _  _  break;
   _  }
   }
   return(jtpt);
end


static int  Eqcd(char *pj, int jtpt, int comma, int *wdps, int *saiyo)
            /* 適訳規則適用条件のうち等号条件の判定  */
begin       /* global variables: sz, oz, pts */
   int wc3;
   char pc, tst[80], *ch;

   pc = *(pj - 1);
   if (((pc != 'A') || (*(pj - 2) == 'H')) && pc != '#' && (pc != 'Z' || *(pj - 2) == 'S' || *(pj - 2) == 'O' || *(pj - 2) == 'V' || *(pj - 3) == 'S' || *(pj - 3) == 'O')) {
   _  ch = strchr(pj + 1,';'); /* WASHA チェックに対応した。2001.06.14 */
   _  if (*pj == '=')           /* 指定された文字列を tst にコピーする。*/
   _     ptcpy(tst,pj + 1,ch);
   _  else
   _     ptcpy(tst,pj + 2,ch);
   _  *saiyo = sovck(pj,tst,pc); /* 前の文の主語、目的語、動詞をチェックする */
   _         /* sovck() は文法規則と共有。bunpcnd モジュールにある。*/
   _  if ((! *saiyo) && (*(pj - 2) != '-') && (*(pj - 3) != 'D'))
   _     *saiyo = SOFPck(pc,tst,pj,jtpt,wdps,comma);
                     /* 前の文の主語、目的語や複文、重文に関するチェック */
                     /* "bunpcnd.c" に有る。*/ 
   _  if ((! *saiyo) && (*(pj - 2) == 'J') && (pc == 'T'))
   _     jtpt = f1jt(comma,tst,saiyo);     /* F1JT = ??  のチェック */
   _  if (! *saiyo) {
   _  _  if ((*(pj - 3) == 'F') && (*(pj - 2) == '2')) 
                            /* F2J=?, F2T=? のチェック */
   _  _     wc3 = jtpt;    /* aj[jtpt][][], az[jtpt][][] を調べる。*/
   _  _  else {
   _  _  _  if ((*(pj - 3) == '2') && (*(pj - 4) == 'P'))
   _  _  _     wc3 = *wdps + pc - '0';    /* P2#n=? (pc = n) のチェック */
   _  _  _  else
   _  _  _     wc3 = wc3cal(pj,pc);
                     /* 原文中の絶対位置 wc3 を計算する: --->  bunpcnd.c  */
   _  _  }
   _  _  if (wc3 < 0 || wc3 > wnb)
   _  _     *saiyo = -1;
   _  _  else {
   _  _  _  if (*(pj - 2) == 'E' || (*(pj - 3) == 'E') || (*(pj - 1) == 'E')) {
   _  _  _  _  *saiyo = eneq(tst,wc3);      /* 英単語に関する条件チェック */
   _  _  _  _  --(*saiyo);
   _  _  _  }
   _  _  _  else {
   _  _  _  _  ch = strchr(pj - 4,'D');
   _  _  _  _  if (ch && ((ch <= pj - 2) || (*(pj - 3) == 'F' && ch < pj)))
   _  _  _  _     *saiyo = Dblck(wc3,tst,pj);       /* 倍角文字列チェック */
   _  _  _  _  else
   _  _  _  _     *saiyo = jzCk(pc,pj,tst,wc3);
                           /* 品詞コードまたは属性コードの等号条件チェック */
   _  _  _  }
   _  _  }
   _  }
   _  *pj = ' ';
   }
   return(jtpt);
end

static int jzCk(char pc, char *pj, char tst[], int wc3)
             /* 品詞コードまたは属性コードの等号条件チェック */
begin  /* global variables: caj[][], caz[][], cnb, aj[][][], az[][][] */
   register int ss;
   int  posct = 0, negct = 0, hit, saiyo;
   char bb[45], *ch, *ptbar;
   
   saiyo = 0;
   if ((pc == '0') && ((*(pj - 3) == ';') || (*(pj - 4) == ';'))) {
                      /* 現在吟味している単語自身についての判定条件 */
   _  for (ss = 0; ss <= cnb; ss++) {
   _  _  if (*(pj - 2) == 'J' || *(pj - 3) == 'J') {
   _  _  _  *bb = caj[ss][0];
   _  _  _  *(bb + 1) = '\0';         /*  品詞コード条件の場合 */
   _  _  }
   _  _  else {
   _  _  _  strcpy(bb,caz[ss]);       /*  属性コード条件の場合 */
   _  _  _  ch = strchr(bb,'y');
   _  _  _  if (ch)
   _  _  _     *(ch + 1) = '\0';
   _  _  _  ptbar = strchr(bb,'|');
   _  _  _  if (ptbar)
   _  _  _     *ptbar  = '\0';
   _  _  }
   _  _  if (*bb) {
   _  _  _  ch = tst;
   _  _  _  hit = 0;
   _  _  _  do {
   _  _  _  _  if (strchr(bb,*ch)) {
   _  _  _  _  _  ++posct;
   _  _  _  _  _  hit = 1;
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  _  if (*bb == *ch && *(bb + 1) == '\0') {
   _  _  _  _  _  ++posct;
   _  _  _  _  _  hit = 1;
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  } while (*(++ch));
   _  _  _  if (! hit)
   _  _  _     ++negct;
   _  _  }
   _  _  else
   _  _     ++negct;
   _  }
   }
   else {                   /* 前または後の単語に関する等号条件のチェック */
   _  for (ss = 0; ss <= YakMaxCt; ss++) {
   _  _  if (aj[wc3][ss][0] == '\0')
   _  _     break;
   _  _  if (*(pj - 2) == 'J' || *(pj - 3) == 'J') {
   _  _  _  *bb = aj[wc3][ss][0];
   _  _  _  *(bb + 1) = '\0';          /*  品詞コード条件の場合 */
   _  _  }
   _  _  else {
   _  _  _  strcpy(bb,az[wc3][ss]);
   _  _  _  ch = strchr(bb,'y');
   _  _  _  if (ch)   /*  属性コード条件の場合 */
   _  _  _     *(ch + 1) = '\0';       /*  （助数詞は切り捨てる） */
   _  _  _  ptbar = strchr(bb,'|');
   _  _  _  if (ptbar)
   _  _  _     *ptbar = '\0';          /*  （第２属性は切り捨てる） */
   _  _  }
   _  _  if (*bb) {
   _  _  _  ch = tst;
   _  _  _  hit = 0;
   _  _  _  do {
   _  _  _  _  if (strchr(bb,*ch)) {
   _  _  _  _  _  ++posct;
   _  _  _  _  _  hit = 1;
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  } while (*(++ch));
   _  _  _  if (! hit)
   _  _  _     ++negct;
   _  _  }
   _  _  else
   _  _     ++negct;
   _  }
   }
   if (posct && (! negct))
      saiyo = 1;           /* 条件に合格する候補ばかりなら、saiyo = 1  */
   else {
   _  if ((! posct) && negct)
   _     saiyo = -1;          /* 条件に反する候補ばかりなら、saiyo = -1  */
   }                           /* どちらでもない時は、　saiyo = 0   */
   return(saiyo);
end

static int  sharpCk(char *pj, char tst[])
            /* 埋め込み型熟語に関する遠方の単語のチェック */
begin       /* global variables: wc, aj[][][], az[][][] */
   register int tt, ss;
   int  saiyo;
   char bb[45], *ch;

   saiyo = 0;
   if ((*(pj + 1) == 'R') || ((*(pj + 1) == '>') && (*(pj + 2) == 'R')))
      saiyo = Rcheck(tst);
               /* 「T#=Rn」型の規則（末尾にまわされた単語の品詞判定） */
   else {
   _  ch = strchr(aj[wc][0],'#');
   _  if (ch) {   /* 「T#=e」型の規則（埋め込み語を持つ熟語の品詞判定） */
   _  _  ptcpy(bb,ch,ch + 2);
   _  _  for (ss = wc + 2; ss <= wnb; ss++) {
   _  _  _  if (strstr(az[ss][0],bb)) {
   _  _  _  _  for (tt = ss + 1; tt <= wnb; tt++) {
   _  _  _  _  _  if (aj[tt][0][0] == '#') {
   _  _  _  _  _  _  saiyo = -1;
   _  _  _  _  _  _  break;
   _  _  _  _  _  }
   _  _  _  _  _  ch = tst;
   _  _  _  _  _  while (*ch) {
   _  _  _  _  _  _  if (strchr(az[tt][0],*ch++)) {
   _  _  _  _  _  _  _  saiyo = 1;
   _  _  _  _  _  _  _  break;
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  _  if (saiyo)
   _  _  _  _  _     break;
   _  _  _  _  }
   _  _  _  _  if (! saiyo)
   _  _  _  _     saiyo = -1;
   _  _  _  _  break;
   _  _  _  }
   _  _  }
   _  }
   _  else
   _     saiyo = -1;
   }
   return(saiyo);
end

static int  Rcheck(char tst[]) /* 「T#=Rn」型の規則（末尾にまわされた単語の品詞判定） */
begin    /* global variables: wc, aj[][][], az[][][], ptek[]  */
   register int ss;
   int  saiyo = 0;
   char bb[45], *ptR, *ch;
#if defined(USER)
   char yn[5];
#endif
   
   for (ss = wc - 1; ss >= 0; ss--) {
   _  if (*(aj[ss][0]) == '#') {
   _  _  left(bb,az[ss][0],2);
   _  _  break;                 /* bb は「#1」などとなっている。 */
   _  }
   }
   for (ss = wc - 2; ss >= 0; ss--) {
   _  if (strstr(aj[ss][0],bb)) {      /* 埋め込む先の熟語を探す。*/
   _  _  ptR = strchr(az[ss][0],'R');
   _  _  if (ptR) {
   _  _  _  ++ptR;
   _  _  _  ch = tst;
   _  _  _  while (*ch) {
   _  _  _  _  if (*ptR == *ch++) {
   _  _  _  _  _  saiyo = 1;
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  }
   _  _  _  if (! saiyo)
   _  _  _     saiyo = -1;
   _  _  _  break;
   _  _  }
   _  _  else {
   _  _  _  if ((! strchr("$<",az[ss][0][0])) && (! strchr("$<",az[ss][0][1]))) {
   _  _  _  _  beeping(2);
/*   _  _  _  _  printf("\n\n 辞書の %s の属性欄に「R」情報が登録されていません。  \n\n",aj[ss][0]); */
#if defined(USER)
   _  _  _  _  *yn = '\0';
   _  _  _  _  printf("翻訳を続けますか？ [Y/N] \n");
   _  _  _  _  while((! *yn) || ((tolower(*yn) != 'y') && (tolower(*yn) != 'n')))
   _  _  _  _     gets(yn);
   _  _  _  _  if (tolower(*yn) == 'n')
   _  _  _  _     exit(1);
#else
   _  _  _  _  exit(1);
#endif
   _  _  _  }
   _  _  }
   _  }
   }
   if ((ss == 0) && (saiyo < 1) && (Dbg == 'Y' || Dbg == 'y'))
      printf("対象句なし。 bb = %s  aj[wc][0] = %s \n  ptek = %s \n",bb,aj[wc][0], ptek);
   return(saiyo);
end


#if defined(USER)
 static int  remoteCk(char teknb[], char tekcnd[])
                                       /* 前方・後方の単語のチェック */
#else
 static int  remoteCk(void)
#endif
begin  /* global variables: dumt[], TKWATCH */
   int  saiyo, mitei;
   char *pj, *dump;

   mitei = 1;
   dump = dumt;
   pj = strchr(dump,'=');
   while(pj)  {
#if defined(USER)
   _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0))
   _     tek_cnd_copy(pj,tekcnd);
	   /* これからチェックに入る１つの適用条件を tekcnd[] にコピーする。*/
#endif
   _  saiyo = eqazck(pj);
   _  if (saiyo < 1) {
   _  _  mitei = 0;   /* 前方後方の等号条件: saiyo = 1 なら合格 */
#if defined(USER)
   _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0)) {
   _  _  _  beeping(2);
   _  _  _  printf("\n 適訳規則 %s は等号条件 %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  if (Dbg2 == 'Y')
   _  _  _     fprintf(dbgfl_pt,"\n 適訳規則 %s は不等号条件  %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  }
#endif
   _  _  break;
   _  }
   _  dump = pj + 1;
   _  pj = strchr(dump,'=');
   }
   if (mitei) {
   _  dump = dumt;
   _  pj = strstr(dump,"<>");
   _  while(pj)  {
#if defined(USER)
   _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0))
   _  _     tek_cnd_copy(pj,tekcnd);
	   /* これからチェックに入る１つの適用条件を tekcnd[] にコピーする。*/
#endif
   _  _  saiyo = eqazck(pj);
   _  _  if (saiyo >= 0) {
   _  _  _  mitei = 0;   /* 前方後方の不等号条件: saiyo = -1 なら合格 */
#if defined(USER)
   _  _  _  if (*TKWATCH && (strcmp(teknb,TKWATCH) == 0)) {
   _  _  _  _  beeping(2);
   _  _  _  _  printf("\n 適訳規則 %s は不等号条件  %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  _  if (Dbg2 == 'Y')
   _  _  _  _     fprintf(dbgfl_pt,"\n 適訳規則 %s は不等号条件  %s を満足しないので失格となりました。\n",dumt,tekcnd);
   _  _  _  }
#endif
   _  _  _  break;
   _  _  }
   _  _  dump = pj + 1;
   _  _  pj = strstr(dump,"<>");
   _  }
   }
   return(mitei);
end


static int  eqazck(char *pj)
        /* 前方(A)または後方(Z)の不特定多数の単語に関する等号条件のチェック */
begin   /* global variables: csq[]    */
   register int i;
   int  tsta, tend, saiyo;
   char pc, p3, tst[30], *ch, *ptr;

   saiyo = 0;
   pc = *(pj - 1);
   ch = strchr(pj + 1,';');
   if (*pj == '=')              /* 等号条件の場合: pj = "=......" */
      ptcpy(tst,pj + 1,ch);
   else                       /* 不等号条件の場合: pj = "<>....." */
      ptcpy(tst,pj + 2,ch);
   if (((pc == 'A') && (wc == 0)) || ((pc == 'Z') && (wc == wnb) && (! strchr(csq,'#'))))
     saiyo = -1;
   else {
   _  if (*(pj - 2) == 'Q' && pc == 'Z')
   _     saiyo = qzck(tst);
   _      /* QZ 条件のチェック --> bunpcnd.c モジュールに在る。saiyo -> 1 or -1 */
   _  else {
   _  _  if (pc == '#')
   _  _     saiyo = sharpCk(pj,tst); /* 埋め込み型熟語の # 条件のチェック */
   _  _  else {
   _  _  _  tsta = range(&tend,pc);/* 前方(A)または後方(Z)の検索範囲を定める */
   _  _  _  if (tsta < tend)
   _  _  _     saiyo = -1;
   _  _  _  else {
   _  _  _  _  for (i = tsta; i >= tend; i--) {
   _  _  _  _  _  if (*(pj - 2) == 'D' || *(pj - 3) == 'D') {
   _  _  _  _  _  _  saiyo = Dblck(i,tst,pj);   /* 倍角文字の条件チェック */
   _  _  _  _  _  _  if ((saiyo == 1) || ((saiyo == 0) && (*pj == '<')))
   _  _  _  _  _  _     break; /* Dblck[] は bunpcnd.c モジュールに在る。*/
   _  _  _  _  _  }
   _  _  _  _  _  else  {
   _  _  _  _  _  _  if (*(pj - 2) == 'E') {
   _  _  _  _  _  _  _  saiyo = eneq(tst,i);/* 英単語 en[][]に関するチェック */
   _  _  _  _  _  _  _  if (saiyo >= 1) {
   _  _  _  _  _  _  _  _  --saiyo;
   _  _  _  _  _  _  _  _  break;
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _     saiyo = -1;
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  saiyo = azCodeCk(i,pj,tst,tsta,saiyo);
			      /* 訳語の品詞コードまたは属性コードのチェック */
   _  _  _  _  _  _  _  if ((saiyo == 1) || ((! saiyo) && (*pj == '<')))
   _  _  _  _  _  _  _     break;
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  _  if (i < tsta || pc == 'A') {
   _  _  _  _  _  _  p3 = csq[i];
   _  _  _  _  _  _  if (p3 == '\0' || p3 == '0' || p3 == '?' || p3 == '!')
   _  _  _  _  _  _     break;
/*   _  _  _  _   _  else
   _  _  _  _  _  _     if ((p3 == '|') && (strcmp(aj[i][0] + 1,"’") != 0))
   _  _  _  _  _  _        break;   */
   _  _  _  _  _  }
   _  _  _  _  _  ptr = strchr(az[i][0],'r');
   _  _  _  _  _  if ((pc == 'A') && ptr && strchr(ptr + 1,'|') && (! aj[i][1][0]))
   _  _  _  _  _     break;/* 前方に関係詞（属性 'r'）が有ればそこで打ち切る */
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   if (saiyo)
      *pj = ' ';
   return(saiyo);
end

static int range(int *tend, char pc)
                   /* 前方(A)または後方(Z)の検索の範囲を定める */
begin              /* global variables: wc, wnb, en[][], csq[], aj[][][] */
   register int i;
   int  tsta, j3, j9, j33, j00, i1;
   char eu[3], cq1[WordNumb], p3, *ptr, *pty;

   if (wc)
      left(eu,jn[wc - 1],2);
   else
      *eu = '\0';
   if (pc == 'A') {      /* 前方(A)検索の場合 */
   _  tsta = wc - 1;           /* スタートの位置は一つ前の単語 */
   _  *tend = 0;                /* 終了の位置は文頭 */
   _  if (eu[0] == '#' && wc > 3)       /* 埋め込み型熟語「#」の場合 */
   _     for (i = wc - 3; i >= 0; i--)  /* 埋め込み先に遡って検索する。*/
   _        if (strstr(aj[i][0],eu)) {
   _        _  tsta = i - 1;
   _        _  break;
   _        }
   _  left(cq1,csq,wc);
   _  j9 = instrc(cq1,'9'); /* 吟味している英単語より前方にある接続詞の位置 */
   _  j3 = instrc(csq,'3');           /* 前方にある動詞句の位置 */
   _  j33 = ninstrc(j9 + 1,csq,'3');  /* 接続詞より後にある動詞句の位置 */
   _  if ((j3 > 0) && (j9 > j3) && (j33 > 0)) {
   _  _  if ((j9 == j3 + 1) && (j33 == j9 + 1) && (jn[j3 - 1] == jn[j9]))
   _  _     *tend = 0;
   _  _  else            /* 重文または複文なら、接続詞までで検索を打ち切る */
   _  _     *tend = j9 - 1;
   _  }
   }
   else  {               /* 後方(Z)検索の場合 */
   _  *tend = wc + 1;                   /* 終了の位置は一つ後の単語 */
   _  tsta = wnb;                      /* スタートの位置は文末 */
   _  if (strchr(csq,'#') && (! strchr(csq + wc,'#'))) {
   _  _  *eu = '\0';    /* 埋め込み型熟語「#」に埋め込まれる単語については、*/
   _  _  for (i = wc - 1; i > 0; i--)    /* 埋め込み先に遡って、検索を行う。*/
   _  _     if (jn[i][0] == '#') {
   _  _     _  left(eu,jn[i],2);
   _  _     _  i1 = i;
   _  _     _  break;
   _  _     }
   _  _  if (*eu) {
   _  _  _  for (i = i1; i >= 0; i--) {
   _  _  _  _  if (strstr(aj[i][0],eu)) {
   _  _  _  _  _  *tend = i + 1;
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  }
   _  _  _  for (i = 0; i < wc; i++)
   _  _  _     if (aj[i][0][0] == '#') {
   _  _  _     _  tsta = i - 1;
   _  _  _     _  break;
   _  _  _     }
   _  _  }
   _  }
   _  strcpy(cq1,csq + wc + 1);
   _  j9 = instrc(cq1,'9');                /* 後方にある接続詞の位置 */
   _  j00 = ninstrc(j9 + 1,cq1,'0');
   _  j3 = instrc(csq,'3');                /* 後方にある動詞句の位置 */
   _  j33 = ninstrc(j9 + 1,cq1,'3');       /* 接続詞より後にある動詞句の位置 */
   _  if ((j9 > 0) && (j3 > 0) && (wc + 1 + j9 > j3) && (j33 > 0) && ((j00 == 0) || (! strchr(cq1,'|')) || (j33 < j00)))
   _     tsta = wc + j9;
   /* 後方に、２つの動詞句を分離する接続詞が在れば、そこから検索を開始する。 */
   _  for (i = *tend; i <= tsta; i++) {
   _  _  p3 = csq[i];
   _  _  if ((! p3) || strchr("0|?!#",p3))
   _  _     break;
   _  _  ptr = strchr(az[i][0],'r');
   _  _  pty = strchr(az[i][0],'y');  /* 序数詞の倍角文字に含まれる 'r' を排除した。2005.02.14 */
   _  _  if ((ptr && ((! pty) || (ptr < pty)) && strchr(ptr + 1,'|')) && (! aj[i][1][0]))
   _  _     break;  /* 関係詞(属性 'r')が在れば、そこから検索を開始する */
   _  }
   _  if (i < tsta)
   _     tsta = i;
   }
   return(tsta);
end

static int  azCodeCk(int i, char *pj, char tst[], int tsta, int saiyo)
                            /* 訳語の品詞コードまたは属性コードのチェック */
begin       /* global variables: aj[][][], az[][][] */
   register int j;
   int  hit, posct, negct;
   char bb[45], *ch, *pt_bar;
   
   posct = 0;
   negct = 0;
   for (j = 0; j <= YakMaxCt; j++)  {
   _  hit = 0;
   _  if (aj[i][j][0] == '\0')
   _     break;
   _  if (*(pj - 2) == 'J' || *(pj - 3) == 'J')
   _     left(bb,aj[i][j],1);                /* 品詞コードをコピーする */
   _  else {
   _  _  if (az[i][j][0] == '\0') {
   _  _  _  ++negct;
   _  _  _  hit = 1;
   _  _  }
   _  _  else {                              /* 属性コードをコピーする */
   _  _  _  strcpy(bb,az[i][j]);
   _  _  _  pt_bar = strchr(bb,'|');
   _  _  _  if (pt_bar)        /* 第２属性を切り捨てる。2002.08.17 */
   _  _  _     *pt_bar = '\0';
   _  _  _  ch = strchr(bb,'y');
   _  _  _  if (ch)
   _  _  _     *(ch + 1) = '\0';
   _  _  }
   _  }
   _  if (! hit) {/* 品詞または属性コードが NULL でない時 */
   _  _  ch = tst;
   _  _  while (*ch) {
   _  _  _  if (strchr(bb,*ch++)) {
   _  _  _  _  ++posct;  /* 条件に合致した文字が在れば、 */
   _  _  _  _  hit = 1;                       /* posct をひとつ増加させる。*/
   _  _  _  _  break;
   _  _  _  }
   _  _  }
   _  _  if (! hit) /* 条件に合致する文字が一つもなければ */
   _  _     ++negct;                           /* negct を一つ増加させる。 */
   _  }
   }
   if (posct && (! negct))     /* posct と negct の決算   */
      saiyo = 1;                    /* 条件に合格ならば saiyo = 1 */
   else {
   _  if ((! posct) && negct && ((i == tsta) || (saiyo == -1)))
   _     saiyo = -1;        /* 条件に反していると、saiyo = -1 */
   _  else
   _     saiyo  = 0;   /* 条件の合否が判定できなかった時は、saiyo = 0 */
   }
   return(saiyo);
end


static int  zenbun_comp(int j, char cd[], int ks)   /* 前の文の訳語と比較する。 */
begin      /* global variables: caj[][], sj[], oj[], vr[], cnb */
   register int i;
   int sute, yn0, yn1, lns, lno, lnv, lnm, hit, mrk[YakugoMax];
   char md[JWordLen], *ptmd;

   yn0 = 0;
   yn1 = 0;
   lns = strlen(sj);
   lno = strlen(oj);
   lnv = strlen(vr);
   for (i = 0; i <= cnb; i++) {
   _  hit = 0;
   _  mrk[i] = 2;
   _  if (strchr(cd,caj[i][0]) && (strlen(caj[i]) >= 2)) {
   _  _  strcpy(md,caj[i] + 1);
   _  _  if ((*sj && (instr(sj,md) == 2) && (! strstr(sj,"（")) ) || (*oj && (instr(oj,md) == 2) && (! strstr(oj,"（")) ) || (*vr && (instr(md,vr) >= 1) && (instr(md,vr) <= 3) && (! strstr(vr,"（")) )) {
   _  _  _  if (ks || (strstr(md,"be ") != md) || strcmp(vr,"be")) {
   _  _  _  _  yn0 = 1;     /* 前文の主語、目的語、動詞のどれかの先頭と一致 */
   _  _  _  _  mrk[i] = 1;
   _  _  _  _  hit = 1;
   _  _  _  }
   _  _  }
   _  _  if ((! hit) && (caj[i][0] == '3') && *vr2 && (instr(md,vr2) >= 1) && (instr(md,vr2) <= 3) && (! strstr(vr2,"（"))) {
   _  _  _  if (ks || (strstr(md,"be ") != md) || strcmp(vr,"be")) {
   _  _  _  _  yn0 = 1;   /* 前々文の主語、目的語、動詞のどれかの先頭と一致 */
   _  _  _  _  mrk[i] = 1;
   _  _  _  _  hit = 1;
   _  _  _  }
   _  _  }
   _  _  yn0 = zenMatubi(cd,lns,lno,lnv,md,&hit,yn0);
                          /* 前の文の主語、目的語、動詞の末尾と比較する。*/
   _  _  ptmd = strstr(pes,md);
   _  _  if ((! hit) && (ks == 2) && *pes && ptmd && ((strcmp(cd,"11") == 0) || (strcmp(cd,"33") == 0))) {
 /* ここは弱いチェックなので、ラストの回(ks == 2)迄に絞れなかった時のみ行う。*/
   _  _  _  lnm = strlen(md);
   _  _  _  if ((! strstr(ptmd,"）")) || strstr(ptmd + lnm + 2,"（")) {
   _  _  _  _  yn0 = 1; /* 名詞間、動詞間の比較には前文の訳文全体と比較する */
   _  _  _  _  mrk[i] = 1;  /* 前の訳文に含まれている訳語は　mrk[i] = 1 */
   _  _  _  _  hit = 1;  /* 前の訳文に含まれている訳語は　hit = 1 */
   _  _  _  }
   _  _  }      /* 品詞コードが一致し、前の文の訳語と無関係なら mrk[i] = 0 */
   _  _  mrk[i] = hit; 
   _  }
   }
   if (yn0) {   /* 目印を含む訳語侯補が存在する時だけ yn0 > 0 */
   _  sute = 30;
   _  for (i = 0; i <= cnb; i++) {
   _  _  if (mrk[i] == 0) {
   _  _  _  yn1 = 1;
   _  _  _  sute = sute_count(i,j,sute); /* 不適格訳語を捨て、パラメータ sute の値を設定 */
   _  _  }
   _  }
   }
   if (yn1 == 1)
      yakAkitume(); /* 訳語候補の空きを詰める。 kakut モジュールにある。 */
   else
      sute = 0;
   return(sute);
end

static int  zenMatubi(char cd[], int lns, int lno, int lnv, char md[], int *hit, int yn0)           /* 前の文の主語、目的語、動詞の末尾と比較する。*/
begin                /* global variables: sj[], oj[], vr[], sj2[] */
   int lnm;
   
   lnm = strlen(md);
   if ((! *hit) && ((lnm > 3) || (*cd != '7'))) { /* 品詞が '7' の時を除く。*/
   _  if ((lns > lnm) && (strcmp(sj + lns -lnm,md) == 0)) {
   _  _  yn0 = 1;                 /* 前文主語の末尾と一致 */
   _  _  *hit = 1;
   _  }
   _  else {
   _  _  if ((lno > lnm) && (strcmp(oj + lno - lnm,md) == 0)) {
   _  _  _  yn0 = 1;                 /* 前文目的語の末尾と一致 */
   _  _  _  *hit = 1;
   _  _  }
   _  _  else {
   _  _  _  if ((lnv > lnm) && (strcmp(vr + lnv - lnm,md) == 0) && strcmp(md,"する")) {
   _  _  _  _  yn0 = 1;                 /* 前文動詞の末尾と一致 */
   _  _  _  _  *hit = 1;
   _  _  _  }
   _  _  }
   _  }
   }
/*   if ((! ct) && (lnv > 0) && (lnm > lnv) && strcmp(vr,"である") && (! strcmp(md + lnm - lnv,vr))) {
   _  if (strcmp(vr,"いる") && (strcmp(vr,"ある") || (lnm == 6))) {
   _  _  yn0 = 1; */  /* vr = "いる", md = "．．．ている" の場合を排除する。*/
/*   _  _  mrk[i] = 1;
   _  _  ct = 1;
   _  }
   }                */
   if ((! *hit) && *sj2 && ((lnm > 3) || (*cd != '7'))) {
   _  lns = strlen(sj2);    /* 比較している訳語の品詞が '7' の場合を除く。*/
   _  if ((lns > lnm) && (strcmp(sj2 + lns -lnm,md) == 0)) {
   _  _  yn0 = 1;                 /* ２つ前の文の主語の末尾と一致 */
   _  _  *hit = 1;
   _  }
   }
   return(yn0);
end

static int  yakusuteMk(char tcd[], int j)
     /*  適訳規則を適用して、一方の候補にマークをし、それに基づいて捨てる。 */
begin  /* global variables: cnb, Dbg, ptek[], caj[][], caz[][] */
   register int i;
   int sute, jz, j_sg, shsw, yn0, yn1, mk_match, mrk[YakugoMax];
   unsigned int ln;
   char fc, sg[WordLen], v0[JWordLen], *pch, *ptsg;

   pch = strchr(ptek + 4,';');
   ptcpy(sg,ptek + 3,pch);
   shsw = 0;
   jz = *(pch + 1) - '0';
   sute = 30;
   if (*sg == '*') {       /* sg は選択する（捨てる）方の目印 */
   _  shsw = 1;     /* shsw = 0 なら捨てる目印、 shsw = 1 なら拾う目印 */
   _  ptcut(sg,1);
   }
   yn0 = 0;
   yn1 = 0;
   switch (jz) {
    case 0:     /* 目印が品詞コードの場合。必ずひとつは捨てる。 */
      if (Dbg == 'Y' || Dbg == 'y')
	 tekDbgDisp(j);  /* 適訳規則のデバッグ表示 */
      if (((*sg == *tcd) && (shsw == 0)) || ((*sg != *tcd) && shsw))
	    fc = *tcd;/* tcd は比較している２つの品詞コードの並び "13","77" など*/
      else
	    fc = tcd[1];
      for (i = 0; i <= cnb; i++) {  /* cnb は訳語候補の数 Candidate NumBer */
      _  if (fc == caj[i][0]) {     /*  fc は捨てる方の訳語の品詞コード */
      _  _  yn1 = 1;
      _  _  sute = sute_count(i,j,sute);
		   /* 不適格訳語を捨て、パラメータ sute の値を設定 */
      _  }
      }
      break;
    case 1:  /* 属性コードによる適訳選択 */
      for (i = 0; i <= cnb; i++) {
      _  mrk[i] = 2;/* 品詞コードが一致しない訳語は取捨に無関係で mrk[i] = 2 */
      _  if (strchr(tcd,caj[i][0])) { /* 品詞コードが条件に合致する訳語 */
      _  _  ptsg = strchr(caz[i],*sg);
      _  _  if (ptsg && strchr(ptsg,'|')) {
      _  _  _  yn0 = 1;                /* 指定された属性コードを含む場合 */
      _  _  _  mrk[i] = 0; /* 指定された属性コードを含む時は mrk[i] = 0 */
      _  _  }
      _  _  else
      _  _     mrk[i] = 1; /* 目印の属性コードを含まなければ mrk[i] = 1  */
      _  }
      }
      break;
    case 2: /* 選択の目印が訳語（またはその１部分）の場合 */
      ln = strlen(sg) - 1;
      for (i = 0; i <= cnb; i++) {
      _  mk_match = 0;
      _  mrk[i] = 2;/* 品詞コードが一致しない訳語は取捨に無関係で mrk[i] = 2 */
      _  strcpy(v0,caj[i]);
      _  if (strchr(tcd,*v0)) { /* 目印は訳語の先頭、または末尾、または "/" */
      _  _  if ( (instr(v0,sg) == 2)  &&  ((! *(v0 + ln + 2)) || (*(sg + ln) == ' ') || (*(v0 + ln + 2) == ' ')) )
      _  _     mk_match = 1;
	  _  _  j_sg = instr(v0,sg);
	  _  _  if (j_sg &&  ((unsigned int)j_sg == strlen(v0) - ln)  &&  ((*(v0 + j_sg - 2) == ' ') || (*sg == ' ') || (strcmp(sg,"/") == 0)) )
				   /* "/" は分離型訳語の分離位置 */
      _  _     mk_match = 1;
      _  _  if (mk_match) {
      _  _  _  mrk[i] = 0;/* 品詞コードが一致し、かつ目印を含めば mrk[i] = 0 */
      _  _  _  yn0 = 1;
      _  _  }
      _  _  else
      _  _     mrk[i] = 1;/* 品詞コードが一致し、かつ目印が無いと mrk[i] = 1 */
      _  }
      }
      break;
    case 3:  /* 第２属性による適訳選択 */
      for (i = 0; i <= cnb; i++) {
      _  mrk[i] = 2;/* 品詞コードが一致しない訳語は取捨に無関係で mrk[i] = 2 */
      _  if (strchr(tcd,caj[i][0])) { /* 品詞コードが条件に合致する訳語 */
      _  _  ptsg = strchr(caz[i],'|');
      _  _  if (ptsg && strstr(ptsg + 1,sg)) {
      _  _  _  yn0 = 1;                /* 指定された第２属性を含む場合 */
      _  _  _  mrk[i] = 0; /* 指定された第２属性を含む時は mrk[i] = 0 */
      _  _  }
      _  _  else
      _  _     mrk[i] = 1; /* 目印の第２属性を含まなければ mrk[i] = 1  */
      _  }
      }
      break;
   }
   sute = yakugoSute(j,yn0,yn1,sute,shsw,mrk);
   return(sute);
end


static void tekDbgDisp(int j)       /* 適訳規則のデバッグ表示 */
begin                        /* global variables: ptek[], caj[][], Dbg2 */

  color_light_blue;
  printf("\n %s",ptek);
  color_magenta;
  printf("     %c",caj[0][0]);
  color_white;
  printf("%s ; ",caj[0] + 1);
  color_magenta;
  printf("%c",caj[j][0]);
  color_white;
  printf("%s \n",caj[j] + 1);
#if defined(USER)
  if (Dbg2 == 'Y') {
  _  fprintf(dbgfl_pt,"\n %s",ptek);
  _  fprintf(dbgfl_pt,"     %s ; %s \n",caj[0],caj[j]);
  }
#endif
end


static int  sute_count(int i, int j, int sute)
                   /* 不適格訳語を捨て、パラメータ sute の値を設定 */
begin              /* global variables: cnb, caj[][] */
   int nshp;
   char *pt0, *pt1;

   pt0 = strchr(caj[0],'#');
   pt1 = strchr(caj[1],'#');
   if ((i == 0) && pt0 && pt1 && isdigit(*(pt0 + 2))) {
   _  if (isdigit(*(pt1 + 2))) {
   _  _  nshp = instrc(csq,'#') - 1;
   _  _  az[nshp][0][2] = *(pt1 + 2);
   _  }
   }
   caj[i][0] = '\0';
   if (i == 0)
      sute = 20;  /* 筆頭の訳語候補を捨てた時は、sute = 20 と置く。 */
   else {
   _  if (sute == 30) { /* 最後の訳語候補を捨てる時は sute = 30 */
   _  _  if (i < cnb)
   _  _     sute = 10;  /* 最後の訳語候補でなければ sute = 10 と置く。 */
   _  _  if (j < i) /* 現在チェックしている候補（j番目）より後の */
   _  _     sute = 0;              /* 候補を捨てる時は sute = 0 と置く。*/
   _  }
   }
   return(sute);
end

static void zenmetsu(void) /* 訳語候補が全滅した時の処理： 元に戻しておく。 */
begin  /* global variables: wc,cnb,aj[][][],az[][][],ptek,caj[][],caz[][] */
   register int i;
   int  ln;
   char *pch;
   
   i = 0;
   while(aj[wc][i][0]) {
   _  strcpy(caj[i],aj[wc][i]);
   _  strcpy(caz[i],az[wc][i]);
   _  i++;
   }
   cnb = --i;
   if (! strstr(caj[0],"{全滅！ ptek = ...")) {
   _  strcat(caj[0],"{全滅！ ptek = ...");
   _  ln = strlen(ptek);
   _  if (ln <= 8)
   _     strcat(caj[0],ptek);
   _  else
   _     strcat(caj[0],ptek + ln - 8);
   _  strcat(caj[0],"}");
   _  pch = strchr(caj[0],0x0A);
   _  if (pch)
   _     ptcut(pch,1);
   }
end

static int yakugoSute(int j, int yn0, int yn1, int sute, int shsw, int mrk[])
         /* マークに基づき不適格な訳語を捨てる。*/
begin  /* global variables: Dbg, cnb, wc, ptek[], outfl_pt, en[][], caj[][] */
   register int i;

   if (yn0) {  /* jz = 1 or 2 で目印を含む訳語侯補が存在する時だけ yn0 > 0 */
   _  if (Dbg == 'Y' || Dbg == 'y')
   _     tekDbgDisp(j);  /* 適訳規則のデバッグ表示 */
   _  for (i = 0; i <= cnb; i++) {
   _  _  if (mrk[i] == shsw) { /*shsw = 1 なら拾う規則、shsw = 0 なら捨てる規則*/
   _  _  _  yn1 = 1;
   _  _  _  sute = sute_count(i,j,sute);
                         /* 不適格訳語を捨て、パラメータ sute の値を設定 */
   _  _  }
   _  }
   }
   if (yn1) { /* 訳語候補を捨てなかった時は yn1 = 0 のまま */
   _  yakAkitume(); /* 訳語候補の空きを詰める。 kakut モジュールにある。 */
   _  if (cnb < 0) {
   _  _  zenmetsu(); /* 訳語候補が全滅した時の処理： 元に戻しておく。 */
   _  _  sute = 0;
   _  }
   _  if (tolower(Dbg) == 'y') {
   _  _  color_green;
   _  _  if (! cnb) {
   _  _  _  printf(" 日本語単語 '%s' の訳語が「",jn[wc]);
   _  _  _  color_magenta;
   _  _  _  printf("%c",caj[0][0]);
   _  _  _  color_white;
   _  _  _  printf("%s",caj[0] + 1);
   _  _  _  color_green;
   _  _  _  printf("」に確定しました。\n\n");
   _  _  _  color_white;
   _  _  }
   _  _  else {
   _  _  _  printf(" 日本語単語 '%s' の残りの訳語候補 \n",jn[wc]);
   _  _  _  for (i = 0;i <= cnb; i++) {
   _  _  _  _  color_magenta;
   _  _  _  _  printf(" %c",caj[i][0]);
   _  _  _  _  color_white;
   _  _  _  _  printf("%s,  ",caj[i] + 1);
   _  _  _  }
   _  _  _  printf("\n\n");
   _  _  }
#if defined(USER)
   _  _  if (Dbg2 == 'Y') {
   _  _  _  if (! cnb)
   _  _  _     fprintf(dbgfl_pt," 和単語 '%s' の訳語が「%s」に確定しました。\n\n",jn[wc],caj[0]);
   _  _  _  else {
   _  _  _  _  fprintf(dbgfl_pt," 和単語 '%s' の残りの訳語候補 \n",jn[wc]);
   _  _  _  _  for (i = 0;i <= cnb; i++)
   _  _  _  _     fprintf(dbgfl_pt," %s,  ",caj[i]);
   _  _  _  _  fprintf(dbgfl_pt,"\n\n");
   _  _  _  }
   _  _  }
#endif
   _  }
   }
   else
      sute = 0; /* 訳語をひとつも捨てなかった時も sute = 0 と置く。 */
   return(sute);
end


static int  betsuyaku_settei(int BetsuYk, int *tek_ck, int *betsuyaku_hozon)
begin
  /* global variables: wnb, aj[][][], aj0[][][], az[][][], az0[][][], en[][], enp[][] */
   register int  i, j;
   int  i1, j1, betsu = 0;
   char hs_code;
   
   for (i = 0; i <= wnb; i++) {
   _  hs_code = aj[i][0][0];
   _  for (j = 1; j <= YakMaxCt; j++) {
   _  _  if (! aj[i][j][0])
   _  _     break;
   _  _  if (aj[i][j][0] != hs_code) { /* 品詞が互いに異なる訳語が残った場合 */
   _  _  _  betsu = 1;
   _  _  _     break;
   _  _  }
   _  }
   _  if (betsu)
   _     break;
   }
   if (betsu) {
   _  i1 = i;
   _  j1 = j;
   _  if (! BetsuYk) {     /* aj0[][] への保存は最初の１回限りとした。*/
   _  _  if (i1)           /* 2000.06.17 */
   _  _     aj0_copy(0,i1 - 1);
                            /* en[0] から en[i1-1] までの訳語達を保存する。*/
   _  _  if (i1 < wnb)
   _  _     aj0_copy(i1 + 1,wnb);
                       /* en[i1 + 1] から en[wnb] までの訳語達を保存する。*/
   _  _  if (wnb < WordNumb - 1) {
   _  _  _  for (i = wnb + 1; i < WordNumb; i++)
   _  _  _     aj0[i][0][0] = '\0';
   _  _  }
   _  }
   _  for (j = j1; j <= YakMaxCt; j++) {
   _  _  strcpy(aj0[i1][j - j1],aj[i1][j]); 
                    /* 前方ではなく後方を保存するように修正した。1999.07.01 */
   _  _  strcpy(az0[i1][j - j1],az[i1][j]);
   _  _  if (! aj[i1][j][0])
   _  _     break;
   _  }
   _  if (! BetsuYk) {
   _  _  printf("\n\n第１訳文の形成（次に別訳も作ります。）\n\n");
   _  _  if (Dbg2 == 'Y')
   _  _     fprintf(dbgfl_pt,"\n\n第１訳文の形成（次に別訳も作ります。）\n\n");
   _  }
   _  *betsuyaku_hozon = 1;
   _  ++BetsuYk;
   _  if (BetsuYk == 3) {
   _  _  printf("\n\n第３訳文の形成　\n\n");
   _  _  if (Dbg2 == 'Y')
   _  _     fprintf(dbgfl_pt,"\n\n第３訳文の形成　\n\n");
   _  }
   _  aj[i1][j1][0] = '\0';
   _  strcpy(jnp[i1],jn[i1]);
   _  *tek_ck = 0;
   }
   else {
   _  if (BetsuYk == 2) {
   _  _  printf("\n\n第３訳文の形成　\n\n");
   _  _  if (Dbg2 == 'Y')
   _  _     fprintf(dbgfl_pt,"\n\n第３訳文の形成　\n\n");
   _  }
   _  BetsuYk = 0;
   }
   return(BetsuYk);
end

static void aj0_copy(int stt_i, int end_i)
begin
  /* global variables: aj[][][], aj0[][][], az[][][], az0[][][], en[][], enp[][] */
   register int  i, j;

   for (i = stt_i; i <= end_i; i++) {
   _  for (j = 0; j <= YakMaxCt; j++) {
   _  _  if (! aj[i][j][0]) {
   _  _  _  aj0[i][j][0] = '\0';
   _  _  _  az0[i][j][0] = '\0';
   _  _  _  break;
   _  _  }
   _  _  strcpy(aj0[i][j],aj[i][j]);
   _  _  strcpy(az0[i][j],az[i][j]);
   _  }
   _  strcpy(jnp[i],jn[i]);
   }
end


static int  eneq(char tst[], int i)
begin             /* global variables: pes[], pe2[] */
   int ln, lne, br, saiyo;
   char ec[WordLen];
   char *pt;

   saiyo = 0;
   if (aj[i][0][1])
      strcpy(ec,aj[i][0] + 1);
   else
      *ec = '\0';
   if (! *tst)
      goto QUIT;
   switch(*tst) {
    case '*':
      saiyo = en_star_ck(ec,tst,i);
                 /* 英文の一部に指定された文字列が含まれるかチェックする。 */
      break;
    case '/':     /* "Em =/ string"  => aj[i][0] の語尾が string なら O.K. */
      lne = strlen(ec);
      ln = strlen(tst) - 1;
      if ((lne >= ln) && (strcmp(ec + lne - ln,tst + 1) == 0))
         saiyo = 2;
      break;
    case 'O':  /* 注目する英単語が前文の目的語に等しいかどうかのチェック */
      if ((strcmp(tst,"OJ$") == 0) && *oj) {
      _  strcpy(tst,oj);
      _  ln = strlen(tst);
      _  lne = strlen(ec);
	  _  pt = strstr(tst,ec);
	  _  if (pt && ((! *(pt + lne)) || (*(pt + lne) == ' ')))
      _     saiyo = 2;
      _  else
      _     if ((ln >= lne) && (strcmp(tst + ln - lne,ec) == 0))
      _        saiyo = 2;
      }
      break;
    case 'S':
      saiyo = en_S_check(ec,tst);       /* SJ$, SJ2$, or 所有格のチェック */
      break;
    case 'E':
      br = en_E_ck(tst,ec,&saiyo); /* "EB" および "=En" のチェック */
      if (br)
         break;
    default:
      saiyo = en_dflt(ec,tst,i);        /* eneq() のdefault処理 */
	  break;
	 }   /*  switch 文の終わり */
  QUIT:;
  return(saiyo);
end


static int  en_star_ck(char ec[], char tst[], int i)
                 /* 英文の一部に指定された文字列が含まれるかチェックする。 */
begin  /* global variables: wc, wnb, pes[], pe2[], aj[][][], az[][][]  */
   int  ln, wc4, saiyo;
   char estr[SentLen], dums[SentLen], qpes[SentLen];
   char *pt, chb;

   saiyo = 0;
   if ((strcmp(tst,"*BS") == 0) || (strcmp(tst,"*BS2") == 0)) {
   _  sprintf(dums," %s",ec);
   _  if (! tst[3])
   _     strcpy(qpes,pes);
   _  else
   _     strcpy(qpes,pe2);
   _  pt = strstr(qpes,dums);
   _  if (pt) { /* 前の英文に単語 aj[i][0] が含まれているかどうか？ */
   _  _  pt += strlen(dums);
   _  _  chb = *pt;
   _  _  if (strchr(" .,?!:",chb) || ((chb == 's') && (*(pt + 1) == ' ')))
   _  _     saiyo = 2; /* 前の文の中で、ec[] の直後が空白か句切り記号で */
   _  }                                          /* なければ落第とする。*/
   _  else {
   _  _  ln = strlen(dums);
   _  _  if (strchr(az[i][0],'x') && (*(dums + ln - 1) == 'y'))
   _  _    strcpy(dums + ln - 1,"ies");
   _  _  pt = strstr(qpes,dums);
   _  _  if (pt) {
            /* 前の英文に単語 ec が含まれているかどうか？  Try once again! */
   _  _  _  pt += strlen(dums);
   _  _  _  chb = *pt;
   _  _  _  if ((chb == ' ') || (chb == '.') || (chb == ',') || (chb == 's' && *(pt + 1) == ' '))
   _  _  _     saiyo = 2;
   _  _  }
   _  _  else {
   _  _  _  if ((dums[1] >= 'a') && (dums[1] <= 'z')) {
   _  _  _  _  dums[1] -= 32;     /* 先頭を大文字化したものも試す。*/
   _  _  _  _  if (strstr(qpes,dums))
   _  _  _  _     saiyo = 2;
   _  _  _  }
   _  _  }
   _  }
   }
   else {
   _  if (tst[1] == 'E') {
   _  _  if (tst[2] == '-')
   _  _     wc4 = wc + 48 - tst[3];
   _  _  else                   /* Em=*En => Em includes En なら O.K. */
   _  _     wc4 = wc + tst[2] - 48;
   _  _  if ((wc4 >= 0) && (wc4 <= wnb))
   _  _     strcpy(estr,aj[wc4][0] + 1);
   _  _  else
   _  _     goto END;
   _  }
   _  else
   _     strcpy(estr,tst + 1);
   _  if (strstr(ec,estr))
   _     saiyo = 2;
   }
 END:;
  return(saiyo);
end

static int  en_E_ck(char tst[], char ec[], int *saiyo)  /* "EB" および "=En" のチェック */
begin  /* global variables: ct, wc, pes[], aj[][][] */
   int br = 0, wc4;
   
   if (strcmp(tst,"EB") == 0) {
   _  if (ec[0] > 'Z')          /* 前の英文の先頭をチェックする。 */
   _     ec[0] -= 32;
   _  if (pes == strstr(pes,ec))
   _     *saiyo = 2;
   _  br = 1;
   }
   else {
   _  if (tst[1] == '-')
   _     wc4 = wc - tst[2] + 48;
   _  else {
   _  _  if (isdigit(tst[1]))
   _  _     wc4 = wc + tst[1] - 48;
   _  _  else
   _  _     wc4 = -1;
   _  }
   _  if ((wc4 >= 0) && (wc4 <= wnb))
   _     strcpy(tst,aj[wc4][0] + 1);
   _  else
   _     if (wc4 != -1)
   _        br = 1;
   }
   return(br);
end


static int  en_S_check(char ec[], char tst[])
                                     /* SJ$, SJ2$, or 所有格のチェック */
begin  /* global variables: sj[], sj2[]  */

   int  ln, lne, saiyo = 0;
   char *pt;
   
   if (((strcmp(tst,"SJ$") == 0) && *sj) || ((strcmp(tst,"SJ2$") == 0) && *sj2)) {
   _  if (tst[2] == '$')
   _     strcpy(tst,sj);
   _  else
   _     strcpy(tst,sj2);
   _  ln = strlen(tst);
   _  lne = strlen(ec);
   _  pt = strstr(tst,ec);
   _  if (pt && ((! *(pt + lne)) || (*(pt + lne) == ' ')))
   _     saiyo = 2;
   _  else
   _     if ((ln >= lne) && (strcmp(tst + ln - lne,ec) == 0))
   _        saiyo = 2;
   }
   else {
   _  if (strcmp(tst,"S") == 0) /* 所有代名詞であるかどうかのチェック */
   _     saiyo = shoyuuCk(ec);
   }
   return(saiyo);
end


static int  en_dflt(char ec[], char tst[], int i)  /* eneq() のdefault処理 */
begin   /* global variables: aj[][][]  */
   int  ln, lne, saiyo = 0;
   char *pt, *ch;

   ln = strlen(tst);
   lne = strlen(ec);
   if (ln > lne)
      goto TAIL;
   if (lne == ln)  {         /*　指定された語の方が長い時はダメ。 */
   _  if (strcmp(ec,tst) == 0)
   _     saiyo = 2;
   }
   else {
   _  if (lne > ln)  {  /* 指定された語の語頭または末尾にあれば合格 */
   _  _  if ((ec == strstr(ec,tst)) && ((ec[ln] == ' ') || (tst[ln - 1] == ' ')))
   _  _     saiyo = 2;
   _  _  else {
   _  _  _  pt = ec + lne - ln;
   _  _  _  if (*pt != ' ')
   _  _  _     --pt;
   _  _  _  ch = strstr(pt,tst);
   _  _  _  if ((*pt == ' ') && ch && ((ch == pt + 1) || (ch == pt)))
   _  _  _     saiyo = 2;
   _  _  }
   _  }
   }
  TAIL:;
   if (saiyo) {
   _  if (aj[i][1][0] && strcmp(aj[i][0],aj[i][1]))
   _     saiyo = 1;
   }
   else {
   _  if (aj[i][1][0] && (strcmp(aj[i][1] + 1,tst) == 0))
   _     saiyo = 1;
   }
   return(saiyo);
end
