#include <stdio.h>   /*   **************  bunpcnd.c  ************** */
#include <string.h>  /* bunpcd,position,bfukuCk,bf1jt,plrSts,plwd, wc3cal */
/* #include <process.h> */ /* bEqck, beneq, sovck, SOFPck ;  for MS-C & TURBO C++ */
/*   #include <stdlib.h>  ;                           for Lattice C */
#include <ctype.h>    /* bYakuZokuCk, Dblck, jnCk, SOVcomp, bunpDigit */
/*  #include <jstring.h>       for MS-C && TURBO C++  */
/* #include <mbstring.h> */   /*   for Visual C++ ver.4.0  */
/* bEqazck, qzck, ineqck, digitMult, digitAdd, Eqazck2, shoyuuCk */

/* #define  QWJTOE */

#define  USER

#include "macro.h"


static int  position(int *comma);
static int  bfukuCk(int *saiyo);
static int  bf1jt(int comma, char p1[], int *saiyo);
static int  sovCopy(char *pj, char pc, char sov[]);
static int  WashaCopy(char *pj, char sov[]);
static void eng_copy(char tst1[]);
static int  bEqck(char *pj, int *jtpt, int comma, int *wdps);
#if defined(USER)
 static void bun_cnd_copy(char *pj, char buncnd[]);
 static void fail_report(char buncnd[], char *dump);
#endif
static int  bYakuZokuCk(char *pj, char p1[], int wc3, char pc);
static int  SOVcomp(char p1[]);
static int  jnCk(char bj[], char p1[], int wc3);
static char bunpDigit(void);
static int  bEqazck(char *pj);
static int  umeRange(int tsta, int *tend);
static int  digitMult(void);
static int  digitAdd(void);
static int  bEqazck2(int tsta, int tend, char *pj, char p1[]);
static int  beneq(char tst[], int i);
static int  mae_eibun(char ec[], char tst[], int wc3);
static int  eneq_default(char tst[], char ec[], int wc3);

#include "jehonfnc.h"
#include "honyavar.h"


char bunpcd(void)   /* **** 文法規則の適用条件をチェックする。 ****** */
begin                   /*  global variable: dumb[] */
   int saiyo, comma, jtpt, wdps;
   char tf, *pj, *dump;
#if defined(USER)
   int  ln;
   char bunpnb[5], buncnd[50];
#endif

   tf = '\0';
   saiyo = position(&comma);      /* 原文中の位置をチェックする条件 */
   if (saiyo <= 0) {
   _  tf = 'F';              /* 不合格 => (tf = 'F') とする。*/
#if defined(USER)
   _  if (*BPWATCH) {
   _  _  ln = strlen(dumb);
   _  _  ptcpy(bunpnb,dumb + ln - 6,dumb + ln - 2);
   _  _  if (strcmp(bunpnb,BPWATCH) == 0) {
   _  _  _  beeping(2);
   _  _  _  printf("\n 文法規則");
   _  _  _  color_light_blue;
   _  _  _  printf(" %s ",dumb);
   _  _  _  color_white;
   _  _  _  if (saiyo == -5) {
   _  _  _  _  printf("は原文の複文、複数文条件 'FK' or 'PLS' を満足しないので失格となりました。\n");
   _  _  _  _  if (Dbg2 == 'Y') {
   _  _  _  _  _  fprintf(dbgfl_pt,"\n\n");
   _  _  _  _  _  fprintf(dbgfl_pt,"pbun = %s は原文の複文、複数文条件 'FK' or 'PLS' を満足しないので失格となりました。\n",dumb);
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  printf("は原文中の位置の条件 'FT' or 'LT' を満足しないので失格となりました。\n");
   _  _  _  _  if (Dbg2 == 'Y') {
   _  _  _  _  _  fprintf(dbgfl_pt,"\n\n 注目している文法規則 %s は原文中の位置の条件 'FT' or 'LT' を満足しないので失格となりました。\n",dumb);
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
#endif
   }
   else {
   _  dump = dumb;
#if defined(USER)
   _  ln = strlen(dumb);
   _  ptcpy(bunpnb,dumb + ln - 6,dumb + ln - 2);
#endif
   _  jtpt = 0;
   _  pj = strchr(dump,'=');
   _  while (pj)  {
#if defined(USER)
   _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _     bun_cnd_copy(pj,buncnd);
	   /* これからチェックに入る１つの適用条件を buncnd[] にコピーする。*/
#endif
   _  _  saiyo = bEqck(pj,&jtpt,comma,&wdps);
   _  _  if ((saiyo < 1) && (*pj == ' ')) {     /* 等号条件のチェック */
   _  _  _  tf = 'F';                /* (saiyo == 1) --> ok */
#if defined(USER)
   _  _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _  _     fail_report(buncnd,dump); /* 失格理由を表示する。*/
#endif
   _  _  _  break;
   _  _  }
   _  _  else
   _  _     dump = ++pj;
   _  _  pj = strchr(dump,'=');
   _  }
   _  if (! tf) {
   _  _  dump = dumb;
   _  _  pj = strstr(dump,"<>");
   _  _  while (pj)  {
#if defined(USER)
   _  _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _  _     bun_cnd_copy(pj,buncnd);
	   /* これからチェックに入る１つの適用条件を buncnd[] にコピーする。*/
#endif
   _  _  _  saiyo = bEqck(pj,&jtpt,comma,&wdps);
   _  _  _  if ((saiyo >= 0) && (*pj == ' ')) {    /* 不等号条件のチェック */
   _  _  _  _  tf = 'F';              /* (saiyo == -1) --> ok */
#if defined(USER)
   _  _  _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _  _  _     fail_report(buncnd,dump); /* 失格理由を表示する。*/
#endif
   _  _  _  _  break;
   _  _  _  }
   _  _  _  else
   _  _  _     dump = ++pj;
   _  _  _  pj = strstr(dump,"<>");
   _  _  }
   _  _  if (! tf) {
   _  _  _  dump = dumb;
   _  _  _  pj = strchr(dump,'=');
   _  _  _  while(pj)  {
#if defined(USER)
   _  _  _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _  _  _     bun_cnd_copy(pj,buncnd);
	   /* これからチェックに入る１つの適用条件を buncnd[] にコピーする。*/
#endif
   _  _  _  _  saiyo = bEqazck(pj);                  /* 前方後方の等号条件 */
   _  _  _  _  if (saiyo < 1) {              /* (saiyo < 1) --> fail */
   _  _  _  _  _  tf = 'F';
#if defined(USER)
   _  _  _  _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _  _  _  _     fail_report(buncnd,dump); /* 失格理由を表示する。*/
#endif
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     dump = pj + 1;
   _  _  _  _  pj = strchr(dump,'=');
   _  _  _  }
   _  _  _  if (! tf) {
   _  _  _  _  dump = dumb;
   _  _  _  _  pj = strstr(dump,"<>");
   _  _  _  _  while(pj)  {
#if defined(USER)
   _  _  _  _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _  _  _  _     bun_cnd_copy(pj,buncnd);
	   /* これからチェックに入る１つの適用条件を buncnd[] にコピーする。*/
#endif
   _  _  _  _  _  saiyo = bEqazck(pj);            /* 前方後方の不等号条件 */
   _  _  _  _  _  if (saiyo > -1) {          /* (saiyo > -1) --> fail */
   _  _  _  _  _  _  tf = 'F';
#if defined(USER)
   _  _  _  _  _  _  if (*BPWATCH && (strcmp(bunpnb,BPWATCH) == 0))
   _  _  _  _  _  _     fail_report(buncnd,dump); /* 失格理由を表示する。*/
#endif
   _  _  _  _  _  _  break;
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (*(pj + 2) == '#')
   _  _  _  _  _  _     *(pj + 2) = ' ';
   _  _  _  _  _  _  dump = pj + 1;
   _  _  _  _  _  }
   _  _  _  _  _  pj = strstr(dump,"<>");
   _  _  _  _  }
   _  _  _  _  if (! tf)    /* 文法規則中に現れる数値に関する判定と処理*/
   _  _  _  _     tf = bunpDigit();
   _  _  _  }
   _  _  }
   _  }
   }
   if (! tf)    /* 条件に合格 => (tf = 'T') とする。*/
      tf = 'T';
   return(tf);
end

#if defined(USER)
static void bun_cnd_copy(char *pj, char buncnd[])
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(buncnd,pta,ptz);
end
#endif


static void fail_report(char buncnd[], char *dump) /* 失格理由を表示する。*/
begin  /* global variables:  dump[], Dbg2 , dbgfl_pt  */

   beeping(3);
   printf("\n 文法規則 ");
   color_light_blue;
   printf("%s ",dump);
   color_white;
   printf("は等号条件 %s を満足しないので失格となりました。\n",buncnd);
   if (Dbg2 == 'Y') {
   _  fprintf(dbgfl_pt,"\n\n");
   _  fprintf(dbgfl_pt,"pbun = %s は %s を満足しません。 \n",dump,buncnd);
   }
end


static int  position(int *comma) /* 原文中の位置をチェックする条件 */
begin                /* global variables: pbun[], te, wc, wnb, cj[][] */
   int  saiyo;
   char c;

   saiyo = 1;
   *comma = -1;
   if (strstr(pbun,"LT"))
      if (te < wnb) {           /* 文末の単語であることをチェックする */
      _  c = cj[te + 1][0];
      _  if (c != '0' && c != '?' && c != '!' && c != '|')
      _     saiyo = 0;
      }
   if (saiyo) {
   _  if (strstr(pbun,"FT") && (wc > 0)) {
   _  _  c = cj[wc - 1][0];      /* 文頭の単語であることをチェックする */
   _  _  if (c != '0' && c != '?' && c != '!' && c != '|' && c != '*')
   _  _     saiyo = 0;
   _  }
   _  if (saiyo) {
   _  _  if (strstr(pbun,";FK;"))
   _  _     *comma = bfukuCk(&saiyo);
                     /* カンマの位置を変数 *comma に代入する。*/
   _  _  if (saiyo && strstr(pbun,";PLS;")) {
   _  _  _  *comma = plrSts(); /* 原文が複数の文から成る事をチェックする */
   _  _  _  if (*comma == - 1)
   _  _  _     saiyo = -5;
   _  _  }
   _  }
   }
   return(saiyo);
end

static int  bfukuCk(int *saiyo)
         /* 単語の位置が複文（または重文）の後半部にある事をチェックする */
begin    /* global variables; wc, wnb, cj[][], csq[] */
   register int i;
   int  comma;
   char mae[WordLen], ato[WordLen], *zk;

   *saiyo = 1;
   comma = -1;
   if (wc < 2)
      *saiyo = -5;
   else {             /* 前方のコンマまたは "and" の位置を探す。*/
   _  comma = 0;
   _  for (i = wc - 1; i >= 1; i--) {
   _  _  if (strcmp(cj[i],"0,") == 0 || strcmp(cj[i],"9and") == 0) {
   _  _  _  comma = i;
   _  _  _  if (strcmp(cj[i - 1],"0,") == 0)
   _  _  _     comma--; /* ", and" の時は "," の位置を comma に代入する */
   _  _  _  break;
   _  _  }
   _  }
   _  if (comma == 0)
   _     *saiyo = -5;
   _  else {
   _  _  ptcpy(mae,csq,csq + comma);
   _  _  strcpy(ato,csq + comma + 1);
   _  _  if ((! strchr(ato,'3')) && (! strchr(ato,'4')))
   _  _     *saiyo = -5; /*       comma の位置より後方に動詞が無ければ落第 */
   _  _  else {
   _  _  _  zk = cz[comma - 1];
   _  _  _  if ((! strchr(mae,'3')) && (! strchr(zk,'i')) && (! strchr(zk,'j')) && (! strchr(zk,'H')))
   _  _  _     *saiyo = -5; /*    comma の位置より前方に動詞が無ければ落第 */
   _  _  }
   _  }
   }
   return(comma);
end


int  plrSts(void)     /* 原文が複数の文から成る事をチェックする。*/
begin                     /* 直前のピリオドの位置を、変数 prd に代入する。*/
   register int i;        /* global variables: wc, jwn[] */
   int  prd;

   prd = - 1;
   if (wc >= 2)
      for (i = wc - 1; i >= 1; i--) {
      _  if ((strcmp(jwn[i],"。") == 0) || (strcmp(jwn[i],"？") == 0) || (strcmp(jwn[i],"！") == 0)) {
      _  _  prd = i;
      _  _  break;
      _  }
      }
   return(prd);
end

int wc3cal(char *pj, char pc) /* 適訳規則で指定された単語の相対位置 pc から、*/
begin                         /* 原文中の絶対位置 wc3 を計算する。 */
   int wc3;

   if (*(pj - 2) == '-')
      wc3 = wc - pc + '0';
   else
      wc3 = wc + pc - '0';
   return(wc3);
end

static int  bEqck(char *pj, int *jtpt, int comma, int *wdps)
                    /* 文法規則の中の、等号条件のチェック */
begin
   int wc3, saiyo;
   char pc, p1[JSentLen], *chp;

   pc = *(pj - 1); /* WASHA チェックに対応した。2001.06.14 */
   if ( ((pc != 'A') || (*(pj - 2) == 'H'))
      && ((pc != 'Z') || (*(pj - 2) == 'S') || (*(pj - 2) == 'O') || (*(pj - 2) == 'V') 
                || (*(pj - 3) == 'S') || (*(pj - 3) == 'O')  || (*(pj - 3) == 'H')) ) {
   _  chp = strchr(pj + 1,';');
          /*  SZ = ?, OZ = ?, SDZ = ?, ODZ = ? などは、ここでチェックする。 */
   _  if (*pj == '=')            /* 等号条件 「=...;」の場合 */
   _     ptcpy(p1,pj + 1,chp);
   _  else                       /* 不等号条件 「<>...;」の場合 */
   _     ptcpy(p1,pj + 2,chp);
   _  saiyo = sovck(pj,p1,pc);   /* 前の文の主語、目的語、動詞のチェック */
   _     /* sovck() は適訳規則チェックと共有 */
   _  if ((! saiyo) && (*(pj - 2) != '-') && (*(pj - 3) != 'D'))
   _     saiyo = SOFPck(pc,p1,pj,*jtpt,wdps,comma);
   _      /* 前の文の主語、目的語や複文、重文に関するチェック */
   _  if ((! saiyo) && (*(pj - 2) == 'J') && (pc == 'T'))
     /* F1JT=p1 または P1JT=p1 （p1 = 品詞コードまたは属性コード）のチェック*/
   _     *jtpt = bf1jt(comma,p1,&saiyo);
   _  if (! saiyo) {
   _  _  if ((*(pj - 2) == '-') && (*(pj - 4) == '2') && (*(pj - 5) == 'P'))
   _  _     wc3 = *wdps - (pc - '0');  /* P2#-n=? (pc = n) のチェック */
   _  _  else {
   _  _  _  if ((*(pj - 3) == '2') && (*(pj - 4) == 'P'))
   _  _  _     wc3 = *wdps + pc - '0';    /* P2#n=? (pc = n) のチェック */
   _  _  _  else                          /* ( # = 'E','T', など) */
   _  _  _     wc3 = wc3cal(pj,pc);
   _  _  }
   _  _  if ((wc3 < 0) || (wc3 > wnb))
   _  _     saiyo = -1;
   _  _  else {
   _  _  _  if ((*(pj - 2) == 'E') ||  (*(pj - 3) == 'E')) {
   _  _  _  _  saiyo = beneq(p1,wc3);   /* 英単語（訳語）に関する等号条件 */
   _  _  _  _  if (saiyo < 1)
   _  _  _  _     saiyo = -1;
   _  _  _  }
   _  _  _  else
   _  _  _     saiyo = bYakuZokuCk(pj,p1,wc3,pc);
		/* 文法規則中の品詞、属性や日本語単語に関する条件のチェック */
   _  _  }
   _  }
   _  *(pj++) = ' ';  /* チェックが終了したら、（不）等号は消しておく。*/
   _  if (*pj == '#') /* 埋め込み型熟語(#)と文法コマンドマーク(#)が同じ */
   _     *pj = ' ';      /* なので、混同されない様に、'#' も消しておく。*/
   _  else {
   _  _  if ((*(pj + 1) == '#') && (*pj == '>'))
   _  _     *(pj + 1) = ' ';
   _  }
   }
   return(saiyo);
end

int  sovck(char *pj, char tst[], char pc)
	    /* 前の文の主語、目的語、動詞の訳語や属性のチェック */
begin  
   int  ck, wcq;
   unsigned int ln, lnt;
   char sov[JWordLen], *ch, *zokusei2, josuushi[3], *ptyD;

   ck = sovCopy(pj,pc,sov);
	  /* 条件をテストされる文字列 sov[] の値を定める。*/
   if (ck == 2) {
   _  if (strchr("JRD",pc) || strchr("DJ",*(pj - 2)) || (strchr("JR",*(pj - 2)) && (pc == '2'))) {                 /* (*pj == '=') && (pc == *(pj - 1)) */
   _  _  if ( (*tst == '*') || (*(pj - 2) == 'D') || (*(pj - 2) == 'H') ) {
   _  _  _  zokusei2 = strchr(sov,'|');
   _  _  _  if ((*(pj - 1) == 'D') && zokusei2) {
   _  _  _  _  if (strstr(zokusei2 + 1,tst))
   _  _  _  _     ck = 1;   /* 「SDD=男」など第２属性のチェック */
   _  _  _  _  else
   _  _  _  _     ck = -1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (*(pj - 1) == 'Z') {
   _  _  _  _  _  if ((*tst == 'D') && isdigit(*(tst + 1))) { /* 助数詞のチェック。2000.11.12 追加した。*/
   _  _  _  _  _  _  ch = strchr(cz[wc + *(tst + 1) - '0'],'y');
   _  _  _  _  _  _  if (ch)
   _  _  _  _  _  _     ptcpy(tst,ch + 1,ch + 3);
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  if (strchr(cz[wc + *(tst + 1) - '0'],'z'))
   _  _  _  _  _  _  _     ck = -1;   /* 追加した。2002.08.15 */
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  beeping(2);
   _  _  _  _  _  _  _  _  printf("\n\n 文法規則の適用エラー！！　\n");
   _  _  _  _  _  _  _  _  printf("   pbun = %s, tst = %s,cz[%d] = %s  \n",pbun,tst,wc + *(tst + 1) - '0',cz[wc + *(tst + 1) - '0']);
   _  _  _  _  _  _  _  _  exit(1);
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  if ((*tst == 'J') && isdigit(*(tst + 1))) {
   _  _  _  _  _  _  _  wcq = wc + *(tst + 1) - '0';
   _  _  _  _  _  _  _  if (strlen(cj[wcq]) == 3)
   _  _  _  _  _  _  _     strcpy(tst,cj[wcq]); 
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  beeping(2);
   _  _  _  _  _  _  _  _  printf("\n\n 文法規則の適用エラー！！　\n");
   _  _  _  _  _  _  _  _  printf("   pbun = %s,  tst = %s, cj[%d] = %s \n",pbun,tst,wcq,cj[wcq]);
   _  _  _  _  _  _  _  _  exit(1);
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  _  ch = tst;             /* 助数詞のチェック 「SDZ=頭匹」など*/
   _  _  _  _  _  while (*ch && *(ch + 1)) {
   _  _  _  _  _  _  ptcpy(josuushi,tst,tst + 2);
   _  _  _  _  _  _  if (strstr(sov,josuushi)) {
   _  _  _  _  _  _  _  ck = 1;
   _  _  _  _  _  _  _  break;
   _  _  _  _  _  _  }
   _  _  _  _  _  _  ch += 2;
   _  _  _  _  _  }
   _  _  _  _  _  if (! *ch)
   _  _  _  _  _     ck = -1;
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  eng_copy(tst + 1);   /* tst[] に cj[wc + ?] をコピーする。 */
   _  _  _  _  _  if (strstr(sov,tst + 1))     /* 英文文字列のテスト */
   _  _  _  _  _     ck = 1;
   _  _  _  _  _  else
   _  _  _  _  _     ck = -1;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  ln = strlen(sov);
   _  _  _  eng_copy(tst);       /* tst[] に cj[wc + ?] をコピーする。 */
   _  _  _  lnt = strlen(tst);
   _  _  _  if ((strstr(sov,tst) == sov) || (strstr(sov,tst) == (sov + ln - lnt)))
   _  _  _     ck = 1;
   _  _  _  else
   _  _        ck = -1;
   _  _  }
   _  }
   _  else {
   _  _  if ((pc == 'Z') || (*(pj - 2) == 'Z')) {
   _  _  _  ptyD = strchr(sov,'y');
   _  _  _  if (ptyD)
   _  _  _     *(ptyD + 1) = '\0';
   _  _  _  else {
   _  _  _  _  ptyD = strchr(sov,'|');
   _  _  _  _  if (ptyD)
   _  _  _  _     *ptyD = '\0';
   _  _  _  }
   _  _  _  do {
   _  _  _  _  if (strchr(sov,*tst)) {
   _  _  _  _  _  ck = 1;                /* 属性（半角１文字）のテスト */
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  }  while (*(++tst));
   _  _  _  if (ck != 1)
   _  _  _     ck = -1;
   _  _  }
   _  _  else {
   _  _  _  if ( ((pj - 5) == strstr(pj - 5,"WASHA")) || ((pj - 5) == strstr(pj - 5,"ASHA2")) || ((pj - 5) == strstr(pj - 5,"ASHA3")) ) {
   _  _  _  _  eng_copy(tst);       /* tst[] に cj[wc + ?] をコピーする。 */
   _  _  _  _  if (sov == strstr(sov,tst))
   _  _  _  _     ck = 1;
   _  _  _  _  else
   _  _  _  _     ck = -1;
   _  _  _  }
   _  _  }
   _  }
   }
   return(ck);
end


static int  sovCopy(char * pj, char pc, char sov[])
	  /* 条件をテストされる文字列 sov[] の値を定める。*/
begin  /* global variables: sj[], sj2[], sz[], sz2[], oj[], oj2[] */
	       /* oz[], oz2[], vr[], vr2[], vz[], vz2[], washa[], washa2[] */
   int  ck = 0;
   unsigned int ln;

   if ( ((*(pj - 2) == 'S') && (! strchr("O2*",pc))) || ((*(pj - 3) == 'S') && (*(pj - 2) != 'H')) ) {
   _  ck = 2;           /* WASHA チェックに対応した。2001.06.14 */
   _  if (pc == 'J') /* 前文主語 sj[] あるいは前前文主語 sj2[] のチェック */
   _     strcpy(sov,sj);    /* sz[], sz2[] はその属性 */
   _  else {                  /* sj[], sj2[] の先頭文字は品詞コードの '1' */
   _  _  if (pc == '2') {     /* (*pj == '=') && (pc == *(pj - 1)) */
   _  _  _  if (*(pj - 2) == 'J')
   _  _  _     strcpy(sov,sj2);
   _  _  _  else
   _  _  _     strcpy(sov,sz2);
   _  _  }
   _  _  else
   _  _     strcpy(sov,sz);
   _  }
   }
   else {
   _  if ((*(pj - 2) == 'O') || (*(pj - 3) == 'O')) {
   _  _  ck = 2; /* 前文目的語 oj[] あるいは前々文目的語 oj2[] のチェック */
   _  _  if (pc == 'J')
   _  _     strcpy(sov,oj);        /* oz[], oz2[] はその属性 */
   _  _  else {
   _  _  _  if (pc == '2') {
   _  _  _  _  if (*(pj - 2) == 'J')
   _  _  _  _     strcpy(sov,oj2);
   _  _  _  _  else
   _  _  _  _     strcpy(sov,oz2);
   _  _  _  }
   _  _  _  else
   _  _  _     strcpy(sov,oz);
   _  _  }
   _  }
   _  else {
   _  _  if ((*(pj - 2) == 'V') || (*(pj - 3) == 'V')) {
   _  _  _  ck = 2;                   /* 前文動詞 vr[] のチェック */
   _  _  _  if (pc == 'R') {          /* vz[] はその属性 */
   _  _  _  _  ln = strlen(vr);
   _  _  _  _  if (ln < JWordLen)
   _  _  _  _     strcpy(sov,vr);
   _  _  _  _  else
   _  _  _  _     strcpy(sov,vr + ln - JWordLen + 2);
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (pc == '2') {
   _  _  _  _  _  if (*(pj - 2) == 'R') {
   _  _  _  _  _  _  ln = strlen(vr2);
   _  _  _  _  _  _  if (ln < JWordLen)
   _  _  _  _  _  _     strcpy(sov,vr2);
   _  _  _  _  _  _  else
   _  _  _  _  _  _     strcpy(sov,vr2 + ln - JWordLen + 2);
   _  _  _  _  _  }
   _  _  _  _  _  else
   _  _  _  _  _     strcpy(sov,vz2);
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     strcpy(sov,vz);
   _  _  _  }
   _  _  }
   _  }
   }
   if (! ck)
      ck = WashaCopy(pj, sov);
   return(ck);
end


static int  WashaCopy(char * pj, char sov[])
	  /* 条件をテストされる文字列 sov[] の値が wsha[] 等の場合 */
	  /* 2002.12.12 関数として独立させ、属性チェックを追加した。*/
begin  /* global variables: washa[], washa2[], washa3[], wasz[], wasz2[], wasz3[] */
   int  ck = 0;

   if ((pj - 5) == strstr(pj - 5,"WASHA")) {
   _  strcpy(sov,washa);
   _  ck = 2;
   }
   else {
   _  if ((pj - 5) == strstr(pj - 5,"ASHA2=")) {
   _  _  strcpy(sov,washa2);
   _  _  ck = 2;
   _  }
   _  else {
   _  _  if ((pj - 5) == strstr(pj - 5,"ASHA3=")) {
   _  _  _  strcpy(sov,washa3);
   _  _  _  ck = 2;
   _  _  }
   _  }
   }
   if (! ck) {
   _  if ( ((pj - 5) == strstr(pj - 5,"WASHZ")) || ((pj - 5) == strstr(pj - 5,"WASHD")) ) {
   _  _  strcpy(sov,wasz);
   _  _  ck = 2;
   _  }
   _  else {
   _  _  if ( ((pj - 5) == strstr(pj - 5,"ASH2Z=")) || ((pj - 5) == strstr(pj - 5,"ASH2D=")) ) {
   _  _  _  strcpy(sov,wasz2);
   _  _  _  ck = 2;
   _  _  }
   _  _  else {
   _  _  _  if ( ((pj - 5) == strstr(pj - 5,"ASH3Z=")) || ((pj - 5) == strstr(pj - 5,"ASH3D=")) ) {
   _  _  _  _  strcpy(sov,wasz3);
   _  _  _  _  ck = 2;
   _  _  _  }
   _  _  }
   _  }
   }
   return(ck);
}

static void eng_copy(char tst1[])     /* tst[] に cj[wc + ?] をコピーする。 */
begin          /* global variables: wc, cj[][], aj[][][] */
   if ( (*tst1 == 'E') || (*tst1 == 'J') ) {
   _  if (isdigit(*(tst1 + 1))) {
   _  _  if (cj[wc][0]) {
   _  _  _  if (cj[wc + *(tst1 + 1) - '0'][0] == '3') { 
   _  _  _  _  strcpy(tst1,cj[wc + *(tst1 + 1) - '0'] + 1);
   _  _  _  _  genkei(tst1);  /* 動詞は原形に戻しておく。2005.02.09 */
   _  _  _  }
   _  _  _  else
   _  _  _     strcpy(tst1,cj[wc + *(tst1 + 1) - '0'] + 1);
   _  _  }
   _  _  else
   _  _     strcpy(tst1,aj[wc + *(tst1 + 1) - '0'][0] + 1);
   _  }
   _  else {
   _  _  if ((*(tst1 + 1) == '-') && isdigit(*(tst1 + 2))) {
   _  _  _  if (cj[wc][0]) {
   _  _  _  _  if (cj[wc + '0' - *(tst1 + 2)][0] == '3') { 
   _  _  _  _  _  strcpy(tst1,cj[wc + '0' - *(tst1 + 2)] + 1);
   _  _  _  _  _  genkei(tst1);  /* 動詞は原形に戻しておく。2005.02.09 */
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     strcpy(tst1,cj[wc + *(tst1 + 1) - '0'] + 1);
   _  _  _  }
   _  _  _  else
   _  _  _     strcpy(tst1,aj[wc + '0' - *(tst1 + 2)][0] + 1);
   _  _  }
   _  }
   }
end


int  SOFPck(char pc, char p1[], char *pj, int jtpt, int *wdps, int comma)
	     /* 前の文の主語、目的語や複文、重文に関するチェック */
begin
/* global variables: wc, sz[], oz[], jps[], pes[],pes2[], psts[], pst2[], wnb */
   int  saiyo = 0, wcq;
   char *chp;
   
   if (strcmp(p1,"SJ") == 0)
      strcpy(p1,sj);
   else {
   _  if (strcmp(p1,"SJ2") == 0)
   _     strcpy(p1,sj2);
   _  else {
   _  _  if (strcmp(p1,"WASHA") == 0)
   _  _     strcpy(p1,washa);
   _  _  else {
   _  _  _  if (strcmp(p1,"WASHA2") == 0)
   _  _  _     strcpy(p1,washa2);
   _  _  }
   _  }
   }
   switch (pc) {
    case 'O':        /*  "SO = %%" のチェック  */
      chp = p1;   /* 前の文の主語、目的語の属性チェック */
      do {
      _  if (strchr(sz,*chp) || strchr(oz,*chp) || strchr(sz2,*chp) || strchr(oz2,*chp)) {
      _  _  saiyo = 1;
      _  _  break;
      _  }
      } while (*(++chp));
      if (! saiyo)
         saiyo = -1;
      break;
    case 'E':
      if (*(pj - 3) == 'F') {          /* F2E=E% のチェック */
      _  saiyo = beneq(p1,jtpt); /* en[jtpt] = p1 かどうかチェックする。*/
      _  if (saiyo < 1) 
      _     saiyo = -1;
      }
      break;
    case 'B':
      if (*(pj - 2) == 'E') {           /* EB=? のチェック */
      _  if ((pes == strstr(pes,p1)) || ((*p1 == '\\') && (pes == strchr(pes,p1[1]))))
      _     saiyo = 1;
      _  else { /* 前の英文の先頭の単語または文字(EB=\? の時)を調べる。*/
      _  _  chp = strchr(pes,':');
      _  _  if (chp && (*(++chp) == ' ') && ((chp + 1) == strstr(chp,p1)))
      _  _     saiyo = 1;          /* 会話文の場合は、卜書の先頭も試す。*/
      _  _  else {
      _  _  _  if ((*pes == '\"') && ((pes + 1) == strstr(pes + 1,p1)))
      _  _  _     saiyo = 1;
      _  _  _  else
      _  _  _     saiyo = -1;
      _  _  }
      _  }
      }
      break;
    case 'S':
      if (*(pj - 2) == 'B') {
      _  if (*p1 == '*')
      _     p1++;
      _  if ((*p1 == 'E') && isdigit(*(p1 + 1)))
      _     strcpy(p1,cj[wc + *(p1 + 1) - '0'] + 1);
      _  if (strstr(pes,p1))      /*  BS =*? のチェック */
      _     saiyo = 1;  /* 前の英文のどこかに文字列 ? が含まれている事をチェックする。*/
      _  else {
      _  _  if ((*p1 >= 'a') && (*p1 <= 'z')) {
      _  _  _  *p1 -= 32;  /* 先頭を大文字化したものも試す。*/
      _  _  _  if (strstr(pes,p1))
      _  _  _     saiyo = 1;
      _  _  }
      _  _  if (! saiyo)
      _  _     saiyo = -1;
      _  }
      }
      else {
      _  if (*p1 == '*')
      _     p1++;
      _  if ((*p1 == 'D') && (*(p1 + 1) == 'J')) {
      _  _  wcq = wc + *(p1 + 2) - '0';
      _  _  strcpy(p1,jwn0[wcq]);
      _  }
      _  if (*(pj - 3) == 'P') { /* PJS=*? のチェック */
      _  _  chp = strstr(pjs,p1);
      _  _  if (chp)
      _  _     saiyo = 1;
      _  _  else  /* 前の日本文が指定された文字列を含んでいるかどうか調べる。*/
      _  _     saiyo = -1;
      _  }
      _  else {
      _  _  if (*(pj - 3) == 'J') { /* JPS=*? のチェック */
		/*日本語原文が指定された文字列を含んでいるかどうか調べる。*/
      _  _  _  chp = strstr(jps,p1);
      _  _  _  if (chp)
      _  _  _     saiyo = 1;
      _  _  _  else
      _  _  _     saiyo = -1;
      _  _  }
      _  }
      }
      break;
    case '1':
      if (*(pj - 3) == 'P') {
      _  if (*(pj + 2) == '-')     /* PL1=En のチェック */
      _     *wdps = plwd(comma,(*(pj + 3) - '0')*(-1));
      _  else
      _     *wdps = plwd(comma,*(pj + 2) - '0');
      _  if (*wdps < 0)
      _     saiyo = -1;
      _  else
      _     saiyo = 1;
      }
      break;
    case '2':
      if (*(pj - 3) == 'B') { /* BS2=... のチェック */
      _  if (*p1 == '*')
      _     p1++;
      _  if ((p1 == strstr(p1,"E")) && isdigit(*(p1 + 1))) {
      _  _  wcq = wc + *(p1 + 1) - '0';
      _  _  strcpy(p1,cj[wcq] + 1);
      _  }
      _  chp = strstr(pe2,p1);
      _  if (chp) {     /*  BS2=*? のチェック */
      _  _  if ((*(chp + strlen(p1)) == ' ') || (*(chp - 1) == ' '))
      _  _     saiyo = 1;
      _  _  else   /* ２つ前の英文のどこかに文字列 p1 が含まれている事を */
      _  _     saiyo = -1;                              /* チェックする。*/
      _  }
      _  else {
      _  _  if ((*p1 >= 'a') && (*p1 <= 'z')) {
      _  _  _  *p1 -= 32;  /* 先頭を大文字化したものも試す。*/
      _  _  _  if (strstr(pe2,p1))
      _  _  _     saiyo = 1;
      _  _  }
      _  _  if (! saiyo)
      _  _     saiyo = -1;
      _  }
      }
      else {
      _  if (*(pj - 3) == 'J') { /* JS2=... のチェック */
      _  _  if (*p1 == '*')
      _  _     p1++;
      _  _  if (p1 == strstr(p1,"DJ")) {
      _  _  _  if (*(p1 + 2) == '-')           /* =DJ-n; の場合にも対応させた。 */
      _  _  _     wcq = wc - *(p1 + 3) + '0';  /* 2000.11.03 */
      _  _  _  else
      _  _  _     wcq = wc + *(p1 + 2) - '0';
      _  _  _  if ((wcq < 0) || (wcq > wnb)) {
      _  _  _  _  beeping(2);
      _  _  _  _  printf("\n\n wcq is out of range!!  wcq = %d. ",wcq);
      _  _  _  _  printf("   wcq should be within 0 =< wcq =< wnb = %d. \n",wnb);
      _  _  _  _  exit(1);
      _  _  _  }
      _  _  _  strcpy(p1,jwn0[wcq]);
      _  _  }
      _  _  if (*pj2 && strstr(pj2,p1))     /*  JS2=*? のチェック */
      _  _  _     saiyo = 1;
      _  _  else   /* ２つ前の日本文のどこかに文字列 ? が含まれている事を */
      _  _     saiyo = -1;                              /* チェックする。*/
      _  }
      }
      break;
   }
   return(saiyo);
end


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

   *saiyo = -1;
   jc = p1[0];
   tc = p1[1];
   for (i = comma - 1; i >= 0; i--) {
   _  if (cj[i][0] == jc && strchr(cz[i],tc)) {
   _  _  jtpt = i;
   _  _  *saiyo = 1;
   _  _  break;
   _  }
   }
   return(jtpt);
end

int plwd(int prd,int n)
                 /* ピリオドより前に、cj[wc + n] が出現する位置を返す。*/
begin            /* global variables: wc, jwn[] */
   register int i;
   int ln, lnw, pdnb = 0;
   char wd[WordLen];

   strcpy(wd,cj[wc + n]);
   lnw = strlen(wd);
   for (i = prd - 1; i >= 0; i--) {
   _  ln = strlen(cj[i]);
   _  if (cj[i][0] == '.')
   _     ++pdnb;
   _  if (pdnb > 2)
   _     break;
   _  if (cj[i] == strstr(cj[i],wd) || (strcmp(cj[i] + ln -lnw, wd) == 0))
   _    return(i);
   }
   return(- 1);
end

static int  bYakuZokuCk(char *pj, char p1[], int wc3, char pc)
			       /* 文法規則中の訳語に関する条件のチェック */
begin   /* global variables: cj[][], cz[][] */
   int  saiyo = 0;
   char *chp, cc[45], *pt2;

   chp = strchr(pj - 4,'D');
   if (chp && (chp <= pj - 1) && (*(chp + 1) != ';')) {
   _  if ((*p1 == 'D') && (*(p1 + 1) == 'J') && isdigit(*(p1 + 2)))
   _     strcpy(p1,jwn[wc3 + (*(p1 + 2)) - pc]);
   _  saiyo = Dblck(wc3,p1,pj);   /* 倍角文字列に関する等号条件 */
   }
   else {
   _  if ((*(pj - 2) == 'J') || (*(pj - 3) == 'J'))
   _    left(cc,cj[wc3],1);   /* 品詞コードに関する等号条件 */
   _  else {
   _  _  if (cz[wc3][0] == '\0')
   _  _     saiyo = -1;
   _  _  else {
   _  _  _  pt2 = strchr(cz[wc3],'|');
   _  _  _  if (pt2)
   _  _  _     ptcpy(cc,cz[wc3],pt2);
   _  _  _  else
   _  _  _     strcpy(cc,cz[wc3]);  /* 属性コードに関する等号条件 */
   _  _  _  if ((*p1 == 'R') && strchr(cj[wc3],'#') && (! strchr(cc,'R'))) {
   _  _  _  _  printf("Lack of 'R' information in the dictionary for %s \n",cj[wc3]);
   _  _  _  _  printf("辞書に「R」属性を登録して下さい。\n");
   _  _  _  _  pause(500);
   _  _  _  }
   _  _  }
   _  }
   _  if (! saiyo) {
   _  _  chp = p1;
   _  _  while (*chp) {
   _  _  _  if (strchr(cc,*chp)) {
   _  _  _  _  saiyo = 1;
   _  _  _  _  break;
   _  _  _  }
   _  _  _  ++chp;
   _  _  }
   _  _  if (saiyo < 1)
   _  _     saiyo = -1;
   _  }
   }
   return(saiyo);
end

int  Dblck(int wc3, char p1[], char *pj)
                /* 倍角文字列に関する等号条件の判定 */
begin         /* global variables: cj[][], cz[][], vr[], pjs[], pj2[] */
   int wc4, saiyo;
   char p3[3], bj[JSentLen], bz[SentZokuLen], *chp, qpjs[JSentLen];

   saiyo = 0;
   strcpy(bj,jwn[wc3]);
   if (cz[wc3][0] && cj[wc3][0])
      strcpy(bz,cz[wc3]);
   else {
   _  if ((! cj[wc3][0]) || (strcmp(cj[wc3],aj[wc3][0]) == 0))
   _     strcpy(bz,az[wc3][0]);
   _  else
   _     bz[0] = '\0';
   }
   if ( (strlen(p1) <= 1) && (! strchr(">#)/r",*p1)) && ((*(pj - 2) == 'D') || (*(pj - 3) == 'D')) && ((pj - 3) != strstr(pj - 3,"DD")) && ((pj - 4) != strstr(pj - 4,"DD-")) ) {
   _  printf("適用条件の書式に違反しています。pj = %s \n",pj);
   _  printf("文法規則を訂正してください！！\n");
   _  exit(1);
   }
   if (((*(pj - 3) == 'D') && strchr("IJ",*(pj - 2))) || ((*(pj - 4) == 'D') && strchr("IJ",*(pj - 3))))  {
	   /*  DJn = ??, または DIn = ?? の判定条件のチェック */
   _   if ((*(pj - 2) == 'I') || (*(pj - 3) == 'I'))
   _     strcpy(bj,jwn0[wc3]);
   _   saiyo = jnCk(bj,p1,wc3);
		/* 日本語単語変数 jwn[wc3][] または jwn0[wc3][] のチェック */
   }
   else {           /* 第２属性　DDn = ? の判定条件のチェック */
   _  if ((*(pj - 3) == 'D') && ((*(pj - 2) == 'D') || ((*(pj - 4) == 'D') && (*(pj - 2) == '-')))) {
   _  _  chp = strchr(bz,'|');
   _  _  if (((*pj == '=') || (*pj == '<')) && chp) {
   _  _  _  if (strstr(++chp,p1))
   _  _  _     saiyo++;
   _  _  }
   _  }
   _  else {   /* Dn = ? または  F2D = ? の判定条件のチェック */
   _  _  if ((*p1 == 'J') && isdigit(*(p1 + 1))) {
   _  _  _  wc4 = val(p1 + 1);
   _  _  _  wc4 = wc3 + wc4 - (*(pj - 1) - '0');
   _  _  _  strcpy(p1,jwn[wc4]);
   _  _  }
   _  _  chp = p1;
   _  _  while (*chp) {
   _  _  _  *p3 = *chp++;         /* bz[] は属性情報 */
   _  _  _  *(p3 + 1) = *chp++;   /* p3[3] は助数詞の候補 */
   _  _  _  *(p3 + 2) = '\0';     /* ２バイトずつ区切って比較して行く。*/
   _  _  _  if ((strstr(bz,p3)) || (*bz  && strstr(p3,bz))) {
   _  _  _  _  saiyo++;
   _  _  _  _  break;
   _  _  _  }
   _  _  }
   _  }            /* 条件に合格していれば saiyo == 1 */
   }
   if ((! saiyo) && (strcmp(p1,"*PJS") == 0) || (strcmp(p1,"*JS2") == 0)) {
   _  if (! *(p1 + 3))
   _     strcpy(qpjs,pjs);
   _  else
   _     strcpy(qpjs,pj2);
   _  if (strstr(qpjs,bj))/* 前の日本文に単語 dums が含まれているかどうか？*/
   _     saiyo = 1;
   }
   if (! saiyo)
      saiyo = -1;
   return(saiyo);
end

static int  SOVcomp(char p1[])
           /* 前の文の主語、目的語あるいは動詞との比較かどうか吟味する。*/
           /* beneq() から呼ばれる。*/
begin      /* global variables: sj[], oj[], oj2[], vr[] */
   int ln, saiyo = 0;

   if (strcmp(p1,"SJ$") == 0) {       /* 前の文の主語と比較する。 */
   _  if (*sj) {
   _  _  strcpy(p1,sj);
   _  _  ln = strlen(p1);
   _  _  if ((ln >= 6) && (strcmp(p1 + ln - 4,"s(s)") == 0))
   _  _     *(p1 + ln - 4) = '\0';
   _  _  saiyo++;
   _  }
   _  else
   _     saiyo = -1;
   }
   else {
   _  if (strcmp(p1,"SJ2$") == 0) { /* 前の前の文の主語と比較する。 */
   _  _  if (*sj2) {
   _  _  _  strcpy(p1,sj2);
   _  _  _  saiyo++;
   _  _  }
   _  _  else
   _  _     saiyo = -1;
   _  }
   _  else {
   _  _  if (strcmp(p1,"OJ$") == 0) { /* 前の文の目的語と比較する。 */
   _  _  _  if (*oj) {
   _  _  _  _  strcpy(p1,oj);
   _  _  _  _  saiyo++;
   _  _  _  }
   _  _  _  else
   _  _  _     saiyo = -1;
   _  _  }
   _  _  else {
   _  _  _  if (strcmp(p1,"OJ2$") == 0) { /* 前の前の文の目的語と比較する。 */
   _  _  _  _  if (*oj2) {
   _  _  _  _  _  strcpy(p1,oj2);
   _  _  _  _  _  ln = strlen(p1);
   _  _  _  _  _  if (strchr(oz2,'x') && (*(p1 + ln - 1) == 's'))
   _  _  _  _  _     *(p1 + ln - 1) = '\0';
   _  _  _  _  _  saiyo++;
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     saiyo = -1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (strcmp(p1,"VR$") == 0) {  /* 前の文の動詞と比較する。 */
   _  _  _  _  _  if (*vr) {
   _  _  _  _  _  _  ln = strlen(vr);
   _  _  _  _  _  _  if (ln < JWordLen)
   _  _  _  _  _  _     strcpy(p1,vr);
   _  _  _  _  _  _  else
   _  _  _  _  _  _     strcpy(p1,vr + ln - JWordLen + 1);
   _  _  _  _  _  }
   _  _  _  _  _  else
   _  _  _  _  _     --saiyo;
   _  _  _  _  }
   _  _  _  _  else {                   /* 前の前の文の動詞と比較する。 */
   _  _  _  _  _  if (strcmp(p1,"VR2$") == 0) { 
   _  _  _  _  _  _  if (*vr2) {
   _  _  _  _  _  _  _  ln = strlen(vr2);
   _  _  _  _  _  _  _  if (ln < JWordLen)
   _  _  _  _  _  _  _     strcpy(p1,vr2);
   _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _     strcpy(p1,vr2 + ln - JWordLen + 1);
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else
   _  _  _  _  _  _     --saiyo;
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(saiyo);
end

int  washa_copy(char p1[])
           /* 前の文の話者との比較かどうか吟味する。*/
begin      /* global variables: sj[], oj[], oj2[], vr[] */
   int  saiyo = 0;

   if (strcmp(p1,"WASHA") == 0) {       /* 前の文の話者と比較する。 */
   _  if (*washa) {
   _  _  strcpy(p1,washa);
   _  _  saiyo++;
   _  }
   _  else
   _     saiyo = -1;
   }
   else {
   _  if (strcmp(p1,"WASHA2") == 0) { /* 前の前の文の話者と比較する。 */
   _  _  if (*washa2) {
   _  _  _  strcpy(p1,washa2);
   _  _  _  saiyo++;
   _  _  }
   _  _  else
   _  _     saiyo = -1;
   _  }
   _  else {
   _  _  if (strcmp(p1,"WASHA3") == 0) { /* ３つ前の文の話者と比較する。 */
   _  _  _  if (*washa3) {
   _  _  _  _  strcpy(p1,washa3);
   _  _  _  _  saiyo++;
   _  _  _  }
   _  _  _  else
   _  _  _     saiyo = -1;
   _  _  }
   _  }
   }
   return(saiyo);
end


static int  jnCk(char bj[], char p1[], int wc3)
      /* 日本語単語変数 jwn[wc3][] または jwn0[wc3][] の倍角文字列のチェック */
      /*  チェックの結果は saiyo の値として返す。*/
begin     /* global variable: wc */
   int  ln, ln1, wc4, saiyo;
   char *chp, *q1, p1q[JSentLen];
   
   saiyo = 0;
   ln = strlen(bj);          /* bj[] は日本語単語 */
   if (*p1 == '*')
      q1 = p1 + 1;
   else
      q1 = p1;
   if ((*q1 == 'D') && (*(q1 + 1) == 'J')) {
   _  if (*(q1 + 2) == '-')
   _     wc4 = wc + '0' - *(q1 + 3);
   _  else
   _     wc4 = wc + *(q1 + 2) - '0';
   _  if ((wc4 >= 0) && (wc4 <= wnb))
   _     strcpy(p1q,jwn[wc4]);
   _  else {
   _  _  saiyo = -1;
   _  _  *p1q = '\0';
   _  }
   }
   else
      strcpy(p1q,q1);
   ln1 = strlen(p1q);
   if (ln1) {
   _  if (*p1 == '*') {
   _  _  if (strstr(bj,p1q))
   _  _     saiyo++;     /*  " bj[] includes p1[] (bj =* p1) " の条件判定 */
   _  }
   _  else {
   _  _  if (ln >= ln1) {
   _  _  _  chp = strstr(bj,p1q);
   _  _  _  if (chp) {
   _  _  _  _  if ((chp == bj) || (*p1q == '>') || (*p1q == '#') || (*p1q == '/'))
   _  _  _  _     saiyo++;
   _  _  _  _  else {
   _  _  _  _  _  if (strcmp(bj + ln - ln1,p1q) == 0)
   _  _  _  _  _     saiyo++;
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if ((*p1q == '/') && (ln1 > 2)) {
   _  _  _  _  _  if (strcmp(bj + ln + 1 - ln1,p1q + 1) == 0)
   _  _  _  _  _     saiyo++;  /* 末尾に関する条件 (bj =/ p1) のチェック */
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  chp = strstr(p1q,bj);
   _  _  _  if (chp && (ln >= 4)) {
   _  _  _  _  if (chp == p1q)
   _  _  _  _     saiyo++;
   _  _  _  _  else {
   _  _  _  _  _  if (strcmp(p1q + ln1 - ln,bj) == 0)
   _  _  _  _  _     saiyo++;
   _  _  _  _  }
   _  _  _  }     /* 条件に合格していれば saiyo == 1 */
   _  _  }        /*       そうでなければ saiyo == 0 */
   _  }
   }
   else
      saiyo = 0;
   return(saiyo);
end

static char bunpDigit(void)    /* 文法規則中に現れる数値に関する判定と処理*/
begin                       /* global variables: dumb[] */
   int  saiyo = 0;
   char *dump, *pj, *chp, tf = '\0';
   
   dump = dumb;
   pj = strstr(dump,"<<");
   if (! pj)
      chp = strstr(dump,">>>");
   while(pj || chp) {
   _  if (! pj)
   _     pj = chp;        /* 数値に関する不等号条件の判定 */
   _  saiyo = ineqck(pj,'B');     /* 年月日や時刻など */
   _  if (saiyo == 0) {
   _  _  tf = 'F';
   _  _  break;
   _  }
   _  else
   _     *pj = ' ';
   _  pj = strstr(dump,"<<");
   _  if (! pj)
   _     chp = strstr(dump,">>>");
   }
   if (! tf) {
   _  dump = dumb;
   _  pj = strstr(dump,"n*n");
   _  while (pj) {
   _  _  saiyo = digitMult();        /*  数値と数値のかけ算 */
   _  _  if (saiyo == 0) { /* "two hundred" = 2*100 -> 200 */
   _  _  _  tf = 'F';
   _  _  _  break;
   _  _  }
   _  _  else
   _  _     *pj = ' ';
   _  _  pj = strstr(dump,"n*n");
   _  }
   _  if (! tf) {
   _  _  dump = dumb;
   _  _  pj = strstr(dump,"n+n");
   _  _  while (pj) {
   _  _  _  saiyo = digitAdd();      /* 数値と数値の足し算 */
   _  _  _  if (saiyo == 0) { /* "thirty two" = 30 + 2 -> 32 */
   _  _  _  _  tf = 'F';
   _  _  _  _  break;
   _  _  _  }
   _  _  _  else
   _  _  _     *pj = ' ';
   _  _  _  pj = strstr(dump,"n+n");
   _  _  }
   _  }
   }
   return(tf);
end

static int  bEqazck(char *pj)
               /* 離れた位置の単語に関する等号条件(A or Z 条件)のチェック */
begin          /*  global variables:  csq[], wc, te, wnb */
   register int i;
   int  j3, j9, j33, tsta, tend, saiyo;
   char pc, p3, p1[JWordLen], cq1[WordNumb], czq[ZokuLen], *chp, *ptr, *pt_bar;

   saiyo = 0;
   pc = *(pj - 1);
   chp = strchr(pj + 1,';');
   if (*pj == '=')           /* pj = "......" (等号条件)の場合 */
      ptcpy(p1,pj + 1,chp);
   else                      /* pj <> "....." (不等号条件)の場合 */
      ptcpy(p1,pj + 2,chp);
   if (((pc == 'A') && (wc > 0)) || ((pc == 'Z') && ((wc < wnb) || strchr(csq,'#')))) {
   _  if ((*(pj - 2) == 'Q') && (pc == 'Z'))
   _     saiyo = qzck(p1);
   _      /* QZ 条件のチェック:  saiyo -> 1 or -1 */
   _  else {
   _  _  if (pc == 'A') {  /* 前方検索の範囲を決定する。*/
   _  _  _  tsta = wc - 1;       /* スタートの位置は一つ前の単語 */
   _  _  _  tend = 0;            /* 終了の位置は文頭 */
   _  _  _  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) && ((j9 != j3 + 1) || (j33 != j9 + 1) || (jwn[j3 - 1] != jwn[j9])))
   _  _  _     tend = j9 - 1;
   /* 前方に、２つの動詞句を分離する接続詞が在れば、そこ迄で検索を終了する。 */
   _  _  _  for (i = tsta; i >= tend; i--) {
   _  _  _  _  p3 = csq[i];
   _  _  _  _  if ((p3 == '\0') || (p3 == '0') || (p3 == '?') || (p3 == '!') || (p3 == '#'))
   _  _  _  _     break; /* 終止符号が在れば、そこ迄で検索を終了する。*/
   _  _  _  _  strcpy(czq,cz[i]);  /* 第１属性の r と第２属性の r の混同を防ぐ。*/
   _  _  _  _  pt_bar = strchr(czq,'|');    /* 2005.05.29 */
   _  _  _  _  if (pt_bar)
   _  _  _  _     *pt_bar = '\0';
   _  _  _  _  if (((p3 == '|') && (strcmp(jwn[i],"’") != 0)) || (strchr(czq,'r')))
   _  _  _  _     break; /* 引用符(品詞コード'|')や関係詞(属性 'r')が在れば、そこ迄で検索を終了する。*/
   _  _  _  }
   _  _  _  if (i > tend)
   _  _  _     tend = i;
   _  _  }
   _  _  else {       /*  後方検索の範囲を決定する。  */
   _  _  _  tend = te + 1;  /* 終了の位置は一つ後の単語 */
   _  _  _  tsta = wnb;     /* スタートの位置は文末 */
   _  _  _  tsta = umeRange(tsta,&tend);
                                 /* 埋め込み型熟語の場合の検索範囲調節 */
   _  _  _  strcpy(cq1,csq + te + 1);
   _  _  _  j9 = instrc(cq1,'9');    /* 後方にある接続詞の位置 */
   _  _  _  if ((strcmp(cj[te + j9],"9and") == 0) && strstr(cz[te + j9 + 1],"|と"))
   _  _  _     j9 = ninstrc(j9 + 1,cq1,'9');
   _  _  _  j3 = instrc(csq,'3');    /* 後方にある動詞句の位置 */
   _  _  _  if ((j9 > 0) && (j3 > 0) && (te + 1 + j9 > j3) && (ninstrc(j9 + 1,cq1,'3') > 0))
   _  _  _     tsta = te + j9;
   /* 後方に、２つの動詞句を分離する接続詞が在れば、そこから検索を開始する。 */
   _  _  _  for (i = tend; i <= tsta; i++) {
   _  _  _  _  p3 = csq[i];
   _  _  _  _  if ((p3 == '\0') || (p3 == '0') || (p3 == '?') || (p3 == '!') || (p3 == '#'))
   _  _  _  _     break; /* 終止符号が在れば、そこから検索を開始する。*/
   _  _  _  _  ptr = strchr(cz[i],'r');
   _  _  _  _  if (((p3 == '|') && (strcmp(jwn[i],"’") != 0)) || (ptr && strchr(ptr + 1,'|')))
   _  _  _  _     break; /* 引用符(品詞コード'|')や関係詞(属性 'r')が在れば、そこから検索を開始する */
   _  _  _  }
   _  _  _  if (i < tsta)
   _  _  _     tsta = i;
   _  _  }
   _  _  saiyo = bEqazck2(tsta,tend,pj,p1);
                           /* A および Z 条件チェックの本体部分 */
   _  _  if (! saiyo)
   _  _    --saiyo;
   _  }
   _  if (saiyo > 0) {
   _  _  *pj = ' ';
   _  _  if (*(pj + 1) == '#')
   _  _     *(pj + 1) = ' ';
   _  }
   }
   else
      saiyo = -1;
   return(saiyo);
end


int  qzck(char tst[])      /* QZ(後ろに続く品詞コード列)条件のチェック */
begin                      /* global variables: wc, wnb, csq[] */
   int  saiyo;
   char *ptq;

   saiyo = -1;
   if (wc <= wnb - 2) {
   _  ptq = strchr(csq + wc + 1,*tst);
   _  if (ptq && (ptq == strstr(ptq,tst)))
   _     saiyo = 1;
   }
   return(saiyo);
end

static int umeRange(int tsta, int *tend)
                                     /* 埋め込み型熟語の場合の検索範囲調節 */
begin      /* global variables: csq[], wc, en[][], cj[][] */
   register int i;
   char eu[3];
   
   if (strchr(csq,'#') && (! strchr(csq + wc,'#'))) {
   _  *eu = '\0';    /* 埋め込み型熟語「#」に埋め込まれる単語の時は */
   _  for (i = wc - 1; i > 0; i--) /* 埋め込み先に遡って検索を行う。*/
   _     if (jwn[i][0] == '#') {
   _     _  left(eu,jwn[i],2);
   _     _  break;
   _     }
   _  if (*eu) {
   _  _  for (; i >= 0; i--)
   _  _     if (strstr(cj[i],eu)) {
   _  _     _  *tend = i + 1;
   _  _     _  break;
   _  _     }
   _  _  for (i = 0; i < wc; i++)
   _  _     if (cj[i][0] == '#') {
   _  _     _  tsta = i - 1;
   _  _     _  break;
   _  _     }
   _  }
   }
   return(tsta);
end

static int  digitMult(void)  /* 訳語として現れる数値に関する乗算 */
begin        /* global variables: wc, en[], cj[] */
   int  i, saiyo;
   char ed[WordLen];
   char zenkakuSuuji[9][3] = {"一","二","三","四","五","六","七","八","九"};
   char juuSuuji[9][8] = {"ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};

   saiyo = 0;
   if (strcmp(jwn[wc + 1],"万") == 0) {
   _  strcpy(ed,jwn[wc]);
   _  for (i = 0; i <= 8; i++) {
   _  _  if (strcmp(ed,zenkakuSuuji[i]) == 0) {
   _  _  _  ptreplace(cj[wc + 1] + 1,3,juuSuuji[i]);
   _  _  _  strcpy(cj[wc],cj[wc + 1]);
   _  _  _  cj[wc + 1][0] = '\0';
   _  _  _  saiyo = 1;
   _  _  _  break;
   _  _  }
   _  }
   }
   return(saiyo);
end


static int  digitAdd(void)  /* 訳語として現れる数値に関する加算 */
begin        /* global variables: wc, en[], cj[] */
   register int i, j;
   int ln1, saiyo = 0;
   char ed1[WordLen], ed2[WordLen], *ptsp, cjq[WordLen];
   static char const numb[9][6] = {"one","two","three","four","five","six","seven","eight","nine"};
   static char const numb21[10][10] = {"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
   static char const numb2[8][8] = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};

   if (isdigit(cj[wc][1]) && isdigit(cj[wc + 1][1])) {
   _  strcpy(ed1,cj[wc] + 1);
   _  ptsp = strchr(ed1,' ');
   _  if (ptsp)
   _     *ptsp = '\0';
   _  strcpy(ed2,cj[wc + 1] + 1);
   _  ptsp = strchr(ed2,' ');
   _  if (ptsp)
   _     *ptsp = '\0';
   _  strcat(ed1,ed2);
   _  digit_to_word(ed1,cjq);
   _  strcpy(cj[wc] + 1,cjq);
   _  cj[wc + 1][0] = '\0';
   _  saiyo = 1;
   }
   return(saiyo);
end



void digit_to_word(char ed1[], char cjq[])  /* 半角数字列を英語単語に変換する */
begin  
   register int i, j;
   int ln1;
   static char const numb[9][6] = {"one","two","three","four","five","six","seven","eight","nine"};
   static char const numb21[10][10] = {"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
   static char const numb2[8][8] = {"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};

   ln1 = strlen(ed1);
   *cjq = '\0';
   for (j = 1; j <= ln1; j++) {
   _  if (*(ed1 + ln1 - j) != '0') {
   _  _  if (j == 2) {
   _  _  _  if (*(ed1 + ln1 - j) == '1') {
   _  _  _  _  for (i = 0; i <= 9; i++) {
   _  _  _  _  _  if (*(ed1 + ln1 - 1) == (i + '0')) {
   _  _  _  _  _  _  strcpy(cjq,numb21[i]);
   _  _  _  _  _  _  break;
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  for (i = 2; i <= 9; i++) {
   _  _  _  _  _  if (*(ed1 + ln1 - 2) == (i + '0')) {
   _  _  _  _  _  _  if (strlen(cjq) > 2)
   _  _  _  _  _  _     ptinsert(cjq,"-");  /* 追加した。 2004.02.01 */
   _  _  _  _  _  _  ptinsert(cjq,(char *)numb2[i - 2]);
   _  _  _  _  _  _  break;
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if (j == 3)
   _  _  _     ptinsert(cjq," hundred ");
   _  _  _  else
   _  _  _     if (j == 4)
   _  _  _        ptinsert(cjq," thousand ");
   _  _  _  for (i = 1; i <= 9; i++) {
   _  _  _  _  if (*(ed1 + ln1 - j) == (i + '0')) {
   _  _  _  _  _  ptinsert(cjq,(char *)numb[i - 1]);
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
end



static int  bEqazck2(int tsta, int tend, char *pj, char p1[])
                                /* A および Z 条件チェックの本体部分 */
begin     /* global variables: cj[][], cz[][] */
   register int wc3;
   int  saiyo = 0;
   char cc[45], *chp, *pt_y, *pt_bar;
   
   for (wc3 = tsta; wc3 >= tend; wc3--) {
   _  if ((*(pj - 2) == 'D') || (*(pj - 3) == 'D'))
   _     saiyo = Dblck(wc3,p1,pj); /* 倍角文字列のチェック。 "DJn=?"  */
   _  else  {
   _  _  if (*(pj - 2) == 'E')
   _  _     saiyo = beneq(p1,wc3);  /* 英訳語のチェック。 "En=?" */
   _  _  else {
   _  _  _  *cc = '\0';
   _  _  _  if ((*(pj - 2) == 'J') || (*(pj - 3) == 'J')) {
   _  _  _  _  *cc = cj[wc3][0];
   _  _  _  _  *(cc + 1) = '\0'; /* 訳語の品詞コードのチェック。"Jn=?" */
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (cz[wc3][0]) {
   _  _  _  _  _  strcpy(cc,cz[wc3]); /* 属性コードのチェック。"Tn=?" */
   _  _  _  _  _  pt_bar = strchr(cc,'|');
   _  _  _  _  _  if (pt_bar)        /* 第２属性や助数詞を切り捨てる。2002.08.17 */
   _  _  _  _  _     *pt_bar = '\0';
   _  _  _  _  _  pt_y = strchr(cc,'y');
   _  _  _  _  _  if (pt_y)
   _  _  _  _  _     *(pt_y + 1) = '\0';
   _  _  _  _  }
   _  _  _  }
   _  _  _  if (*cc) {
   _  _  _  _  chp = p1;
   _  _  _  _  while(*chp) {
   _  _  _  _  _  if (strchr(cc,*chp++)) {
   _  _  _  _  _  _  saiyo = 1;
   _  _  _  _  _  _  break;
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  if (saiyo > 0)
   _     break;
   }
   return(saiyo);
end


int  ineqck(char *pj, char buntek)
                           /* 訳語として現れる数値に関する大小関係の判定 */
begin                      /* global variables: wc, aj[][][], cj[][] */
   int p1, p2, p0, saiyo;
   char pp1[5], b[WordLen], *chp;

   saiyo = 0;
   chp = strchr(pj + 2,';');
   if (*pj == '<')            /* pj = "<<" の場合 */
      ptcpy(pp1,pj + 2,chp);
   else                       /* pj = ">>>" の場合 */
      ptcpy(pp1,pj + 3,chp);
   p1 = val(pp1);
   p2 = *(pj - 1) - '0';
   if (*(pj - 2) == '-')
      p2 *= (-1);
   if (strlen(jwn[wc + p2]) > 1) {           /* 英和翻訳版から和英用に修正した。 */
   _  ptcpy(b,jwn[wc + p2],jwn[wc + p2] + 2); /* 2004.01.20 */
   _  if (strstr("１２３４５６７８９０",b)) { 
   _  _  p0 = zentoint(jwn[wc + p2]);
   _  _  if (*pj == '<') {   /* pj = "p0<<p1" の場合 */
   _  _  _  if ((strcmp(b,"0") == 0) || (p0 > 0 && p0 < p1))
   _  _  _     saiyo = 1;
   _  _  }
   _  _  else {
   _  _  _  if (p0 > p1)     /* pj = "p0>>>p1" の場合 */
   _  _  _     saiyo = 1;
   _  _  }
   _  }
   }
   else {
   _  strcpy(b,jwn[wc + p2]);
   _  if (strchr("1234567890",b[0])) {
   _  _  p0 = jwn[wc + p2][0] - '0';
   _  _  if (*pj == '<') {   /* pj = "p0<<p1" の場合 */
   _  _  _  if ((strcmp(b,"0") == 0) || (p0 > 0 && p0 < p1))
   _  _  _     saiyo = 1;
   _  _  }
   _  _  else {
   _  _  _  if (p0 > p1)     /* pj = "p0>>>p1" の場合 */
   _  _  _     saiyo = 1;
   _  _  }
   _  }
   }
   return(saiyo);
end

int shoyuuCk(char *strg) /* 文字列 strg が所有代名詞かどうかチェックする。*/
begin
   char qstr[256];
   
   if (strlen(strg) <= 254)
      strcpy(qstr,strg);
   else {
   _  printf("\n string %s は長すぎます。\n",strg);
   _  exit(1);
   }
   *qstr = tolower(*qstr);
   if ((qstr == strstr(qstr,"my")) || (qstr == strstr(qstr,"our")) || (qstr == strstr(qstr,"your")))
      return(1);
   else {
   _  if ((qstr == strstr(qstr,"his")) || (qstr == strstr(qstr,"her")) || (qstr == strstr(qstr,"it's")) || (qstr == strstr(qstr,"their")))
   _     return(1);
   _  else
   _     return(0);
   }
end


static int  beneq(char tst[], int wc3)  /* 英訳語に関する等号条件のチェック */
begin                           /* global variables: pst[], cj[][] */
   int wc4, ln, lne, saiyo;
   char ec[SentLen], estr[SentLen];
   char *pt;

   strcpy(ec,cj[wc3] + 1);
   saiyo = 0;
   switch(*tst) {
    case '\0':  /* tst == WASHA で、WASHA が空の場合などに対処した。2002.12.27 */
       break;
    case '*':
      if ((strcmp(tst,"*BS") == 0) || (strcmp(tst,"*BS2") == 0))
         saiyo = mae_eibun(ec,tst,wc3);
		    /* 注目の単語が前の英文に含まれていたかチェックする。*/
      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,cj[wc4] + 1);
      _  _  else
      _  _     break;
      _  }
      _  else
      _     strcpy(estr,tst + 1);
      _  if (strstr(ec,estr))
      _     saiyo = 1;
      }
      break;
    case '/':   /* "Em =/ string"  => cj[wc3] の語尾が string なら O.K. */
      ln = strlen(ec);
      lne = strlen(tst) - 1;
      if (strcmp(ec + ln - lne,tst + 1) == 0)
         saiyo = 1;
      break;
    case 'E':
      if (strcmp(tst,"EB") == 0) {
      _  if (*ec > 'Z')          /* 前の英文の先頭をチェックする。 */
      _     *ec -= 32;
      _  if (pes == strstr(pes,ec))
      _     saiyo = 1;
      _  else {
      _  _  pt = strchr(pes,':');
      _  _  if (pt && (strstr(pt + 2,ec) == (pt + 2)))
      _  _     saiyo = 1;
      _  }
      _  break;
      }
      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,cj[wc4] + 1);
      _  else
      _     if (wc4 != -1)
      _        break;
      _  if (strcmp(ec,tst) == 0)
      _     saiyo = 1;  /* 肝心のここが抜け落ちていた！ 2000.12.07 追加した。*/
      }
      break;
    default:
      if (strcmp(tst,"S") == 0) /* 所有代名詞であるかどうかのチェック */
         saiyo = shoyuuCk(ec);
      else {
      _  switch(*tst) {
      _   case 'W':
      _     saiyo = washa_copy(tst);
      _     break;
      _   case 'S':
      _   case 'O':
      _   case 'V':
      _     saiyo = SOVcomp(tst);
      _     break;
      _  }
      _  if (saiyo >= 0)
      _     saiyo = eneq_default(tst,ec,wc3); /* 英訳語チェックのデフォールト処理 */
      }
      break;
   }
   return(saiyo);
end

static int  mae_eibun(char ec[], char tst[], int wc3)
		/* 注目の単語が前の英文に含まれていたかチェックする。*/
begin   /* global variables: pes[], pe2[], az[][][] */
   int  saiyo = 0, ln;
   char dums[SentLen], qpes[SentLen], *pt, *ptr;
   char chb;

   sprintf(dums," %s",ec);
   if (! *(tst + 3))
      strcpy(qpes,pes);
   else
      strcpy(qpes,pe2);
   pt = dums;
   ptr = strstr(pt," （");
   while (ptr) {
   _  ptcut(ptr,1);
   _  pt = ptr + 2;
   _  ptr = strstr(pt," （");
   }
   pt = strstr(qpes,dums);
   if (pt) { /* 前の英文に単語 en[wc3] が含まれているかどうか？ */
   _  pt += strlen(dums);
   _  chb = *pt;
   _  if (strchr(" .,?!'",chb) || ((chb == 's') && ((! *(pt + 1)) || strchr(" .,?!'",*(pt + 1)) )))
   _     saiyo = 1; /* 前の文の中で、ec[] の直後が空白か句切り記号で */
   }                                          /* なければ落第とする。*/
   else {
   _  ln = strlen(dums);
   _  if (strchr(az[wc3][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 = 1;
   _  }
   _  else {
   _  _  if ((dums[1] >= 'a') && (dums[1] <= 'z')) {
   _  _  _  dums[1] -= 32;     /* 先頭を大文字化したものも試す。*/
   _  _  _  if (strstr(qpes,dums + 1))
   _  _  _     saiyo = 1;
   _  _  }
   _  _  else {
   _  _  _  pt = strstr(qpes,dums + 1);
   _  _  _  if (pt && (qpes < pt) && (*(pt - 1) == '('))
   _  _  _     saiyo = 1;
   _  _  }
   _  }
   }
   return(saiyo);
end

static int  eneq_default(char tst[], char ec[], int wc3)
                              /* 英訳語チェックのデフォールト処理 */
begin             /* global variables: pst[], cj[][] */
   int  ln, lne, saiyo = 0;
   char estr[SentLen], dums[SentLen], ecq[SentLen];
   char *pt, *ch, *pt2, *pt_sp1, *pt_sp2;

   ln = strlen(tst);
   lne = strlen(ec);
   if (lne == ln)  {         /*　指定された語の方が長い時はダメ。 */
   _  if (strcmp(ec,tst) == 0)
   _     saiyo = 1;
   }
   else {
   _  if (lne > ln)  {  /* 指定された語の語頭または末尾にあれば合格 */
   _  _  if ( (ec == strstr(ec,tst)) && ((ec[ln] == ' ') || (tst[ln - 1] == ' ')))
   _  _     saiyo = 1;
   _  _  else {
   _  _  _  pt = ec + lne - ln;
   _  _  _  if (*tst != ' ')
   _  _  _     --pt;
   _  _  _  ch = strstr(pt,tst);
   _  _  _  if ((*pt == ' ') && ch && ((ch == pt + 1) || (ch == pt)))
   _  _  _     saiyo = 1;
   _  _  _  else {
   _  _  _  _  if ((pt == strstr(pt,tst)) && (*(ec + lne - 1) == ')'))
   _  _  _  _     saiyo = 1; /* 動詞が活用して、原形情報を持っているいる場合 */
   _  _  _  _  else {
   _  _  _  _  _  if (cj[wc3][0] == '3') {
   _  _  _  _  _  _  strcpy(ecq,ec);
   _  _  _  _  _  _  pt = strstr(ecq," (");
   _  _  _  _  _  _  if (pt)
   _  _  _  _  _  _     ch = strchr(pt + 1,')');
   _  _  _  _  _  _  if ( pt && ch && (! strchr(tst,'(')) ) {
	     /* 動詞訳語が活用して、原形情報を持っているいる場合 */
   _  _  _  _  _  _  _  ptcut(ch,1);
   _  _  _  _  _  _  _  pt_sp1 = strchr(ecq,' ');
   _  _  _  _  _  _  _  if (pt_sp1 == pt)
   _  _  _  _  _  _  _     ptptcut(ecq,pt + 1);
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  pt_sp2 = strchr(pt_sp1 + 1,' ');
   _  _  _  _  _  _  _  _  while(pt_sp2 < pt) {
   _  _  _  _  _  _  _  _  _  pt_sp1 = pt_sp2;
   _  _  _  _  _  _  _  _  _  pt_sp2 = strchr(pt_sp1 + 1,' ');
   _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  ptptcut(pt_sp1 + 1,pt + 1);
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  if (*ch) {
   _  _  _  _  _  _  _  _  pt2 = strstr(ch," (");
   _  _  _  _  _  _  _  _  if (pt2) {
   _  _  _  _  _  _  _  _  _  ch = strchr(pt2 + 1,')');
   _  _  _  _  _  _  _  _  _  if (ch && (! strchr(tst,'('))) {
	     /* 動詞訳語が活用して、２つ目の原形情報を持っているいる場合 */
   _  _  _  _  _  _  _  _  _  _  ptcut(ch,1);
   _  _  _  _  _  _  _  _  _  _  pt_sp1 = strchr(ecq,' ');
   _  _  _  _  _  _  _  _  _  _  pt_sp2 = strchr(pt_sp1 + 1,' ');
   _  _  _  _  _  _  _  _  _  _  while(pt_sp2 < pt2) {
   _  _  _  _  _  _  _  _  _  _  _  if (pt2 <= pt_sp2)
   _  _  _  _  _  _  _  _  _  _  _     break;
   _  _  _  _  _  _  _  _  _  _  _  pt_sp1 = pt_sp2;
   _  _  _  _  _  _  _  _  _  _  _  pt_sp2 = strchr(pt_sp1 + 1,' ');
   _  _  _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  _  _  ptptcut(pt_sp1 + 1,pt2 + 1);
   _  _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  if (strcmp(ecq,tst) == 0)
   _  _  _  _  _  _  _     saiyo = 1;
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _	 }
   _  }
   _  else {
   _  _  pt = strstr(tst," (");
   _  _  if (pt)
   _  _     ch = strchr(pt + 1,')');
   _  _  if (pt && ch) {
      /* 比較されている語（動詞）が活用して、原形情報を持っているいる場合 */
   _  _  _  ptcpy(dums,tst,pt);
   _  _  _  ptcpy(estr,pt + 2,ch);
   _  _  _  if ((strcmp(ec,dums) == 0) || (strcmp(ec,estr) == 0))
   _  _  _     saiyo = 1;
   _  _  }
   _  _  else {
   _  _  _  if ((cj[wc3][0] == '3') && (tst == strstr(tst,ec)) && (*(tst + lne) == ' '))
   _  _  _     saiyo = 1;
   _  _  }
   _  }
   }
   return(saiyo);
end
