#include <stdio.h>   /*  *****  transf.c  ****  */
#include <string.h>  /* genkei, transf, cmd_warihuri */
#include <ctype.h>   /* tr_S, tr_mini */
/* #include <process.h> */      /*   for MS-C && TURBO C++ */
/*  #include <stdlib.h>        for Lattice C  */


#include "macro.h"

#define USER

#include "jehonfnc.h"

static void tooLongBp(char *cmd, char *pt);
static void head_add(int i, char *cmd, int lnb);
static void cmd_warihuri(char cmd[], int i, char *pt);
static void enpass_cmd(int i, char *mdi_1, char *cmd);
static void add_a(char *p_noun);
static void tr_GH(char cmd[], char *mdi_1, int i);
static void tr_OP(char cmd[], char *mdi_1, int i);
static int  jodouship(char phrase[]);
static void meishi_katsuyou(int i, char *mdi_1, char *cmd);
static void ninsho(char md[], char *vb_zoku, char *ptnb);
static void verb_select(char *verb, char **vb_part, char *vb_zoku);
static void be_ninsho(char *pt_zoku, char *vb_part, char subject[]);
static void have_ninsho(char subject[], char *pt_zoku, char *verb);
static void dont_ninsho(char subject[], char *verb, char *pt_zoku);
static void san_tan_gen(char *pt_zoku, char *vb_part, char *vb_zoku, char subject[], char verbq[]);
static void mojiretsu_ninsho(char *ptnb, char *vb_part, char *verb, char *vb_zoku);
static void kazu(char *p_noun,char *ptnb);
static void hukusuu(int i);
static void hukusuu2(char *pt_md);
static int  kanshi_check(char *noun, char *ptsp, int sjnb);
static int sjzokuCpy(char *ptnb, char sjzoku1[], char sjzoku2[]);
static int  j_noun_ck(int i, char zokusei2[], int sjnb, char noun[]);
static int  shinrui_ck(char j_noun[], int sjnb, int i);
static int  shintai(int sjnb, int i, char *noun);
static void kanshi_tansuu(int sjnb, int i, char *noun, char zokusei1[], char sjzoku1[], char sjzoku2[]);
static void  huku_basho_hutei(char sjzoku1[], char sjzoku2[], char zokusei1[], int sjnb, int i, char *noun);
static int  def_cond(char noun[], char zokusei1[], char sjzoku2[],int sjnb, int i);
static int  basho_phrase(int sjnb, char zokusei1[], char zokusei2[], char *pt_nxt_cj);
static int  basho_prep(int sjnb, char zokusei1[]); 
static int  basho_phrase2(int sjnb, char zokusei1[], char zokusei2[]);
static int  basho_phrase3(int sjnb, char zokusei1[], char zokusei2[]);
static int  def_cond2(int i, char sjzoku1[], char sjzoku2[], int sjnb);
static int  shoyuu(int i, char noun[]);
static void hutei_kanshi(int i, char *noun);
static int  proper_ck(char zokusei1[], char *md);
static void ninsho_clause(int i, char *cmd);
static void hankak(int i);
static void tr_S(char cmd[], int i);
static void tr_mini(char cmd[], int i, char *pt);
static void one_adjust(char mdq[], char czq[], char *pronaun);
static void one_shoyuu(char *pt_one, char pronq[], char cz_sj[], char czq[]);
static void upup(char *mdi_1);
static void zero_cmd(char *cmd, char *pt, int i);
static void tail_add(int i, char *pt, char *cmd);

#include "honyavar.h"

void genkei(char *yk)     /* 訳語の過去形を、原形情報に基き、原形に戻す。 */
begin
   int ln;
   char chz, pars[JWordLen], *qtz, *qt, *q2t;

   *pars = '\0';
   ln = strlen(yk);
   chz = *(yk + ln - 1);
   if (chz != ')') {
   _  qt = strstr(yk,"（");
   _  if (qt) {
   _  _  qtz = strstr(qt + 2,"（");
   _  _  while (qtz) {
   _  _  _  qt = qtz;
   _  _  _  qtz = strstr(qt + 2,"（");
   _  _  }
   _  _  if (*(qt - 1) == ')') {
   _  _  _  strcpy(pars,qt);  /* 未確定の別訳語を変数 pars に保存しておく。 */
   _  _  _  ln -= strlen(qt);
   _  _  _  chz = *(qt - 1);
   _  _  _  *qt = '\0';
   _  _  }
   _  }
   }
   qt = strchr(yk,'(');
   if (qt)
      q2t = strchr(qt + 1,')');
   if (qt && q2t && (q2t != (qt + 2))) {
   _  ptcut(q2t,1);
   _  ptptcut(yk,qt);
   }
   else {
   _  if (strcmp(yk + ln - 3,"ing") == 0)
   _     *(yk + ln - 3) = '\0';              /* 進行形を原形に戻す。*/
   }
   if (*pars)
      strcat(yk,pars);
end


void transf(char *pt)  /* 文法規則のコマンドを下請け関数に実行させる。*/
begin  /* global variables: wc, wnb, pbun, dumb */
   int i, lnb;
   char cmd[55], *pcm;

   i = *(pt - 1) - '0';
   if (i > 7) {
   _  printf("\n 単語の指定位置が遠過ぎます。 i = %d \n",i);
   _  printf("pbun = %s \n",pbun);
   _  printf("\n unexpected error might occur !! \n\n");
   _  exit(1);
   }
   if (*(pt - 2) == '-')
      i *= (-1);
   if ((wc + i > wnb) || (wc + i < 0))
      printf("不正データ。wc = %d  i = %d　 pt = %s  dumb = %s \n",wc,i,pt,dumb);
   pcm = strchr(pt + 2,';');
   if (pcm) {
   _  if (pt + 55 < pcm)
   _     tooLongBp(cmd,pt);    /* 文法コマンドが長過ぎる時の対処 */
   _  else
   _     ptcpy(cmd,pt + 1,pcm);
   }
   else
      printf("不正データ。 pbun = %s \n",pbun);
   lnb = strlen(cmd) - 1;
   if (cmd[lnb] == '+')
      head_add(i,cmd,lnb);    /* 文字列を訳語の先頭に付加する。*/
   else
      cmd_warihuri(cmd,i,pt);
		  /* コマンド毎に対応する関数に処理を割り振る。*/
end


static void tooLongBp(char *cmd, char *pt)
                        /* 文法コマンドが長過ぎる時の対処 */
begin
   beeping(10);
   color_yellow;
   printf("\n 文法コマンドが長過ぎます。53文字以下に削って下さい！！ \n");
   ptcpy(cmd,pt + 1,pt + 54);
   color_light_blue;
   printf("     %s \n",cmd);
   color_white;
   exit(1);
end


static void head_add(int i, char *cmd, int lnb)
                        /* 文字列を訳語の先頭に付加する。*/
begin   /* global variables: cj[][], wc */
   char *ptspc, *mdq;
   
   if (i < 0)
      mdq = cj[wc + i] + 1; /* (i < 0) の場合にも対応した。2003.01.02 */
   else
      mdq = md[i] + 1;
   if (*mdq == 'Z')
      ptcut(mdq,1);
   cmd[lnb] = ' ';
   if (*cmd == 'J') {
   _   if ( isdigit(*(cmd + 1)) ) {
   _  _  strcpy(cmd,cj[*(cmd + 1) + wc - '0'] + 1);
   _  _  strcat(cmd," ");
   _  }
   _  else {
   _  _  if ( (*(cmd + 1) == '-') && isdigit(*(cmd + 2)) ) {
   _  _  _  strcpy(cmd,cj[wc + '0' - *(cmd + 2)] + 1);
   _  _  _  strcat(cmd," ");
   _  _  }
   _  }
   }
   else {
   _  if ( (*cmd == 'D') &&(*(cmd + 1) == 'J') && isdigit(*(cmd + 2)) ) {
   _  _  strcpy(cmd,jwn[*(cmd + 1) + wc - '0']); /* 日本語原語を英訳語に付加する。2002.11.20 */
   _  _  if (md[i][1])
   _  _     strcat(cmd," ");
   _  }
   }
   ptinsert(mdq,cmd);
   ptspc = strstr(mdq,"  ");
   while (ptspc) {
   _  ptcut(ptspc,1);
   _  ptspc = strstr(mdq,"  ");
   }
   ptspc = strstr(mdq,"@ ");
   if (ptspc)
      ptcut(ptspc + 1,1);
   if (i >= 0)
      strcpy(md[i] + 1,mdq);
end

static void cmd_warihuri(char cmd[], int i, char *pt)
		 /* コマンド毎に対応する関数に処理を割り振る。*/
begin  /* global variables: md[][], wc, cj[][], cz[][] */
   char *mdi_1;

   if (i >= 0)
      mdi_1 = md[i] + 1;
   else
      mdi_1 = cj[wc + i] + 1;
   switch(*cmd) {
     case '&':
       enpass_cmd(i,mdi_1,cmd);
	  /*  *cmd == '&' の場合の文字列処理コマンド */
       break;
     case 'A':
       add_a(mdi_1); /* 名詞の頭に不定冠詞 a または an を付加する。2000.12.10 */
     case 'G':
     case 'H':
       tr_GH(cmd,mdi_1,i);   /* 'G' または 'H' で始まるコマンドの割り振り */
       break;
     case '-':
       tr_mini(cmd,i,pt); /* 英訳語からの削除命令 */
       break;
     case 'M':
       if (strcmp(cmd,"MOST") == 0) /* 形容詞や副詞の最上級を作る */
          most(mdi_1);               /* 2000.11.23 */
       break;
     case 'N':
       if (strcmp(cmd,"NEGA") == 0)     /* 否定形を作る */
          nega(mdi_1 - 1);
       break;
     case 'O':
     case 'P':
       tr_OP(cmd,mdi_1,i);  /* 'O' または 'P' で始まるコマンドの割り振り */
       break;
     case 'S':
       tr_S(cmd,i);        /* 'S' で始まる名前のコマンドの割り振り */
       break;            /* SINKO=>sinko, SJ=>sopresv */
     case 'U':
       if (strcmp(cmd,"UPP") == 0) /* 英訳語の先頭を大文字にする。*/
	  *mdi_1 = toupper(*mdi_1);
       else {
       _  if (strcmp(cmd,"UPUP") == 0)   /* 2005.02.18 */
       _     upup(mdi_1); /* 熟語を構成する全ての英訳語の先頭を大文字にする。*/
       }
       break;
     case 'V':
       if (strcmp(cmd,"VR") == 0)
	  vrpresv(i);            /* 動詞訳語として保存する。*/
       break;
     case 'W':
       if (strcmp(cmd,"WASHA") == 0)
	      washa_prs(i);         /* 会話文の話者を保存する。*/
       break;
     case 'Z':
       zero_cmd(cmd,pt,i); /* "Z" のコマンド(訳語の消去) */
       break;
     case '+':
       tail_add(i,pt,cmd); /* 指定された文字列を訳語のラストに結合する。 */
       break;
   }
end


static void enpass_cmd(int i, char *mdi_1, char *cmd)
                        /*  *cmd == '&' の場合の文字列処理コマンド */
begin    /* global variables: md[][], cz[][], wc  */
   char md0;

   if ((i >= 0) && (md[i][0] == 'Z')) {
   _  ptcut(md[i],1);
   _  if (md[i][1] == ' ')
   _     ptcut(md[i] + 1,1);
   }
   md0 = *(mdi_1 - 1);
   switch(md0) {
     case '3':
     case '4':
       if ( ((! strstr(mdi_1,"(x)")) || strstr(mdi_1,"be that ")) && (! jodouship(mdi_1)) )
         ninsho(mdi_1,cz[wc + i],cmd + 2); /* 動詞を人称変化させる。 */
       break;
     case '2':
     case '8':
       kazu(mdi_1,cmd + 2);  /* 代名詞を複数化させる。 */
       break;
     case '1':
      meishi_katsuyou(i,mdi_1,cmd);  /* 名詞英訳語を活用させる。*/
      break;
    case '6':
	   if (strcmp(cmd + 1,"複") == 0) {
	   _  if (! strstr(mdi_1,"(s)"))
	   _     hukusuu(i);     /* 副詞句の名詞部分を複数形にする。*/
	   }
	   else
          ninsho_clause(i,cmd + 1);
         /* 「oneself」や「one」を含む句や節のその部分を代名詞に置き換える。*/
	   break;
    case '7':
       ninsho_clause(i,cmd + 1);
         /* 「oneself」や「one」を含む句や節のその部分を代名詞に置き換える。*/
       break;
   }
end


static void add_a(char *p_noun)
begin    /* 名詞の頭に不定冠詞 a または an を付加する。2000.12.10 */
   char head[WordLen];
   
   if (! strchr(p_noun,' ')) {
   _  if (strchr("aiueoAIUEO",*p_noun))
   _     ptinsert(p_noun,"an ");
   _  else
   _     ptinsert(p_noun,"a ");
   }
   else {
   _  wdcpy(head,p_noun);  /* 2000.12.11 追加した。*/
   _  if (! strstr("a,an,this,that,those,these,my,your,his,her,its,their",head)) {
   _  _  if (strchr("aiueoAIUEO",*head))
   _  _     ptinsert(p_noun,"an ");
   _  _  else
   _  _     ptinsert(p_noun,"a ");
   _  }
   }
end

static void  tr_GH(char cmd[], char *mdi_1, int i)
                          /* 'G' または 'H' で始まるコマンドの割り振り */
begin /* global variables: wc, cz[][] */

   unsigned int  ln;
   char *czq, *pt_p, *pt_bar;
   
   if (strcmp(cmd,"GENKE") == 0) {      /* 動詞を原形に戻す。*/
   _  ln = strlen(mdi_1);
   _  if ((*(mdi_1 - 1) == '3') && ((! strchr(mdi_1,' ')) || (*(mdi_1 + ln - 1) == ')') || strstr(cz[wc + i],"(3") || strchr(mdi_1,'('))) {
   _  _  genkei(mdi_1);
   _  _  czq = cz[wc + i];
   _  _  pt_bar = strchr(czq,'|');
   _  _  pt_p = strchr(czq,'p');
   _  _  while(pt_p && (pt_p < pt_bar)) {
   _  _  _  ptcut(pt_p,1);
   _  _  _  pt_p = strchr(pt_p,'p');
   _  _  }
   _  }
   }
   else {
   _  if (strcmp(cmd,"HANKAK") == 0)
   _      hankak(i);           /* 訳語を半角数字に直す。*/
   _  else
   _     if (strcmp(cmd,"HIKAKU") == 0)
   _        hikaku(mdi_1);          /* 形容詞や副詞を比較級にする。*/
   }
end

static int  jodouship(char phrase[]) /* 助動詞で始まる節か否かの判定 */
begin
   char head[WordLen];
   int  jod = 0;
   
   wdcpy(head,phrase);
   if (strstr("can,could,may,might,must,shall,should,will,would",head))
      jod = 1;
   return(jod);
end


static void meishi_katsuyou(int i, char *mdi_1, char *cmd)
                                    /* 名詞英訳語を活用させる。*/
begin    /* global variables: wc, cz[][] */

   unsigned int  ln;
   char *pt2, *ptq, *ptsp, *ptsp1;
   char zokusei1[SentZokuLen];
   
   pt2 = strchr(cz[wc + i],'|');
   ptsp1 = strchr(mdi_1,' ');
   if (pt2 && *(pt2 + 1) && strstr(pt2 + 1,"/3)") && (! strchr(pt2 + 1,'1'))) {
   _  str_rchr(mdi_1 + 1,' ',ptsp,ptq);
   _  if (! strstr(ptsp + 1,"(x)"))
   _     ninsho(ptsp + 1,cz[wc + i],cmd + 2);  /* 動詞の人称変化 */
   }
   else {
   _  ln = strlen(mdi_1);
   _  if ( ((*mdi_1 != '\'') || (*(mdi_1 + ln - 1) != '\'')) && (! strstr(mdi_1,"every ")) ) {
   _  _  if ((! strchr(cz[wc + i],'n')) || (! strstr(cz[wc + i],"位"))) {
   _  _	 _  if (strcmp(cmd + 1,"複") == 0) {
   _  _  _  _  if (! strstr(mdi_1,"(s)"))
   _  _  _  _     hukusuu(i);                  /* 名詞を複数形にする。*/
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (pt2)
   _  _  _  _     ptcpy(zokusei1,cz[wc + i],pt2);
   _  _  _  _  else
   _  _  _  _     *zokusei1 = '\0';
   _  _  _  _  if ( strchr(zokusei1,'X') && strchr(zokusei1,'y') && (! strstr(mdi_1,"s(")) )
   _  _  _  _     hukusuu(i);   /* 名詞を複数形にする。2004.06.27 */
   _  _  _  _  if (strchr(zokusei1,'d') && (! kanshi_check(mdi_1,ptsp1,wc + i)))
   _  _  _  _     ptinsert(mdi_1,"the "); /* 定冠詞を付ける固有名詞もある。2002.09.24 */
   _  _  _  _  else {
   _  _  _  _  _  if ( proper_ck(zokusei1,mdi_1) && (isdigit(*(cmd + 2)) || (*(cmd + 2) == '-')) )
   _  _  _  _  _     kanshi(mdi_1,i,cmd + 2); 
		    	       /* 固有名詞でなければ名詞に冠詞を付ける。 */
   _  _  _  _  }                /* 冠詞を付けずに複数形にする場合もある。*/
   _  _  _  }
   _  _  }
   _  }
   }
end


static void ninsho(char *verb, char *vb_zoku, char *ptnb)
                                 /* 動詞を人称変化させる。 */
begin   /* global variables: wc, cj[][], cz[][] */
   int sjnb;
   char *vb_part, *pt_zoku, *were_pt, *pt_bar, *pt_p;
   char subject[SentLen], verbq[SentLen];

   verb_select(verb,&vb_part,vb_zoku);  /* 動詞部分だけ vb_part に取り出す。*/
   if (isdigit(*ptnb) || (*ptnb == '-')) { /* 人称の基準となる単語の位置 */
   _  if (*ptnb == '-') {                  /* wc + sjnb を計算する。*/
   _  _  sjnb = val(ptnb + 1);
   _  _  sjnb *= (-1);
   _  }
   _  else
   _     sjnb = val(ptnb);
   _  strcpy(subject,cj[wc + sjnb]);
   _  pt_zoku = cz[wc + sjnb];
   /* 動詞(vb_part)を主語(subject)とその属性(pt_zoku)に従って人称変化させる。*/
   /* pt_zoku は第２属性も含む。*/
   _  if ((strcmp(vb_part,"be") == 0) || (strstr(vb_part,"be ") == vb_part))
   _     be_ninsho(pt_zoku, vb_part, subject);
					   /* be動詞の人称変化（現在形のみ） */
   _  else {
   _  _  were_pt = strstr(verb,"were (be)");
   _  _  if (were_pt) { /* be 動詞(過去) */
   _  _  _  if ( (*subject == '1') && ((strchr(pt_zoku,'y') && (! strchr(pt_zoku,'x')) && (! strchr(pt_zoku,'X')) ) || (strchr(pt_zoku,'z') && (! strstr(pt_zoku,"zFz"))) ) )
     _  _  _     ptreplace(were_pt + 1,3,"as(x)"); /* ラストの条件を加えた。2005.04.03 */
   _  _  _  else {
   _  _  _  _  if ((*subject == '1') && strchr(pt_zoku,'K') && (! strchr(pt_zoku,'X')) && (! strchr(pt_zoku,'F')) && (! strchr(pt_zoku,'x')) )
   _  _  _  _     ptreplace(were_pt + 1,3,"as(x)");
   _  _  _  _  else {
   _  _  _  _  _  if ((*subject == '2') && ((strstr(pt_zoku,"|単") && strcmp(subject + 1,"you")) || strstr(pt_zoku,"|男単")))
   _  _  _  _  _     ptreplace(were_pt + 1,3,"as(x)");
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  wdcpy(verbq,vb_part);
   _  _  _  if (strcmp(verbq,"have") == 0)
   _  _  _     have_ninsho(subject,pt_zoku,vb_part);  /* "have" の人称変化 */
   _  _  _  else {
   _  _  _  _  if (strcmp(verbq,"don't") == 0)
   _  _  _  _     dont_ninsho(subject,verb,pt_zoku);/* "don't" の人称変化 */
   _  _  _  _  else {   /* 一般動詞の人称変化（３人称単数現在の 's'） */
   _  _  _  _  _  if ((vb_part != strstr(verb,"can ")) && (! strstr(subject," and ")) && (! strstr(pt_zoku,"複"))) {
   _  _  _  _  _  _  pt_bar = strchr(vb_zoku,'|');
   _  _  _  _  _  _  pt_p = strchr(vb_zoku,'p');
   _  _  _  _  _  _  if ((! pt_p) || (pt_bar < pt_p))
   _  _  _  _  _  _     san_tan_gen(pt_zoku,vb_part,vb_zoku,subject,verbq);
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   else           /* 人称変化の基準が代名詞文字列で与えられている場合 */
      mojiretsu_ninsho(ptnb,vb_part,verb,vb_zoku);
end


static void verb_select(char *verb, char **vb_part, char *vb_zoku)
                    /* 動詞部分だけ vb_part に取り出す。*/
begin  /* global variables:  */

   char *pt_zoku;
   
   if ((strcmp(verb,"be") == 0) || (strstr(verb,"there be") == verb) || (strcmp(verb,"where be") == 0) || (verb == strstr(verb,"here be")) || (verb == strstr(verb,"be "))) {
   _  if (*verb == 'b')
   _     *vb_part = verb;
   _  else {
   _  _  if (*verb == 'h')
   _  _     *vb_part = verb + 5;
   _  _  else
   _  _     *vb_part = verb + 6;
   _  }
   }
   else {
   _  if (strstr(verb,"there were (be)") == verb) {
   _  _  *vb_part = verb + 6;
   _  }
   _  else {
   _  _  pt_zoku = strchr(vb_zoku,'|');
   _  _  if (pt_zoku && strstr(pt_zoku + 1,"(63")) {
   _  _  _  *vb_part = strchr(verb,' ');
   _  _  _  ++(*vb_part);
   _  _  }
   _  _  else
   _  _     *vb_part = verb;
   _  }
   }
end

static void be_ninsho(char *pt_zoku, char *vb_part, char subject[])
                                /* be動詞の人称変化（現在形のみ） */
begin
   int  lnsb;

   lnsb = strlen(subject);
   if (strchr(pt_zoku,'x') || strchr(pt_zoku,'X') || strstr(pt_zoku,"複") || (strchr(pt_zoku,'F') && strstr(subject," and ")))
      ptreplace(vb_part,2,"are");
   else {
   _  if (*subject == '2') {
   _  _  if ((strcmp(subject + 1,"you") == 0) || (strcmp(subject + 1,"they") == 0) || (strcmp(subject + 1,"we") == 0))
   _  _     ptreplace(vb_part,2,"are");
   _  _  else {
   _  _  _  if ((strcmp(subject + 1,"I") == 0) || (strcmp(subject + lnsb - 5," or I") == 0))
   _  _  _     ptreplace(vb_part,2,"am");
   _  _  _  else
   _  _  _     ptreplace(vb_part,2,"is(x)");
   _  _  }
   _  }
   _  else
   _     ptreplace(vb_part,2,"is(x)");
   }
end


static void have_ninsho(char subject[], char *pt_zoku, char *verb)
                                  /* "have" の人称変化 */
begin /* global variables:  */

   unsigned int  lnsj;
   
   if ((*subject == '1') && (! strchr(pt_zoku,'x')) && (! strchr(pt_zoku,'X')))
   _     ptreplace(verb + 2,2,"s(x)");
   else {
   _  if (strstr("he,she,it,this,that",subject + 1))
   _     ptreplace(verb + 2,2,"s(x)");
   _  else {
   _  _  lnsj = strlen(subject);
   _  _  if (strcmp(subject + lnsj - 3,"one") == 0)
   _  _     ptreplace(verb + 2,2,"s(x)");
   _  }
   }
end


static void dont_ninsho(char subject[], char *verb, char *pt_zoku)
                                /* "don't" の人称変化 */
begin  /* global variables:  */

   if (*subject == '2') {
   _  if (strstr("he,she,it",subject + 1)) {
   _  _  ptinsert(verb + 5,"(x)");
   _  _  ptinsert(verb + 2,"es");
   _  }
   }
   else {
   _  if ((! strchr(pt_zoku,'x')) && (! strchr(pt_zoku,'F')) && (! strchr(pt_zoku,'X'))) {
   _  _  ptinsert(verb + 5,"(x)");
   _  _  ptinsert(verb + 2,"es");
   _  }
   }
end


static void san_tan_gen(char *pt_zoku, char *vb_part, char *vb_zoku, char subject[], char verbq[])
		      /* 一般動詞の人称変化（３人称単数現在の 's'） */
begin   /* gloval variables:  */
   int  lnv;
   char vb_tail[5], vb_zoku_1[ZokuLen], *pt_bar;

   if ((strchr(pt_zoku,'K') || strchr(pt_zoku,'z') || strchr(pt_zoku,'y') || strstr(pt_zoku,"単") || strchr(pt_zoku,'Y')) && (! strchr(pt_zoku,'x'))) {
   _  pt_bar = strchr(vb_zoku,'|');
   _  if (pt_bar)
   _     ptcpy(vb_zoku_1,vb_zoku,pt_bar);
   _  else
   _     strcpy(vb_zoku_1,vb_zoku);
   _  if ((! strchr(vb_zoku_1,'p')) && (! strstr("I,you",subject + 1))) {
   _  _  lnv = strlen(verbq);
   _  _  if ( (*(verbq + lnv - 1) == 'x') && strchr("aiueo",*(verbq + lnv - 2)) ) {
   _  _  _  if (*(vb_part + lnv))  /* relax ==> relaxes, mix ==> mixes  2005.09.25 */
   _  _  _     ptinsert(vb_part + lnv,"es(x)");
   _  _  _  else
   _  _  _     strcat(vb_part,"es(x)");
   _  _ }
   _  _ else {
   _  _  _  if ( (*(verbq + lnv - 1) == 'y') && (! strchr("aueo",*(verbq + lnv - 2))) ) {
   _  _  _  _  *(vb_part + lnv - 1) = 'i';  /* "imply => "implies" など */
   _  _  _  _  if (*(vb_part + lnv))
   _  _  _  _     ptinsert(vb_part + lnv,"es(x)");
   _  _  _  _  else
   _  _  _  _     strcat(vb_part,"es(x)");
   _  _  _  }
   _  _  _  else {     /* vb_part[]は動詞句, verbq[]はその動詞部分のコピー */
   _  _  _  _  strcpy(vb_tail,verbq + lnv - 2);
   _  _  _  _  if (strstr("ch,do,go,sh,ss",vb_tail))
   _  _  _  _     ptinsert(vb_part + lnv,"es(x)");
		  /* teach => teaches,  do => does(x) */
   _  _  _  _  else {
   _  _  _  _  _  if (*(vb_part + lnv))
   _  _  _  _  _     ptinsert(vb_part + lnv,"s(x)");
   _  _  _  _  _  else
   _  _  _  _  _     strcat(vb_part,"s(x)");
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
end

static void mojiretsu_ninsho(char *ptnb, char *vb_part, char *verb, char *vb_zoku)
		       /* 人称変化の基準が代名詞文字列で与えられている場合 */
begin
   int  lnv;
   char *ptc, pronoun[16], *ptsp, verbq[WordLen], vb_tail[5];
   char *pt_bar, *pt_p;

   ptc = strchr(ptnb,';');
   if (ptc)
      ptcpy(pronoun,ptnb - 1,ptc);
   else
      strcpy(pronoun,ptnb - 1);
   if ((strcmp(vb_part,"be") == 0) || (strstr(vb_part,"be ") == vb_part)) {
   _  if (strcmp(pronoun,"I") == 0)  /* be動詞の人称変化（現在形のみ） */
   _     ptreplace(vb_part,2,"am");
   _  else {
   _  _  if (strstr("he,she,it,this,that",pronoun))
   _  _     ptreplace(vb_part,2,"is(x)");
   _  _  else
   _  _     ptreplace(vb_part,2,"are");
   _  }
   }
   else {
   _  if (strstr("I,he,she,it,this,that",pronoun)) {
   _  _  if (vb_part == strstr(verb,"were (be)"))
   _  _     ptreplace(vb_part + 1,3,"as");
   _  _  else {
   _  _  _  if (strcmp(pronoun,"I")) {
   _  _  _  _  if (vb_part == strstr(verb,"don't")) {
   _  _  _  _  _  ptinsert(vb_part + 5,"(x)");
   _  _  _  _  _  ptinsert(vb_part + 2,"es");
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if (vb_part == strstr(verb,"have"))
   _  _  _  _  _     ptreplace(vb_part + 2,2,"s(x)");
   _  _  _  _  _  else {
   _  _  _  _  _  _  pt_bar = strchr(vb_zoku,'|');
   _  _  _  _  _  _  pt_p = strchr(vb_zoku,'p');
   _  _  _  _  _  _  if ((! pt_p) || (pt_bar < pt_p)) {
   _  _  _  _  _  _  _  wdcpy(verbq,vb_part);
		       /* vb_part[]は動詞句, verbq[]はその動詞部分のコピー */
   _  _  _  _  _  _  _  lnv = strlen(verbq);
   _  _  _  _  _  _  _  if ((*(verbq + lnv - 1) == 'y') && (! strchr("aeo",*(verbq + lnv - 2)))) {
				       /* "imply => "implies" など */
   _  _  _  _  _  _  _  _  *(vb_part + lnv - 1) = 'i';
   _  _  _  _  _  _  _  _  if (*(vb_part + lnv))
   _  _  _  _  _  _  _  _     ptinsert(vb_part + lnv,"es(x)");
   _  _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _  _     strcat(vb_part,"es(x)");
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  strcpy(vb_tail,verbq + lnv - 2);
   _  _  _  _  _  _  _  _  if (strstr("ch,do,go,sh,ss",vb_tail))
   _  _  _  _  _  _  _  _     ptinsert(vb_part + lnv,"es(x)");
					    /* teach => teaches,  do => does(x) */
   _  _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  _  if ( (! *(vb_part + lnv)) || (*(vb_part + lnv + 1) != '(')) {
   _  _  _  _  _  _  _  _  _  _  ptsp = strchr(vb_part,' ');
   _  _  _  _  _  _  _  _  _  _  if (ptsp)
   _  _  _  _  _  _  _  _  _  _     ptinsert(ptsp,"s(x)");
   _  _  _  _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _  _  _  _     strcat(vb_part,"s(x)");
   _  _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
end


static void kazu(char *p_noun,char *ptnb) /* 代名詞を複数化させる。 */
begin   /* global variables: wc, cj[][], cz[][] */
   int sjnb;

   if (*ptnb == '-') {     /*数字列 ptnb から 数値 sjnb を計算する。*/
   _  sjnb = val(ptnb + 1);
   _  sjnb *= (-1);
   }
   else
      sjnb = val(ptnb);
   if ((sjnb >= 0) && strchr(cz[wc + sjnb],'X')) {
   _  if (strcmp(p_noun,"this") == 0)
   _      strcpy(p_noun,"these");
   _  else {
   _  _  if (strcmp(p_noun,"that") == 0)
   _  _      strcpy(p_noun,"those");
   _  _  else {
   _  _  _  if (strcmp(p_noun,"it") == 0)
   _  _  _      strcpy(p_noun,"they");
   _  _  _  else {
   _  _  _  _  if (strcmp(p_noun,"its") == 0)
   _  _  _  _      strcpy(p_noun,"their");
   _  _  _  }
   _  _  }
   _  }
   }
end


static void hukusuu(int i)         /* 名詞を複数形にする。*/
begin  /* global variables:  md[][], wc, cj[][], cz[][] */
    unsigned int  lnq = 0, ln_pt_md, lnmi;
    char *pt_md, *ptl, *ptx, *pt_spc, *ptpar, *pt_tan, mdq[WordLen], betsuyaku[WordLen];

	ptpar = strstr(md[i]," （");
	lnmi = strlen(md[i]);       /* 別訳語はいったん分離しておいて複数形を作る。2004.07.04 */
	if ( ptpar && (strcmp(md[i] + lnmi - 2,"）") == 0) ) {
	_  strcpy(betsuyaku,ptpar);
	_  *ptpar = '\0';
	}
	else
	   *betsuyaku = '\0';
	ptl = strchr(cz[wc + i],'|');
	if (ptl)
	   ptpar = strstr(ptl + 1,"(17");
	if (ptl && ptpar) {        /* 複数単語からなる名詞句の複数形を作る。*/
	_  if (i >= 0)
	_     wdcpy(mdq,md[i] + 1);
	_  else
	_     wdcpy(mdq,cj[wc + i] + 1);
	_  lnq = strlen(mdq);
	_  pt_md = mdq;
	}
	else {
	_  if (ptl)
	_     ptpar = strstr(ptl + 1,"(817");
	_  if (ptl && ptpar)
	_     pt_spc = strchr(md[i],' ');
	_  if (ptl && ptpar  && (ptpar != strstr(ptpar,"(81751)")) && pt_spc) { /* 複数単語からなる名詞句の複数形を作る。（その２）*/
	_  _  wdcpy(mdq,pt_spc + 1);     /* 2004.02.06 追加した。*/
	_  _  lnq = strlen(mdq);
	_  _  pt_md = mdq;
	_  }
	_  else {
	_  _  if (i >= 0)
	_  _     pt_spc = md[i];
	_  _  else
	_  _     pt_spc = cj[wc + i];
	_  _  while (pt_spc) {
	_  _  _  pt_md = pt_spc + 1;
	_  _  _  pt_spc = strchr(pt_md,' ');
	_  _  }
	_  }
	}
	if (strcmp(pt_md,"people") == 0)
	   goto END;
	ln_pt_md = strlen(pt_md);
    if ((ln_pt_md < 5) || strcmp(pt_md + ln_pt_md - 4,"nese")) { /* Japanese 等の単複同型語に対応した。*/
    _  ptx = strchr(cz[wc + i],'x');                   /* 2002.06.27 */
	_  if ((! ptx) || (ptl < ptx)) {
	_  _  hukusuu2(pt_md); /* 複数化作業の本体　*/
	_  _  ptinsert(cz[wc + i],"x");
	_  _  pt_tan = strstr(ptl + 1,"単");
	_  _  if (pt_tan)
	_  _     ptcut(pt_tan,2);
	_  }
	_  if (lnq) {
	_  _  if (i >= 0)
	_  _     ptreplace(md[i] + 1,lnq,pt_md);
	_  _  else
	_  _     ptreplace(cj[wc + i] + 1,lnq,pt_md);
	_  }
	}
	else
	   ptinsert(cz[wc + i],"x");    /* 2002.06.30 */
	if (*betsuyaku) {          /* 別訳語はいったん分離しておいて複数形を作る。2004.07.04 */
	_  ptpar = strstr(betsuyaku,"）");
	_  if (ptpar)
	_     *ptpar = '\0';
	_  hukusuu2(betsuyaku + 3);
	_  strcat(betsuyaku,"）");
	_  strcat(md[i],betsuyaku);
	}
  END:;
end


static void hukusuu2(char *pt_md) /* 複数化作業の本体　*/
begin
    unsigned int  ln, mishori = 1;

	if (strcmp(pt_md,"child") == 0) {  /* pt_md は 英語名詞句のラストの単語 */
	_  strcat(pt_md,"ren(s)");       /* "child" => "children" は例外処理 */
	_  mishori = 0;
	}
	else {
	_  if (strcmp(pt_md,"goose") == 0) {
	_  _  strcpy(pt_md,"geese(s)");       /* "goose" => "geese" は例外処理 */
	_  _  mishori = 0;                   /* 2002.11.16 追加した。*/
	_  }
	_  else {
	_  _  if (strcmp(pt_md,"louse") == 0) {  /* pt_md は 英語名詞句のラストの単語 */
	_  _  _  strcpy(pt_md,"lice(s)");       /* "louse" => "lice" は例外処理 */
	_  _  _  mishori = 0;                   /* 2004.07.09 追加した。*/
	_  _  }
	_  _  else {
	_  _  _  if (strcmp(pt_md,"mouse") == 0) {  /* pt_md は 英語名詞句のラストの単語 */
	_  _  _  _  strcpy(pt_md,"mice(s)");       /* "mouse" => "mice" は例外処理 */
	_  _  _  _  mishori = 0;                   /* 2002.09.01 追加した。*/
	_  _  _  }
	_  _  _  else {
	_  _  _  _  if (strcmp(pt_md,"sheep") == 0)
	_  _  _  _     mishori = 0;                /* 2004.02.08. */
	_  _  _  _  else {
	_  _  _  _  _  if (strcmp(pt_md,"tooth") == 0) {
	_  _  _  _  _  _  strcpy(pt_md,"teeth(s)"); /* "tooth" => "teeth" は例外処理 */
	_  _  _  _  _  _  mishori = 0;                   /* 2002.09.08 追加した。*/
	_  _  _  _  _  }
	_  _  _  _  }
	_  _  _  }
	_  _  }
	_  }
	}
	if (mishori) {
	_  ln = strlen(pt_md);
	_  if (ln >= 3){ 
	_  _  if (strcmp(pt_md + ln - 3,"man")== 0) {
	_  _  _  *(pt_md + ln - 2) = 'e'; /* "...man" ==> "...men" */
	_  _  _  strcat(pt_md,"(s)");
	_  _  _  mishori = 0;
	_  _  }
	_  _  else {
	_  _  _  if (strcmp(pt_md + ln - 3,"ife")== 0) {
	_  _  _  _  *(pt_md + ln - 2) = 'v'; /* " ..ife" ==> "...ives"    2002.07.16 */
	_  _  _  _  strcat(pt_md,"s(s)");
	_  _  _  _  mishori = 0;
	_  _  _  }
	_  _  _  else {
	_  _  _  _  if ( (strcmp(pt_md + ln - 3,"eaf")== 0) || ((strcmp(pt_md + ln - 3,"ief")== 0) && strcmp(pt_md,"chief")) ) {
	_  _  _  _  _  strcpy(pt_md + ln - 1,"ves(s)"); /* "leaf","thief" ==> "...ves"    2002.08.18 */
	_  _  _  _  _  mishori = 0;
	_  _  _  _  }
	_  _  _  _  else {
	_  _  _  _  _  if (strcmp(pt_md + ln - 2,"lf") == 0) {
	_  _  _  _  _  _  strcpy(pt_md + ln - 1,"ves(s)"); /* "wolf" ==> "...ves"    2004.02.07 */
	_  _  _  _  _  _  mishori = 0;
	_  _  _  _  _  }
	_  _  _  _  }
	_  _  _  }
	_  _  }
	_  }
	_  if (mishori) {
	_  _  if ((ln >= 3) && (*(pt_md + ln - 1) == 'y') && (! strchr("aeou",*(pt_md + ln - 2)))) {
	_  _  _  strcpy(pt_md + ln - 1,"ies"); /* "...y" ==> "...ies" */
	_  _  _  strcat(pt_md,"(s)");
	_  _  _  mishori = 0;
	_  _  }
	_  _  else {
	_  _  _  if ((ln >= 3) && ((*(pt_md + ln - 1) == 'x') || (strcmp(pt_md + ln - 2,"ss") == 0) || (strcmp(pt_md + ln - 2,"sh") == 0) || (strcmp(pt_md + ln - 2,"ch") == 0) || (strcmp(pt_md + ln - 3,"bus") == 0))) {
	_  _  _  _  strcat(pt_md,"es(s)"); /* "..x","..ss" ==> "...es" */
	_  _  _  _  mishori = 0; /* "..ch" => "..ches" の場合を追加した。2001.02.19 */
	_  _  _  }
	_  _  _  else {
	_  _  _  _  strcat(pt_md + ln,"s(s)");
	_  _  _  _  mishori = 0;
	_  _  _  }
	_  _  }
	_  }
	}
end


void kanshi(char *noun, int i, char *ptnb) /* 名詞に冠詞を付ける。 */
begin   /* global variables: wc, wnb, cj[][], cz[][], md[][] */
   int  sjnb, kan = 0;
   char sjzoku1[SentZokuLen], sjzoku2[SentZokuLen], zokusei1[SentZokuLen], zokusei2[SentZokuLen];
   char *pt2, *ptsp;

   strcpy(zokusei1,cz[wc + i]);
   pt2 = strchr(zokusei1,'|');
   if (pt2 && *(pt2 + 1)) {
   _  strcpy(zokusei2,pt2 + 1);
   _  *pt2 = '\0';
   }
   else
      *(zokusei2) = '\0';
   sjnb = sjzokuCpy(ptnb,sjzoku1,sjzoku2); /* 主語の属性をコピーする。*/
   ptsp = strchr(noun,' ');
   if (ptsp)    /* 名詞 noun[] に既に冠詞が付いているかどうか */
      kan = kanshi_check(noun,ptsp,sjnb);
   if (! kan) {
   _  sjnb = j_noun_ck(i,zokusei2,sjnb,noun);    /* 日本語単語のチェック */
   _  if (sjnb >= 0) {
   _  _  if ((strstr(sjzoku2,"単") && (! strchr(sjzoku1,'F'))) || ( strchr(sjzoku1,'y') && (! strchr(sjzoku1,'X') ) && (! strchr(sjzoku1,'x')) && (! strstr(noun," and ")) && (! strstr(sjzoku2,"複")) ))
   _  _     kanshi_tansuu(sjnb,i,noun,zokusei1,sjzoku1,sjzoku2);
					   /* 単数形加算名詞の場合 */
   _  _  else
   _  _     huku_basho_hutei(sjzoku1,sjzoku2,zokusei1,sjnb,i,noun);
              /* 複数形、場所の単語（定冠詞が付く)、不定冠詞 */
   _  }
   }
   else {
   _  if ( (sjnb >= 0) && (strstr(sjzoku2,"複") || strchr(zokusei1,'X')) && strchr(zokusei1,'y') && (! strchr(zokusei1,'z')) )
   _     hukusuu(i);       /* 複数形にする場合 */  /* "some sheep の為にラストの条件を加えた。 2004.02.04 */
   }
end

static int  kanshi_check(char *noun, char *ptsp, int sjnb)
                           /* 名詞 noun[] に既に冠詞が付いているかどうか */
begin  /* global variables: jwn[][], cj[][] */
   int  kan = 0, ln;
   char head[WordLen];

   ptcpy(head,noun,ptsp);
   ln = strlen(head);
   if ((ln > 2) && (strcmp(head + ln -2,"'s") == 0))
      kan = 1;
   else {
    switch(ln) {
     case 1:
       if (*head == 'a')
          kan = 1;
       break;
     case 2:
       if ((strcmp(head,"an") == 0) || (strcmp(head,"my") == 0))
          kan = 1;
       break;
     case 3:
       if (strstr("her,his,its,one,our,the,Mr.,any",head))
          kan = 1;
       break;
     case 4:
       if (strstr("your,this,that,some,many,much,such,each,Mrs.,Miss",head))
	      kan = 1;
       break;
     case 5:
       if (strstr("their,these,those,where",head))
          kan = 1;
       break;
     default:
       if ((head == strstr(head,"Mr.")) || (head == strstr(head,"Mrs.")))
          kan = 1;
       else {
       _  if (strcmp(head,"another") == 0)
       _     kan = 1;
       }
       break;
    }
   }
   if (! kan) {
   _  if ((strcmp(jwn[sjnb],"名刺") == 0) && strstr(cz[sjnb],"OJ") && (strcmp(jwn[sjnb + 1],"どうぞ") == 0) && (strcmp(cj[sjnb + 1],"3here be") == 0)) {
   _  _  ptinsert(noun,"my ");
   _  _  kan = 1;
   _  }
   _  else {
   _  _  if (noun == strstr(noun,"just a "))
   _  _     kan = 1;  /* 2002.09.08 追加した。*/
   _  }
   }
   return(kan);
end

static int sjzokuCpy(char *ptnb, char sjzoku1[], char sjzoku2[])
                                      /* 主語の属性をコピーする。*/
begin   /* global variables:  wc, cz[][] */
   int  sjnb;
   char *pt2;
   
   if (*ptnb == '-') {     /*数字列 ptnb から 数値 sjnb を計算する。*/
   _  sjnb = val(ptnb + 1);
   _  sjnb *= (-1);
   }
   else
      sjnb = val(ptnb);
   sjnb += wc;
   pt2 = strchr(cz[sjnb],'|');
   if (pt2 && *(pt2 + 1)) {
   _  ptcpy(sjzoku1,cz[sjnb],pt2);
   _  strcpy(sjzoku2,pt2 + 1);
   }
   else {
   _  strcpy(sjzoku1,cz[sjnb]);
   _  *sjzoku2 = '\0';
   }
   return(sjnb);
end


static int  j_noun_ck(int i, char zokusei2[], int sjnb, char noun[])
                                            /* 日本語単語のチェック */
begin  /* global variables: wc, jwn[][], cj[][], cz[][] */
   
   unsigned int  ln;
   char j_noun[JSentLen];
   
   strcpy(j_noun,jwn[wc + i]);
   ln = strlen(j_noun);
   if ((strcmp(j_noun + ln - 2,"は") == 0) && strstr(zokusei2,"SJは"))
      *(j_noun + ln - 2) = '\0';
   else {
   _  if (strcmp(j_noun + ln - 2,"を") == 0)
   _     *(j_noun + ln - 2) = '\0';
   }
   if (shinrui_ck(j_noun,sjnb,i)) { /* j_noun[] の値が親兄弟などであるか */
   _  if ((wc + i > 0) && (strcmp(cj[wc + i - 1],"2he") == 0) && strstr(cz[wc + i - 1],"SJ"))
   _     ptinsert(noun,"his ");
   _  else {
   _  _  if ((wc + i > 1) && (strcmp(cj[wc + i - 2],"2you") == 0) && strstr(cz[wc + i - 2],"SJ"))
   _  _     ptinsert(noun,"your ");
   _  _  else {
   _  _  _  if ((wc + i > 0) && (strcmp(cj[wc + i - 1],"2we") == 0) && strstr(cz[wc + i - 1],"SJ"))
   _  _  _     ptinsert(noun,"our ");  /* 2002.10.03 追加した。*/
   _  _  _  else
   _  _  _     ptinsert(noun,"my ");
   _  _  }
   _  }
   _  sjnb = -1;
   }
   else {
   _  if (strstr("頭髪顔眉目鼻耳口首手腕足胸腹背中腰",j_noun))
   _     sjnb = shintai(sjnb,i,noun); /* 身体の部分には所有格を付ける。*/
   _  else {
   _  _  if ((strcmp(j_noun,"ハンカチ") == 0) && (strcmp(jwn[wc + i + 1],"で") == 0))
   _  _     sjnb = shintai(sjnb,i,noun); /* 「ハンカチで」も身体に準ずる。*/
   _  _  else {
   _  _  _  if ((strcmp(j_noun,"仕事") == 0) && (strcmp(noun,"work") == 0))
   _  _  _     sjnb = -1;  /* work (仕事)には冠詞を付けない。2002.07.13 */
   _  _  }
   _  }
   }
   return(sjnb);
end


static int  shinrui_ck(char j_noun[], int sjnb, int i)
		       /* j_noun[] の値が親兄弟などであるかチェックする。 */
begin  /* global variables: wc, cj[]  */

   int  shinrui = 0;

   if (strstr("父母両親夫,妻兄弟姉妹祖父祖母",j_noun))
      shinrui = 1;
   else {
   _  if (strstr("伯父叔父おじ伯母叔母おば従兄弟いとこ息子娘孫家族",j_noun))
   _     shinrui = 1;  /* [従兄弟いとこ]を追加した。2004.02.15 */
                       /* [叔父叔母]を追加した。2004.03.06 */
   }
   if (shinrui) {
   _  if (sjnb != wc + i)
   _     shinrui = 0;
   _  else {
   _  _  if (strcmp(cj[wc + i + 1],"3have") == 0)
   _  _     shinrui = 0;
   _  _  else
   _  _     if (strcmp(cj[wc + i + 1],"3do not have") == 0)
   _  _        shinrui = 0;
   _  }
   }
   return(shinrui);
end


static int  shintai(int sjnb, int i, char *noun)
				  /* 身体の部分には所有格を付ける。*/
begin  /* global variables: wc, cz[][], jwn[][] */
   int ok = 0;

   if ((sjnb == wc + i) && (strchr(cz[sjnb + 1],'i') || (strcmp(jwn[sjnb + 1],"で") == 0))) {
   _  if (strcmp(jwn[sjnb + 2],"なさい") == 0) {
   _  _  ptinsert(noun,"your ");
   _  _  sjnb = -1;
   _  }
   _  else {
   _  _  if (sjnb) {
   _  _  _  if (strstr(cz[sjnb - 1],"SJ")) {
   _  _  _  _  ok = 1;
   _  _  _  _  --sjnb;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if ((sjnb > 1) && (cj[sjnb - 1][0] == '6') && strstr(cz[sjnb - 2],"SJ")) {
   _  _  _  _  _  ok = 1;
   _  _  _  _  _  sjnb -= 2;
   _  _  _  _  }
   _  _  _  }
   _  _  _  if (ok) {
   _  _  _  _  if (strcmp(cj[sjnb],"2he") == 0) {
   _  _  _  _  _  ptinsert(noun,"his ");
   _  _  _  _  _  sjnb = -1;
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if (strcmp(cj[sjnb],"2she") == 0) {
   _  _  _  _  _  _  ptinsert(noun,"her ");
   _  _  _  _  _  _  sjnb = -1;
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (strcmp(cj[sjnb],"2they") == 0) {
   _  _  _  _  _  _  _  ptinsert(noun,"their ");
   _  _  _  _  _  _  _  sjnb = -1;
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if ( strstr(cz[sjnb],"Omy|身SJが") && (cj[sjnb + 2][0] == '0') ) {
   _  _  _  _  ptinsert(noun,"my ");
   _  _  _  _  sjnb = -1;
   _  _  _  }   /* 「背中（が）」+「かゆい」+「。」に対応した。2004.08.28 */
   _  _  }
   _  }
   }
   return(sjnb);
end


static void kanshi_tansuu(int sjnb, int i, char *noun, char zokusei1[], char sjzoku1[], char sjzoku2[])                  /* 単数形加算名詞の場合 */
begin
  /* global variables: wc, wnb, cj[][], cz[][], jwn[][], md[][], sj[], oj[]  */

   int  def = 0;
   char *pt_nxt_cj, *pt2;

   pt_nxt_cj = cj[sjnb + 1] + 1;
   if (! i)
      goto SENTOU; /* TURBO C  コンパイラー・バグ対策 */
   if (i > 0) {
   _  pt2 = strchr(cz[wc + i - 1],'|');
   _  if (pt2 && (md[i - 1][0] == '3') && strchr(cz[wc + i - 1],'G') && strchr(pt2,'D')) {
				/* 直前が進行形の動詞なら名詞には定冠詞を付ける。*/
   _  _  if ((wc + i + 2 > wnb) || strcmp(md[i + 1],"7of") || (! strchr(cz[wc + i + 2],'K')))
   _  _     def = 1;
   _  }
   }
  SENTOU:;
   if (! def) {
   _  if ((strcmp(noun, sj) == 0) || (strcmp(noun, oj) == 0) || strchr(zokusei1,'d'))
   _     def = def_cond(noun,zokusei1,sjzoku2,sjnb,i);
		    /* 定冠詞を付ける条件チェック（その１） */
   _  if (! def) /* ここを else から if (! def) に変更した。 2004.01.14 */
   _     def = basho_phrase(sjnb,sjzoku1,sjzoku2,pt_nxt_cj);
			      /* 場所の副詞句には 'the' を付ける。*/
   _  if (! def)
   _     def = def_cond2(i,sjzoku1,sjzoku2,sjnb);
				/* 定冠詞を付ける条件チェックの続き */
   }
   if (def)
      ptinsert(noun,"the "); /* 定冠詞を付ける場合 */
   else {
   _  if (! strchr(noun,' '))
   _     def = shoyuu(i,noun);  /* 所有代名詞を付ける場合*/
   _  if (! def)
   _     hutei_kanshi(i, noun);    /* 不定冠詞を付ける場合 */
   }
end


static void  huku_basho_hutei(char sjzoku1[], char sjzoku2[], char zokusei1[], int sjnb, int i, char *noun)
              /* 複数形、場所の単語（定冠詞が付く)、不定冠詞 */
begin  /* global variables: cj[][] */
   int  def;
   char *pt_nxt_cj;



   pt_nxt_cj = cj[sjnb + 1] + 1;
   if ((strstr(sjzoku2,"複") || strchr(zokusei1,'X')) && strchr(zokusei1,'y')) {
   _  if ((strchr(zokusei1,'x') || strchr(zokusei1,'X')) && strchr(zokusei1,'B')) {
   _  _  def = basho_phrase(sjnb,sjzoku1,sjzoku2,pt_nxt_cj);
   _  _  if (def)
   _  _     ptinsert(noun,"the "); /* 定冠詞を付ける場合 */
   _  _  if (strchr(zokusei1,'X'))
   _  _     hukusuu(i); /* 複数形にする場合 */
   _  }
   _  else
   _     hukusuu(i); /* 複数形にする場合 */
   }
   else {
   _  if (strchr(sjzoku1,'z')) {
   _  _  if (strchr(sjzoku1,'d'))
   _  _     ptinsert(noun,"the ");
   _  _  else {
   _  _  _  if (strstr(sjzoku2,"(51)") && strstr(noun," cloth")) {
   _  _  _  _  if (strchr("aiueoAIUEO", *noun))
   _  _  _  _     ptinsert(noun,"an ");    /* 不定冠詞を付ける場合 */
   _  _  _  _  else
   _  _  _  _     ptinsert(noun,"a ");
   _  _  _  }
   _  _  }
   _  }
   }
end


static int  def_cond(char noun[], char zokusei1[], char sjzoku2[],int sjnb, int i)
			       /* 定冠詞を付ける条件チェックの続き */
begin  /* global variables: wc, cz[][], cj[][]  */

   int  def = 1;
   char *pt_spc, *pt_bar;

   if ((! strstr(noun," the ")) && (! strchr(zokusei1,'K')) && ((! strstr(zokusei1,"y件")) || (! strstr(cz[wc + i + 1],"Ep")))) {
   _  pt_spc = strchr(noun,' ');
   _  pt_bar = strchr(cz[wc + i],'|');
   _  if (strchr(zokusei1,'d') || ((wc + i == 1) && ((strcmp(cj[0],"6so") == 0) || (cj[0][0] == '9'))) || (! strstr(pt_bar + 1,"(51)")) || strchr(pt_spc + 1,' ')) {
   _  _  if ((! strstr(sjzoku2,"SJは")) && strcmp(cj[sjnb + 1] + 1,"also"))
   _  _     def = 1;
   _  _  else {
   _  _  _  if (! strchr(cz[wc + i + 1],'v'))
   _  _  _     def = 1;
   _  _  _  else {
   _  _  _  _  if (pt_spc)
   _  _  _  _     def = 1;
   _  _  _  }
   _  _  }
   _  }
   }
   if ((cj[wc + i + 1][0] == '3') && strstr(cz[wc + i + 2],"vN") && strchr(zokusei1,'y') && (! strchr(zokusei1,'d')) && (! strchr(md[i],' ')))
      def = 0;
   else {  /* def のデフォールト値を 0 から 1 に変更し、以下の２条件を加えた。2002.09.09 */
   _  if (strchr(zokusei1,'?') && (wc + i > 0) && (strcmp(cj[wc + i - 1],"6also") == 0))
   _     def = 0;
   _  else {
   _  _  if ( ((strcmp(noun,sj) == 0) && strchr(sz,'?')) || ((strcmp(noun,oj) == 0) && strchr(oz,'?')) )
   _  _     def = 0;
    _  }
   }
   return(def);
end

static int  basho_phrase(int sjnb, char zokusei1[], char zokusei2[], char *pt_nxt_cj)
			      /* 場所の副詞句には 'the' を付ける。*/
begin   /* global variables: cj[][], cz[][], jwn[][] */
   int  def = 0;
   char *pt_vb_yak;

   if (strchr(zokusei1,'B') && strstr("7at,7from,7in,7near,7of,7on",cj[sjnb + 1]))
      def = basho_prep(sjnb, zokusei1);
      /* 「場所」名詞＋前置詞の場合の定冠詞を付けるかどうかの判定 */
   else {
   _  pt_vb_yak = jwn[sjnb + 2];
   _  if (strcmp(cj[sjnb + 1],"7to") == 0) {
   _  _  if ( strstr(pt_vb_yak,"行く") || strstr(pt_vb_yak,"来る") || strstr(pt_vb_yak,"歩く") || strstr(pt_vb_yak,"急ぐ") || strstr(pt_vb_yak,"迎える") )
   _  _     def = 1;
	 /* "go to", "come to", "walk to" に続く場合は "the" を付ける。*/
   _  _  else {
   _  _  _  if ( strstr(pt_vb_yak,"帰っ") || strstr(jwn[sjnb + 3],"帰っ") || strstr(jwn0[sjnb + 2],"行っ") || strstr(jwn0[sjnb + 2],"駆け") || strstr(jwn[sjnb + 3],"行く") )
   _  _  _     def = 1;
   _  _  }  /* さらにケースを追加した。2002.11.12 */
   _  }
   _  else {
   _  _  if (strstr(zokusei1,"wB") && (strcmp(cj[sjnb + 1],"7to") == 0) && strstr(pt_vb_yak,"行う") && strstr(cz[sjnb + 2],"|D"))
   _  _     def = 1;
	 /* "「行って」=>「行く」「行う」の混同を訂正する。2002.07.25 */
   _  _  else {
   _  _  _  if (strstr(zokusei2,"SJは") && ((strcmp(pt_nxt_cj,"where") == 0) || (strcmp(pt_nxt_cj,"where be") == 0) || (strcmp(pt_nxt_cj,"where were (be)") == 0)))
   _  _  _     def = 1;  /* 「... はどこにありますか。」の場合 */
   _  _  _  else {
   _  _  _  _  if (strcmp(cj[sjnb + 1],"3run to") == 0) 
   _  _  _  _     def = 1;  /* 追加した。 2004.02.04 */
   _  _  _  }
   _  _  }
   _  }
   }
   if (! def)
      def = basho_phrase2(sjnb,zokusei1,zokusei2);
   if (! def)
      def = basho_phrase3(sjnb,zokusei1,zokusei2);
   return(def);
end


static int  basho_prep(int sjnb, char zokusei1[])
      /* 「場所」名詞＋前置詞の場合の定冠詞を付けるかどうかの判定 */
begin            /* global variables: cz[][], jwn[][], cj[][] */
   unsigned int  ln2;
   int  def = 0;
   
   if (strstr(cz[sjnb + 2],"OJ") && strstr(cz[sjnb + 3],"|を"))
      def = 1;
   else {
   _  if (strstr(cz[sjnb + 2],"SJ") && (strchr(cz[sjnb + 3],'E') || strchr(cz[sjnb + 3],'G')))
   _     def = 1;
   _  else {
   _  _  if ((strchr(cz[sjnb + 2],'B') || (strcmp(jwn[sjnb + 2],"ある") == 0)) && ((strcmp(cj[sjnb + 1],"7near") == 0) || (cj[sjnb + 3][0] == '7')))
   _  _     def = 1;
   _  _  else {
   _  _  _  if (strstr(cz[sjnb + 2],"|を")) {
   _  _  _  _  if (sjnb && strstr(cz[sjnb - 1],"OJ") || (strcmp(jwn[sjnb + 2],"勉強する") == 0))
   _  _  _  _     def = 1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (strstr(cz[sjnb + 2],"j|D") && (strcmp(cj[sjnb + 3],"3be") == 0))
   _  _  _  _     def = 1;
   _  _  _  }
   _  _  }
   _  _  if (! def) {
   _  _  _  if (strstr(zokusei1,"y軒") && sjnb && strcmp(cj[sjnb - 1],"6usually"))
   _  _  _  _  def = 1;
   _  _  _  else {
   _  _  _  _  ln2 = strlen(cj[sjnb + 2]);
   _  _  _  _  if ((ln2 >= 6) && (strcmp(cj[sjnb + 2] + ln2 - 6,"across") == 0))
   _  _  _  _     def = 1;
   _  _  _  }
   _  _  }
   _  }
   }
   if (! def) {
   _  if ((sjnb > 0) && (! strstr(cz[sjnb],"(51)")) && strstr(cz[sjnb - 1],"SJ") && strstr(cz[sjnb - 1],"y人") && (cj[sjnb + 2][0] == '3'))
   _     def = 1;
   }
   return(def);
end

static int  basho_phrase2(int sjnb, char zokusei1[], char zokusei2[])
begin   /* global variables: cj[][], cz[][], jwn[][] */
   int  def = 0;
   char *pt_cz1;


   pt_cz1 = cz[sjnb + 1];
   if (strchr(zokusei1,'B')) {
   _  if ((strcmp(cj[sjnb + 1],"7under") == 0) && strchr(zokusei1,'y'))
   _     def = 1;
   _  else {
   _  _  if (strcmp(jwn[sjnb + 2],"います") == 0) {
   _  _  _  if ((strcmp(jwn[sjnb + 1],"に") == 0) || (strcmp(jwn[sjnb + 1],"近くに") == 0))
   _  _  _     def = 1;
   _  _  }
   _  _  else {
   _  _  _  if ((strcmp(cj[sjnb + 1],"7along") == 0) && (cj[sjnb + 2][0] == '3'))
   _  _  _     def = 1;
   _  _  _  else {
   _  _  _  _  if ((strstr(pt_cz1,"i|をr") && (strcmp(jwn[sjnb + 2],"なさい") == 0)) || (strstr(cz[sjnb + 1],"i|をサr") && strstr(zokusei1,"棟")))
   _  _  _  _     def = 1;
   _  _  _  _  else {
   _  _  _  _  _  if ((strcmp(cj[sjnb + 1],"7of") == 0) && strstr(cj[sjnb + 2],"3pass ") && strstr(cz[sjnb + 2],"|の"))
   _  _  _  _  _     def = 1;
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (strstr(zokusei2,"SJが") && strchr(pt_cz1,'j') && (strcmp(cj[sjnb + 2],"Xyes") == 0) )
   _  _  _  _  _  _     def = 1;
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  if (! def) {
   _  _  if ((strcmp(cj[sjnb],"1cafeteria") == 0) && (strcmp(cj[sjnb + 1],"7in") == 0) && strstr(cz[sjnb + 2],"uj"))
   _  _     def = 1;
   _  _  else {
   _  _  _  if ( strchr(cz[sjnb],'B') && (strcmp(cj[sjnb + 1],"to") == 0) && (strncmp(cj[sjnb + 2],"run",3) == 0) )
   _  _  _     def = 1;
   _  _  }
   _  }
   }
   return(def);
end

static int  basho_phrase3(int sjnb, char zokusei1[], char zokusei2[])
begin   /* global variables: cj[][], cz[][], jwn[][] */
   int  def = 0;
   char *pt_cz1;

   pt_cz1 = cz[sjnb + 1];
   if ((strstr(zokusei1,"cy台") || strstr(zokusei1,"cy両") || strstr(zokusei1,"cy機") || strstr(zokusei1,"cy隻")) && (strcmp(cj[sjnb + 1],"3get off") == 0))
      def = 1;
   else {
   _  if (cj[sjnb + 1][0] == '3') {
   _  _  if (strstr(zokusei1,"y箇所") && strstr(pt_cz1,"に")) {
   _  _  _  if (strstr(zokusei2,"OJ") || (strstr(cj[sjnb + 1]," to") && strstr(pt_cz1,"(37)")))
   _  _  _     def = 1;
   _  _  }
   _  _  else {
   _  _  _  if (strstr(cj[sjnb + 1]," / with") && (! strstr(zokusei1,"y本")))
   _  _  _     def = 1;
   _  _  }
   _  }
   }
   return(def);
end


static int  def_cond2(int i, char sjzoku1[], char sjzoku2[], int sjnb)
				  /* 定冠詞を付ける条件チェックの続き */
begin  /* global variables: wc, wnb, cz[][], md[][], jwn[][]  */

  int  def = 0;
  char *pt2, *pt_p, *pt_bar, *pt_i, *pt_md_sj;

   pt2 = strchr(cz[wc + i + 1],'|');
  if ((i <= wnb - 3) && pt2 && strcmp(md[i + 1],"3paint")) {
   _  if ((md[i + 1][0] == '3')  &&  (pt_i = strchr(cz[wc + i + 1],'i')) && (pt_i < pt2) ) {
   _  _  if (strchr(pt2,'D') && (strcmp(md[i + 2],"4please") == 0))
   _  _     def = 1;
   _  _  else {
   _  _  _  if (strchr(pt2,'r') && (strcmp(md[i + 2],"4do") == 0))
        			  /* 直後が命令形の動詞なら名詞には定冠詞を付ける。*/
   _  _  _     def = 1;
   _  _  }
   _  }
   _  else {
   _  _  if (sjnb + 1 <= 8)  /* ここにバグがあったのを訂正した。 2003.12.21 */
   _  _     pt_md_sj = md[sjnb + 1];
   _  _  else
   _  _     pt_md_sj = cj[wc + sjnb + 1];
   _  _  if (strstr(sjzoku2,"OJ") && (*pt_md_sj == '6')) {
   _  _  _  if (strchr(cz[sjnb + 1],'B') && strstr(cz[sjnb + 2],"を") && (strcmp(jwn[sjnb + 3],"なさい") == 0))
   _  _  _     def = 1; /* （場所の副詞＋命令文）の目的語には定冠詞 */
   _  _  }
   _  }
   }
   if (! def) {
   _  if (strstr(sjzoku2,"SJは")) {
   _  _  if (strstr(sjzoku1,"y人") && strstr(sjzoku2,"(51)")) {
   _  _  _  if (strchr(cz[sjnb + 1],'p') && ((! i) || ((i == 1) && strchr(cz[0],'F'))))
   _  _  _     def = 1;
   _  _  }
   _  _  else {
   _  _  _  if (strstr(cj[sjnb + 1],"were (be)") && (strstr(cj[sjnb + 1],"ing(") || strstr(cz[sjnb + 1],"受動")))
   _  _  _     def = 1;
   _  _  _  else {
   _  _  _  _  if (strstr(sjzoku1,"y箇所") && strstr(cj[sjnb + 1],"be ") && strstr(cz[sjnb + 1],"受動"))
   _  _  _  _     def = 1;
   _  _  _  }
   _  _  }
   _  _  if (! def) {
   _  _  _  pt_p = strchr(cz[sjnb + 1],'p');
   _  _  _  pt_bar = strchr(cz[sjnb + 1],'|');
   _  _  _  if ((cj[sjnb + 1][0] == '3') && strstr(cz[sjnb + 1],"y箇所") && pt_p && (pt_p < pt_bar))
   _  _  _     def = 1;
   _  _  }
   _  }
   }
   return(def);
end

static int shoyuu(int i, char noun[])  /* 所有代名詞を付ける場合*/
begin  /* global variables:  wc, cz[][] */
   int  def = 0;
   char zokusei1[ZokuLen], *pt2, maeZoku1[ZokuLen], maeZoku2[ZokuLen];
   char pronoun[WordLen];
   
   pt2 = strchr(cz[wc + i],'|');
   if (pt2)
      ptcpy(zokusei1,cz[wc + i],pt2);
   else
      strcpy(zokusei1,cz[wc + i]);
   if ( strchr(zokusei1,'h') && (wc + i >= 1) && (cj[wc + i - 1][0] == '2') && strcmp(jwn[wc + i],"少年") && strcmp(jwn[wc + i],"少女") ) {
   _  pt2 = strchr(cz[wc + i - 1],'|'); /* ラストの２条件を加えた。2002.09.21 */
   _  if (pt2) {
   _  _  ptcpy(maeZoku1,cz[wc + i - 1],pt2);
   _  _  strcpy(maeZoku2,pt2 + 1);
   _  }
   _  else {
   _  _  strcpy(maeZoku1,cz[wc + i - 1]);
   _  _  *maeZoku2 = '\0';
   _  }
   _  if (strchr(maeZoku1,'h') && *maeZoku2 && strstr(maeZoku2,"SJ") && strcmp(cj[wc + i + 1],"3have") && strcmp(cj[wc + i + 1],"3be")) {
   _  _  if ((wnb <= wc + i + 3) || strcmp(cj[wc + i + 3],"3be")) {
   _  _  _  def = 1;
   _  _  _  strcpy(pronoun,cj[wc + i - 1] + 1);
   _  _  _  if (strcmp(pronoun,"I") == 0)
   _  _  _    ptinsert(noun,"my ");
   _  _  _  else {
   _  _  _  _  if (strcmp(pronoun,"you") == 0)
   _  _  _  _     ptinsert(noun,"your ");
   _  _  _  _  else {
   _  _  _  _  _  if (strcmp(pronoun,"he") == 0)
   _  _  _  _  _     ptinsert(noun,"his ");
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (strcmp(pronoun,"she") == 0)
   _  _  _  _  _  _     ptinsert(noun,"her ");
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(def);
end

static void hutei_kanshi(int i, char *noun)
				     /* 名詞（句）に不定冠詞を付ける場合 */
begin   /* global variables: wc, cz[][], sj[], oj[], pes[], jps[], md[][] */
   unsigned int  ln, lnj, hutei_kan = 0;
   char zokusei0[ZokuLen], *pt_noun, *pt_j_noun;

   strcpy(zokusei0,cz[wc + i]);
   if (((! strchr(zokusei0,'K')) || strchr(noun,' ')) && (! strstr(noun,", a ")) && strchr(zokusei0,'y') ) {
   _  pt_noun = strstr(pes,noun);
   _  ln = strlen(noun);
   _  if (! pt_noun)  {
   _  _  if ((i <= 0) || strcmp(md[i - 1],"7between") || (strcmp(jwn[wc + i],"会話") == 0))
   _  _     hutei_kan = 1;
   _  }
   _  else {
   _  _  if ((strcmp(md[i + 1],"3have") == 0) || strchr(pes,'?') || (strstr(jps,"？") && strstr(jps,"も")))
   _  _     hutei_kan = 1;
   _  _  else {
   _  _  _  if ((pt_noun != pes) && (*(pt_noun - 1) != ' '))
   _  _  _     hutei_kan = 1;
   _  _  _  else {
   _  _  _  _  if ((i == 0) && (cj[wc + i + 1][0] == '7') && (! strchr(noun,' ')) && (*(pt_noun + ln) == 's'))
   _  _  _  _     hutei_kan = 1;
   _  _  _  _  else {
   _  _  _  _  _  pt_j_noun = strstr(jps,jwn[wc + i]);
   _  _  _  _  _  lnj = strlen(jwn[wc + i]);
   _  _  _  _  _  if (pt_j_noun && ((pt_j_noun + lnj) == strstr(pt_j_noun + lnj,"といっても")))
   _  _  _  _  _     hutei_kan = 1;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  if ((! hutei_kan) && strstr(zokusei0,"y件|SJが") && strstr(cz[wc + i + 1],"Ep"))
   _     hutei_kan = 1;
   _  if ((! hutei_kan) && (cj[wc + i + 1][0] == '3') && strstr(cz[wc + i + 2],"vN") && strchr(zokusei0,'y') && (! strchr(zokusei0,'d')) && (! strchr(md[i],' ')))
   _     hutei_kan = 1;
   _  if ((! hutei_kan) && strstr(zokusei0,"hy人|SJが") && (strcmp(jwn[wc + i + 1],"居る") == 0) && (strcmp(jwn[wc + i -1],"も") == 0))
   _     hutei_kan = 1;
   _  if (hutei_kan) {
   _  _  if ((ln < 5) || (! strstr(noun + ln - 4,"(s)"))) {/* 不定冠詞を付ける場合 */
   _  _  _  if ( strchr("aiueoAIUEO", *noun) && (noun != strstr(noun,"one")) )
   _  _  _     ptinsert(noun,"an ");    /* 上の２番目の条件を加えた。2002.10.24 */
   _  _  _  else
   _  _  _     ptinsert(noun,"a ");
   _  _  }
   _  }
   _  else
   _     ptinsert(noun,"the ");
   }
end

static int  proper_ck(char zokusei1[], char *md)
begin            /* 固有名詞でない事のチェック。固有名詞なら 0 を返す。*/
   int  rtn;
   char *ptsp, *ptdm, *ptsp_1;
   
   rtn = 0;
   if ((! *zokusei1) || (! strchr(zokusei1,'K')))
      rtn = 1;
   else {
   _  str_rchr(md,' ',ptsp,ptdm);
   _  if (ptsp) {
   _  _  ptsp_1 = ptsp + 1;
   _  _  if	(islower(*ptsp_1))
   _  _     rtn = 1;
   _  _  else {  /* 末尾に別訳語が付いている  case :  2001.01.29 追加した。*/
   _  _  _  if ((ptsp_1 == strstr(ptsp_1,"（")) && islower(*(ptsp_1 + 2)) && strchr(zokusei1,'y'))
   _  _  _     rtn = 1;
   _  _  }
   _  }
   }
   return(rtn);
end


static void ninsho_clause(int i, char *cmd)
      /* 「oneself」や「one」を含む句や節のその部分を代名詞に置き換える。*/
begin  /* global variables: wc, cj[][], cz[][], md[][] */
   int  nb;
   char nbchr[10], *ptl, *pto, pronoun[WordLen];

   if (*cmd == 'J') {
   _  if (*(cmd + 1) == '-') {
   _  _  strcpy(nbchr,cmd + 2);
   _  _  nb = val(nbchr);
   _  _  nb *= (-1);
   _  }
   _  else {
   _  _  strcpy(nbchr,cmd + 1);
   _  _  nb = val(nbchr);
   _  }
   }
   ptl = strchr(cz[wc + i],'|');
   pto = strstr(md[i]," one be ");
   if (strstr(ptl + 1,"(623") && pto) {
   _  if (cj[wc + nb][0] == '2') {
   _  _  strcpy(pronoun,cj[wc + nb] + 1);
   _  _  if ((md[i + 1][0] == '3') && strchr(cz[wc + 1],'p')) {
   _  _  _  if ((strcmp(pronoun,"I") == 0) || (strcmp(pronoun,"he") == 0) || (strcmp(pronoun,"she") == 0) || (strcmp(pronoun,"it") == 0))
   _  _  _     ptreplace(pto + 5,2,"was");
   _  _  _  else
   _  _  _     ptreplace(pto + 5,2,"were");
   _  _  }
   _  _  ptreplace(pto + 1,3,pronoun);
   _  }
   _  else 
   _     if ((nb > 0) && (md[nb][0] == '3') && strchr(cz[wc + nb],'p'))
   _        if (strstr(md[nb],"3I "))
   _           ptreplace(pto + 1,6,"I was");
   }
   else {
   _  pto = strstr(md[i] + 1,"oneself");
   _  if (pto) {
   _  _  if (strcmp(cmd,"he") == 0)
   _  _     ptreplace(pto,3,"him");
   _  }
   }
end

static void hankak(int i) /* 訳語を半角数字に直す。*/
begin   /* global variables: wc, md[][], jwn[][] */
   char zenkaku[10];
   
   if ( (i < 0) || isalnum(md[i][1]) )
      strcpy(zenkaku,jwn[wc + i]);
   else
      strcpy(zenkaku,md[i] + 1);
   nzentohan(zenkaku,md[i] + 1);
end


static void tr_OP(char cmd[], char *mdi_1, int i)
                       /* 'O' または 'P' で始まるコマンドの割り振り */
begin  /* global ariables: wc, oj[], oz[], cz[][]  */

   if (strcmp(cmd,"OJ") == 0)
	  sopresv(oj,oz,i);   /* 目的語訳語として保存する。*/
   else {
   _  if (strcmp(cmd,"OBJ") == 0)     /* 代名詞を目的格に変化させる。*/
   _     mokuteki_kaku(mdi_1);
   _  else {
   _  _  if (cmd == strstr(cmd,"ONE&"))
   _  _     one_adjust(mdi_1,cz[wc + i],cmd + 4);
   _  _   /*  代名詞 "one" を具体的な "I, you, we，etc" に置換する。*/
   _  _  else {
   _  _  _  if (strcmp(cmd,"PAST") == 0)         /* 過去形を作る。*/
   _  _  _     past(mdi_1,i,1);
   _  _  _  else
   _  _  _     if (strcmp(cmd,"PPLE") == 0)    /* 過去分詞形を作る。*/
   _  _  _        past(mdi_1,i,2);
   _  _  }
   _  }
   }
end


static void tr_S(char cmd[], int i)  /* 'S' で始まる名前のコマンドの割り振り */
begin  /* global variables: md[][], sj[], sz[] */

   if (strcmp(cmd,"SINKO") == 0)
      sinko(md[i]);
   else {
   _  if (strcmp(cmd,"SJ") == 0)
   _     sopresv(sj,sz,i);         /* 主語の訳語として保存する。*/
   }
end

static void tr_mini(char cmd[], int i,char *pt)  /* 英語訳語からの削除命令 */
begin       /* global variables: wc, cz[][] */
   int  i1, i2;
   char *pt2;
   
   if (*(cmd + 1) == '>') {
   _  i1 = *(pt - 1) - '0';
   _  i2 = *(pt + 4) - '0';
   _  pt2 = strchr(cz[wc + i1],'|');
   _  if (pt2)
   _     strcat(cz[wc + i2],pt2 + 1);
   _  *pt = ' ';
   }
   else {
   _  if (*(pt - 2) == '-')
   _     minus(cmd + 1,*(pt - 3),i);
   _  else
   _     minus(cmd + 1,*(pt - 2),i);
   }
end


static void one_adjust(char mdq[],char czq[], char *pronoun)
	 /*  代名詞 "one" を具体的な "I, you, we，etc" に置換する。*/
begin
   char *pt_one, *pt_bar, *pt_amp, *ptq, *pty, *ptsmc, pronq[50];
   int  sp, sj_nb = 20;

   if (pronoun == strchr(pronoun,'J')) {
   _  if ( *(pronoun + 1) == '-' ) {
   _  _  sj_nb = *(pronoun + 2) - '0';
   _  _  sj_nb *= (-1);
   _  }
   _  else {
   _  _  if ( isdigit(*(pronoun + 1)) )
   _  _     sj_nb = *(pronoun + 1) - '0';
   _  }
   _  if (sj_nb >= 0) {
   _  _  if (md[sj_nb][0] == '1') { /* oneself の指定が可算名詞の場合 */
   _  _  _  ptq = cz[sj_nb];        /* 2004.02.08 */
   _  _  _  pty = strchr(ptq,'y');
   _  _  _  pt_bar = strchr(ptq,'|');
   _  _  _  if ( pty && (! strchr(ptq,'x')) && strstr(pt_bar + 1,"男") )
   _  _  _     strcpy(pronq,"he");
   _  _  }
   _  _  else
   _  _     strcpy(pronq,md[sj_nb] + 1);
   _  }
   _  else {
   _  _  if (cj[wc + sj_nb][0] == '1') {/* oneself の指定が可算名詞の場合 */
   _  _  _  ptq = cz[wc + sj_nb];        /* 2004.02.08 */
   _  _  _  pty = strchr(ptq,'y');
   _  _  _  pt_bar = strchr(ptq,'|');
   _  _  _  if ( pty && (! strchr(ptq,'x')) && strstr(pt_bar + 1,"男") )
   _  _  _     strcpy(pronq,"he");
   _  _  }
   _  _  else
   _  _     strcpy(pronq,cj[wc + sj_nb] + 1);
   _  }
   }
   else {
   _  strcpy(pronq,pronoun);
   _  ptq = strchr(pronq,';');
   _  if (ptq)
   _     *ptq = '\0';
   }
   pt_one = strstr(mdq,"one's");
   while (pt_one) {
   _  if (sj_nb < 10)
   _     one_shoyuu(pt_one,pronq,cz[wc + sj_nb],czq);
   _  else
   _     one_shoyuu(pt_one,pronq,czq,czq);
   _  pt_one = strstr(mdq,"one's");  /* one's を具体的に代名詞化する。*/
   }
   pt_one = strstr(mdq,"oneself");
   if (pt_one) {
   _  if (strcmp(pronq,"she") == 0)
   _     ptreplace(pt_one,3,"her");
   _  else {
   _  _  if (strcmp(pronq,"he") == 0)
   _  _     ptreplace(pt_one,3,"him");
   _  _  else {
   _  _  _  if (strcmp(pronq,"they") == 0)
   _  _  _     ptreplace(pt_one,7,"themselves");
   _  _  _  else {
   _  _  _  _  if (strcmp(pronq,"you") == 0)
   _  _  _  _     ptreplace(pt_one,3,"your");
   _  _  _  _  else {
   _  _  _  _  _  if (strcmp(pronq,"I") == 0)
   _  _  _  _  _     ptreplace(pt_one,3,"my");
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (strcmp(pronq,"we") == 0)
   _  _  _  _  _  _     ptreplace(pt_one,7,"ourselves");
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   else {
   _  pt_one = strstr(mdq,"one");
   _  if ( pt_one && strchr(czq,'&') ) {
   _  _  if ( (mdq < pt_one) && (*(pt_one - 1) >= 'a') && (*(pt_one - 1) <= 'z') ) {
   _  _  _  pt_one = strstr(pt_one + 3," one"); /* "m*one*y" などの場合に対応した。2004.08.08 */
   _  _  _  if (pt_one)
   _  _  _    ++pt_one;
   _  _  }
   _  _  pt_bar = strchr(czq,'|');
   _  _  pt_amp = strchr(pt_bar + 1,'&');
		      /* 第２属性中の品詞列で、one は & で表されている。*/
   _  _  if (pt_bar && pt_amp) {
   _  _  _  sp = 0;
   _  _  _  ptq = strchr(pt_one,' ');
   _  _  _  while (ptq) {
   _  _  _  _  ++sp;
   _  _  _  _  ++ptq;
   _  _  _  _  ptq = strchr(ptq,' ');
   _  _  _  }
   _  _  _  if (*(pt_amp + sp + 1) == ')') {
   _  _  _  _  ptsmc = strchr(pronq,';');
   _  _  _  _  if (ptsmc)
   _  _  _  _     *ptsmc = '\0';
   _  _  _  _  if ( (*(pt_amp - 1) == '3') || (*(pt_amp - 1) == '7') )  /* 2002.10.13 挿入した。*/
   _  _  _  _     mokuteki_kaku(pronq);  /* 前置詞目的語の場合も加えた。 2004.08.08 */
   _  _  _  _  ptreplace(pt_one,3,pronq);
   _  _  _  }
   _  _  }
   _  }
   }
end


static void  one_shoyuu(char *pt_one, char pronq[], char cz_sj[], char czq[])
				    /* one's を具体的に代名詞化する。*/
begin
   char *pt_bar, *ptW, *ptH, *pt_enp;

   if (strcmp(pronq,"she") == 0) {
   _  ptreplace(pt_one,5,"her");
   _  goto END;
   }
   if (strcmp(pronq,"he") == 0)
      ptreplace(pt_one,5,"his");
   else {
   _  if (strcmp(pronq,"it") == 0)  /* "it" => "its" のケースを補充した。*/ 
   _     ptreplace(pt_one,5,"its"); /* 2004.09.05 */
   _  else {
   _  _  if (strcmp(pronq,"they") == 0)
   _  _     ptreplace(pt_one,5,"their");
   _  _  else {
   _  _  _  if (strcmp(pronq,"you") == 0)
   _  _  _     ptreplace(pt_one,5,"your");
   _  _  _  else {
   _  _  _  _  if (strcmp(pronq,"I") == 0)
   _  _  _  _     ptreplace(pt_one,5,"my");
   _  _  _  _  else {
   _  _  _  _  _  if (strcmp(pronq,"we") == 0)
   _  _  _  _  _     ptreplace(pt_one,5,"our");
   _  _  _  _  _  else {
   _  _  _  _  _  _  pt_bar = strchr(cz_sj,'|');
   _  _  _  _  _  _  if (strstr(pt_bar + 1,"複")) {
   _  _  _  _  _  _  _  if (strstr(czq,"&1)"))
   _  _  _  _  _  _  _     hukusuu2(pt_one + 7);
   _  _  _  _  _  _  _  ptreplace(pt_one,5,"their");
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  ptW = strchr(cz_sj,'W');
   _  _  _  _  _  _  _  if (ptW && (ptW < pt_bar))
   _  _  _  _  _  _  _     ptreplace(pt_one,5,"her");
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  ptH = strchr(cz_sj,'h');
   _  _  _  _  _  _  _  _  if (ptH && (ptH < pt_bar))
   _  _  _  _  _  _  _  _     ptreplace(pt_one,5,"his");
   _  _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _  _     ptreplace(pt_one,5,"its");
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
  END:;
   if (*cz_sj) {
   _  pt_enp = strchr(cz_sj,'&');
   _  if (pt_enp)
   _    *pt_enp = '2';
   }
end


static void upup(char *mdi_1)
       /* 熟語を構成する全ての英訳語の先頭を大文字にする。 */
begin
   char *pt;

   *mdi_1 = toupper(*mdi_1);
   pt = strchr(mdi_1 + 1,' ');
   while(pt && (*(pt + 1) >= 'a') && (*(pt + 1) <= 'z')) {
   _  ++pt;
   _  *pt = toupper(*pt);
   _  pt = strchr(pt + 1,' ');
   }
end

static void zero_cmd(char *cmd, char *pt, int i)
                                 /* "Z" のコマンド(訳語の消去) */
begin   /* global variables: cj[][], cz[][], md[], wc */

   if (strcmp(cmd,"Z") == 0) {
   _  if (*(pt - 2) == 'T')
   _     cz[wc + i][0] = '\0';
   _  else {
   _  _  if (i >= 0)
   _  _     strcpy(md[i] + 1,"Z");
   _  _  else
   _  _     strcpy(cj[wc + i] + 1,"Z");
      }
   }
end

static void tail_add(int i, char *pt, char *cmd)
                            /* 指定された文字列を訳語のラストに結合する */
begin   /* global variables: md[][], cj[][], wc */

   if (i >= 0) {
   _  if (md[i][1] == 'Z')
   _     md[i][1] = '\0';
   _  add(*(pt - 2),i,cmd);
   }
   else {
   _  if (cj[wc + i][1] == 'Z')
   _      cj[wc + i][1] = '\0';;
   _  add(*(pt - 3),i,cmd);
   }
end
