#include <stdio.h>   /*  ******* conj.c  ***** */
#include <string.h>  /* jishoFail, conj, japcopy, conj2, conj3, conj4 */
#include <ctype.h>   /* setsubiGo, conjDflt, proper, umeJukugo */
/* #include <process.h> */    /* for MS-C && TURBO C++  */
/*    #include <stdlib.h>   ;  for Lattice C      */
   /* umeck, umeCode, pronounCk, tailConj, jukugoLook */
#include "jehonfnc.h" /* jukugoConj, preConj, tanshuku_kei, prop_recover */
		/* Ohmoji, irregVerb, wordQuest, wdTeisei, jukuInput, yakInput */

#define  KATUYOU

#include "macro.h"


static int  preConj(void);
static void japcopy(char wdh[]);
static int  kahen_katsu(int ln, char jpwdq[], char wdw[]);
static int  sahen_katsu(int ln, char jpwdq[], char wdw[]);
static int  ichidan_katsu(int ln, char jpwdq[], char wdw[]);
static int  godan_katsu(char jpw[], char gobi[], int ln, char wdw[], char wdx[]);
static int  godan_miz_mei_kanyu(int i, int ln, char wdwq[], char jpwdq[]);
static int  desumasu_ck(int ln, char jpw[], char wdw[]);
static int  dearu_ck(char jpwdq[], int ln, char wdw[]);
static int  keiyo_katsuyo(char jpw[], char wdx[], char wdw[]);
static int  na_katsuyou(int lnp, char jpw[], char wdx[], char wdw[]);
static int  i_katsuyou(int lnp, char jpw[], char wdw[]);
static int  kanji_kana_henkan(char jpw[], char wdw[]);
static int  umeck(char wdw[], char jpa[], char jpb[], char *ps, int l0, int *j2);
static int  shpSentCk(char shpSent[]);
static int  umeCode(char z, char shpSent[]);
static void wordQuest(char wdh[], char wdp[], char wdx[]);
static void wdTeisei(int ln, char wdh[]);
static void jukuInput(char wdp[], char wdh[]);
static void yakInput(char wdx[]);

#include "honyavar.h"


void  jishoFail(char wdx[], char wdh[], char wdp[], char wdw[], char kf)
                                           /* 辞書引きが失敗した時の処理 */
begin        /* global variables: caj[], caz[], conj_chr, jps[], jwd[], cnb */
   int jr;

   if (caj[0][0] && ((conj_chr == 'p') || (conj_chr == 'G')))
      strcpy(wdx,wdp);
        /* 過去(p)または進行形(G)に活用していれば最長候補(wdx[])に採用する。*/
   else {
   _  conj1(wdp,wdh); /* 活用語（日本語）の変化形を作る。*/
   _  if (! conj_chr) {
   _  _  if ((kf == 'F') || (kf == 'f')) {
   _  _  _  japcopy(wdh); /* 変化形が見つからず(! conj_chr)、ファイル入力の場合 */
   _  _  _  strcpy(wdx,jwd);  /* 日本語単語そのものを英訳語としてコピーする。*/
   _  _  _  strcpy(wdw,wdh);
   _  _  _  if (instr(wdw,jwd) != 1) {
   _  _  _  _  jr = instrc(wdw,' ');
   _  _  _  _  left(jwd,wdw,jr - 1);
   _  _  _  }
   _  _  _  if (caj[3][0] == '5')
   _  _  _     cnb = 3;
   _  _  _  else
   _  _  _     cnb = 2;
   _  _  }
   _  _  else {
	  /* *** キー入力の場合は辞書にない単語の情報を問い合わせる。　*** */
   _  _  _  wordQuest(wdh,wdp,wdx);
   _  _  _  strcpy(wdw,wdh);
   _  _  }
   _  }
   }
end

void  conj1(char wdp[], char wdh[])
            /* 辞書に無い単語を先頭１文字だけにして再度辞書引きをしてみる。 */
            /* UNIX では conj は予約語 (複素共役) */
begin   /* global variables: wc, jwd[], conj_chr, aj[][][], az[][][] */
   register int  i;
   int  ln, shite;
   char hcode, *pt_bar, wdh_gobi[5];

   if (preConj()) {
   _  if ((strcmp(jwd,"は") == 0) && (wc >= 0)) {
   _  _  hcode = aj[wc][0][0];     /* 日本語の単語が「は」だけの場合 */
   _  _  if (strchr("1267",hcode)) {
   _  _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  _  if (! aj[wc][i][0])
   _  _  _  _     break;
   _  _  _  _  strcat(az[wc][i],jwd);
   _  _  _  }
   _  _  _  strcpy(caj[0],"S");
   _  _  _  conj_chr = 'S';
   _  _  }    /* 主題提示の「は」は、品詞コード'S'を付けておく。*/
   _  }
   _  else {
   _  _  if ((strcmp(jwd,"して") == 0) && (wdh + 4 == strstr(wdh,"い"))) {
   _  _  _  shite = 0;
   _  _  _  pt_bar = strchr(az[wc][0],'|');
   _  _  _  if (pt_bar && strstr(pt_bar,"OJ"))
   _  _  _     shite = 1;
   _  _  _  else {
   _  _  _  _  if (aj[wc][0][0] == '6')
   _  _  _  _     shite = 1;
   _  _  _  _  else {
   _  _  _  _  _  ptcpy(wdh_gobi,wdh + 6,wdh + 10);
   _  _  _  _  _  if (strstr("ます,ませ,た。,たか,たけ,たで,たの,たん,る。,るが,るけ,るで,るの,るん",wdh_gobi))
   _  _  _  _  _     shite = 1;
   _  _  _  _  }
   _  _  _  }
   _  _  _  if (shite) {
   _  _  _  _  strcpy(jwd,"する"); /* 「して」を「する」（原形）に復元する。*/
   _  _  _  _  conj_chr = 'D';
   _  _  _  _  strcpy(wdp,"して");
   _  _  _  }
   _  _  }
   _  _  else
   _  _     conj_chr = '\0';
   _  }
   }
   ln = strlen(jwd);
   if ((ln == 4) && (! conj_chr)) {
   _  if (strcmp(jwd,"だか") == 0) {
   _  _  strcpy(wdp,"だ");
   _  _  strcpy(jwd,"である");
   _  _  conj_chr = 'v';
   _  }
   _  else {
   _  _  if (wdh == strstr(wdh,"きた。")) {
   _  _  _  ptreplace(wdh,2,"くる");
   _  _  _  strcpy(jwd,"くる"); /* 「くる」の過去形「きた」に対応した。 */
   _  _  _  strcpy(wdp,"くる"); /* 2001.04.15 */
   _  _  _  conj_chr = 'p';
   _  _  }
   _  _  else {
   _  _  _  *(jwd + 2) = '\0';
   _  _  _  conj_chr = '1'; /* 全角２文字の辞書引きが失敗したら、前の方の１文字 */
			  /* だけにして、conj_chr = '1' と置いて、辞書の引き直し */
   _  _  }
   _  }
   }
   else {
   _  if (conj_chr == '1')
   _     conj_chr = '\0';
   }
end



static int  preConj(void)
                    /* 辞書に無い単語のプレ活用チェック */
begin               /* global var: jwd[], conj_chr */
   int ln, ct;

   ct = 1;
   ln = strlen(jwd);
   if ((ln > 3) && ((strcmp(jwd + ln - 2,"。") == 0) || (strcmp(jwd + ln - 2,"、") == 0))) {
   _  *(jwd + ln - 2) = '\0';
   _  conj_chr = '0';  /* もしも末尾が「。」か「、」なら、それを削除して、*/
   _  ct = 0;                /*  conj_chr = '0' と置いて、辞書の引き直し */
   _  ln -= 2;
   }
   return(ct);
end



static void japcopy(char wdh[])
begin        /* どうしても不明な単語は、日本語そのものを訳語としてコピーする。 */
             /* ただし、キーボード入力の場合は、ユーザーに問い合わせる。*/
			 /* global variables: wc, az[][][] */
   int i;
   unsigned int  lnjwd;

   lnjwd = strlen(jwd);
   if ((wdh + lnjwd == strstr(wdh + lnjwd,"しい")) && strstr(az[wc][0],"SJは")) {
   _  ptcpy(jwd,wdh,wdh + lnjwd + 4);
   _  caj[0][0] = '5';      /* 未知語の形容詞「．．しい」に対応した。*/
   _  strcpy(caj[0] + 1,jwd);   /* 2000.09.18 */
   _  caj[1][0] = '\0';
   _  cnb = 0;
   }
   else {
   _  caj[0][0] = '1';
   _  caj[0][1] = '\0';
   _  strcpy(caz[0],"Y|");
   _  caj[1][0] = '3';
   _  caj[1][1] = '\0';
   _  strcpy(caz[1],"iY|");
   _  caj[2][0] = '6';
   _  caj[2][1] = '\0';
   _  strcpy(caz[2],"Y|");
   _  for (i = 0; i <= 2; i++) {
   _  _  strcat(caj[i],jwd);
   _  }
   }
end


int  jkatsuyou(char hinshi, char jpw[], char wdx[], char wdw[])
                                    /* 日本語用言の活用形をためす。*/
begin   /* global variables: conj_chr */
   int  yn = 0, ln, try = 0;
   char gobi[9], jpwdq[JWordLen];

   ln = strlen(jpw);
   if (strchr("34",hinshi) && strcmp(jpw + ln - 2,"い")) 
      try = 1;
   else {
   _  if ((hinshi == 'X') && (ln >= 8) && (strcmp(jpw + ln - 6,"である") == 0))
   _     try = 1;
   _  else{
   _  _  if ((hinshi == '6') && (strcmp(jpw,"過ぎる") == 0))
   _  _     try = 1;
   _  }
   }
   if ( try == 1) {
   _  strcpy(jpwdq,jpw); /* 動詞、助動詞の活用形から原形復元を試みる。*/
   _  yn = kahen_katsu(ln,jpwdq,wdw);
			     /* カ変動詞(「くる」「きます」)の活用形 */
   _  if ((! yn) && (ln >= 4))
   _     yn = sahen_katsu(ln,jpwdq,wdw);
			     /* サ変動詞(「する」「します」)の活用形 */
   _  if ((! yn) && (ln >= 4))
   _     yn = ichidan_katsu(ln,jpwdq,wdw);       /* 上１段、下１段活用 */
   _  if (! yn) {
   _  _  if ( (strcmp(jpw,"はう") == 0) && (wdw == strstr(wdw,"はいちばん")) ) {
   _  _  _  yn = 0;   /* 追加した。 2004.07.14 */
   _  _  _  goto RTN;
   _  _  }
   _  _  else {
   _  _  _  strcpy(gobi,jpw + ln - 2);
   _  _  _  yn = godan_katsu(jpw,gobi,ln,wdw,wdx);
					   /* ５段活用の可能性を試す。*/
   _  _  }
   _  }
   _  if ((! yn) && (ln >= 8))
   _     yn = desumasu_ck(ln,jpw,wdw);
			     /* 「ですます」体を「である」体に戻す。  */
   _  if ((! yn) && (ln >= 10) && (strcmp(jpw + ln - 6,"である") == 0))
   _     yn = dearu_ck(jpwdq,ln,wdw);
		 /* 「である」の活用形の可能性をチェックする。*/
   }
   if (! yn) {
   _  if ( (hinshi == '5') || (strchr("34",hinshi) && ((strcmp(jpw + ln - 4,"ない") == 0) || (strcmp(jpw + ln - 4,"しい") == 0) || (strcmp(jpw + ln - 4,"多い") == 0))) )
      /* 「ほしい」などの場合に対処した。2002.05.05;  「（...が）多い」の場合も加えた。2002.11.16 */
   _     yn = keiyo_katsuyo(jpw,wdx,wdw);/* 日本語形容詞の活用の可能性を探る。 */
   _  else {
   _  _  if (hinshi == 'X') /* 漢字表示とかな表示の違いをチェックする*/
   _  _     yn = kanji_kana_henkan(jpw,wdw);
   _  _  else {
   _  _  _  if ( (ln > 7) && (strcmp(jpw + ln - 6,"ている") == 0) && (((wdw + ln - 6) == strstr(wdw + ln - 6,"てる")) || ((wdw + ln - 6) == strstr(wdw + ln - 6,"てます"))) ) {
   _  _  _  _  yn = 1;  /* "している" の口語表現 "してる" */
   _  _  _  _  ptinsert(wdw + ln - 4,"い");
   _  _  _  _  if ((wdw + ln - 4) == strstr(wdw + ln - 4,"います")) /* 追加した。2002.12.16 */
   _  _  _  _     conj_chr = 'r';
   _  _  _  }
   _  _  }
   _  }
   }
  RTN:;
   return(yn);
end

static int  sahen_katsu(int ln, char jpwdq[], char wdw[])
			     /* サ変動詞(「する」「します」)の活用形 */
begin  /* global variables: conj_chr  */
   int  yn = 0;
   char gobi[8];
   
   if (ln >= 6) {
   _  strcpy(gobi,jpwdq + ln - 6);
   _  if (strcmp(gobi,"します") == 0) {
   _  _  strcpy(jpwdq + ln - 4,"なければ");
   _  _  if (wdw == strstr(wdw,jpwdq)) {  /* サ変動詞「します」未然形 */
   _  _  _  yn = 1;
   _  _  _  ptinsert(wdw + ln - 4,"ます");
   _  _  _  conj_chr = 'm';
   _  _  }
   _  _  else {
   _  _  _  strcpy(jpwdq + ln - 4,"ましょう");
   _  _  _  if (wdw == strstr(wdw,jpwdq)) {  /* サ変動詞「します」連用形 */
   _  _  _  _  yn = 1;
   _  _  _  _  ptinsert(wdw + ln - 4,"ます");
   _  _  _  _  conj_chr = 'r';
   _  _  _  }
   _  _  }
   _  }
   _  ptcut(gobi,2);
   }
   else
     strcpy(gobi,jpwdq);
   if ((! yn) && (ln >= 4) && ((ln != 6) || strcmp(gobi,"ます"))) {
   _  if (strcmp(gobi,"する") == 0) {
   _  _  strcpy(jpwdq + ln - 4,"し");
   _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  yn = 1;
   _  _  _  if ((wdw + ln - 2) == strstr(wdw + ln - 2,"た")) {
   _  _  _  _  if ( ((wdw + ln - 2) == strstr(wdw + ln - 2,"たい")) || ((wdw + ln - 2) == strstr(wdw + ln - 2,"たく"))  || ((wdw + ln - 2) == strstr(wdw + ln - 2,"たかった"))) {
   _  _  _  _  _  ptreplace(wdw + ln - 4,2,"する"); /* 「したかった」 2005.01.13 */
   _  _  _  _  _  conj_chr = 'r';  /* 「したい」「したくない」 2004.01.21 */
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  ptreplace(wdw + ln - 4,4,"する");
   _  _  _  _  _  conj_chr = 'p';                /* サ変動詞「する」過去形 */
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  ptreplace(wdw + ln - 4,2,"する");
   _  _  _  _  conj_chr = 'r';                /* サ変動詞「する」連用形 */
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  strcpy(jpwdq + ln - 4,"せず"); /* サ変動詞「する」未然形 + 「ず」 */
   _  _  _  if (wdw == strstr(wdw,jpwdq)) {     /* 2001.02.11  追加した。*/
   _  _  _  _  yn = 1;
   _  _  _  _  ptreplace(wdw + ln - 4,2,"する");
   _  _  _  _  conj_chr = 'm';
   _  _  _  }
   _  _  _  else {
   _  _  _  _  strcpy(jpwdq + ln - 4,"され");
   _  _  _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  _  _  yn = 1;
   _  _  _  _  _  ptinsert(wdw + ln - 4,"する");
   _  _  _  _  _  conj_chr = '0';
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  strcpy(jpwdq + ln - 4,"でき");
   _  _  _  _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  _  _  _  yn = 1;
   _  _  _  _  _  _  ptinsert(wdw + ln - 4,"することが");
   _  _  _  _  _  _  conj_chr = '0';
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  else {
   _  _  if ((gobi == strstr(gobi,"し")) && ((wdw + ln - 2) == strstr(wdw + ln - 2,"ちゃった")) ) {
   _  _  _  ptreplace(wdw + ln - 2,4,"たてしま");
   _  _  _  conj_chr = 'D';  /* カ変動詞「しちゃった」 2001.04.04 */
   _  _  _  yn = 1;          /* 「したてしまった」に変換する。*/
   _  _  }
   _  }
   }
   return(yn);
end

static int  kahen_katsu(int ln, char jpwdq[], char wdw[])
                             /* カ変動詞(「くる」「きます」)の活用形 */
begin  /* global variables: conj_chr  */
   int  yn = 0;
   char gobi[8];
   
   if (ln >= 6) {
   _  strcpy(gobi,jpwdq + ln - 6);
   _  if (strcmp(gobi,"きます") == 0) {
   _  _  strcpy(jpwdq + ln - 6,"こなければ");
   _  _  if (wdw == strstr(wdw,jpwdq)) {  /* カ変動詞「きます」未然形 */
   _  _  _  yn = 1;
   _  _  _  ptinsert(wdw + ln - 6,"きます");
   _  _  _  conj_chr = 'm';
   _  _  }
   _  }
   _  ptcut(gobi,2);
   }
   else
     strcpy(gobi,jpwdq);
   if ((! yn) && (ln >= 4)) {
   _  if (strcmp(gobi,"くる") == 0) {
   _  _  strcpy(jpwdq + ln - 4,"き");
   _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  if ((wdw + ln - 2) == strstr(wdw + ln - 2,"た")) {
   _  _  _  _  ptreplace(wdw + ln - 4,4,"くる");
   _  _  _  _  conj_chr = 'p';                /* カ変動詞「くる」過去形 */
   _  _  _  _  yn = 1;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if ((wdw + ln - 2) == strstr(wdw + ln - 2,"て")) {
   _  _  _  _  _  ptreplace(wdw + ln - 4,2,"くる");
   _  _  _  _  _  conj_chr = 'r';                /* カ変動詞「くる」連用形 */
   _  _  _  _  _  yn = 1;
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if ((wdw + ln - 2) == strstr(wdw + ln - 2,"まし")) {
   _  _  _  _  _  _  ptreplace(wdw + ln - 4,2,"くる");
   _  _  _  _  _  _  conj_chr = 'r';  /* カ変動詞「きましょう」「きました」 2002.12.25 */
   _  _  _  _  _  _  yn = 1;
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  if ((wdw + ln - 2) == strstr(wdw + ln - 2,"ちゃった")) {
   _  _  _  _  _  _  _  ptreplace(wdw + ln - 4,6,"くるてしま");
   _  _  _  _  _  _  _  conj_chr = 'D';  /* カ変動詞「きちゃった」 2001.04.04 */
   _  _  _  _  _  _  _  yn = 1;          /* 「きてしまった」に変換する。*/
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(yn);
end


static int  ichidan_katsu(int ln, char jpwdq[], char wdw[])
                                        /* 上１段、下１段活用 */
begin   /* global variables: cnb, ksm[][], caz[][], pwd[], conj_chr */

   register int  i;
   unsigned int ln_jwd;
   int  yn = 0;
   char gobi[9], wdw_gobi[3], *pt_bar;

   strcpy(gobi,jpwdq + ln - 4);
   for (i = 0; i <= 31; i++) {
   _  if (strcmp(gobi,ksm[i]) == 0) {
   _  _  ptcpy(wdw_gobi,wdw + ln - 2,wdw + ln);
   _  _  if (cnb >= 0) {
   _  _  _  pt_bar = strchr(caz[cnb],'|');
   _  _  _  if ( strstr(pt_bar + 1,"r用1") && (strcmp(wdw_gobi,"て") == 0) ) {
   _  _  _  _  ptinsert(wdw + ln - 2,"る");  /* 「助けて」の場合に対応した。2002.09.08 */
   _  _  _  _  conj_chr = 'D';
   _  _  _  _  yn = 1;
   _  _  _  }
   _  _  _  ln_jwd = strlen(jwd);
   _  _  }
   _  _  if ( (cnb < 0) || (pt_bar && ((! strchr(pt_bar + 1,'r')) || ((jpwdq + ln_jwd) == strstr(jpwdq + ln_jwd,"を")))) ) {
   _  _  _  *(jpwdq + ln - 2) = '\0';  /* 上の最後の条件を加えた。「痛み」と「痛みを覚えた」 2005.01.24 */
		     /* 「着く（５段）」と「着る（上１段）」の混同をふせぐ。*/
   _  _  _  if ( (wdw == strstr(wdw,jpwdq)) && wc && (az[wc][0][0] == '#') && (az[wc][0][2] == '3') )
   _  _  _     yn = 1;
   _  _  _  if (strcmp(wdw,jpwdq) == 0) {
   _  _  _  _  conj_chr = 'r';
   _  _  _  _  yn = 1;
   _  _  _  }
   _  _  _  if ( (! yn) && (wdw == strstr(wdw,jpwdq)) && (! strstr("ゃゅょ",wdw_gobi)) && ((i != 11) || strcmp(wdw_gobi,"じ")) ) {
   _  _  _  _  yn = 1;
   _  _  _  _  if (strcmp(wdw_gobi,"た") == 0) {
   _  _  _  _  _  if ( ((wdw + ln) == strstr(wdw + ln,"り")) 
   || ((wdw + ln) == strstr(wdw + ln,"い")) || ((wdw + ln) == strstr(wdw + ln,"かった")) ) {
   _  _  _  _  _  _  ptinsert(wdw + ln - 2,"る");  /* 「見たい」の場合に対応した。2002.07.06 */
   _  _  _  _  _  _  conj_chr = 'D'; /* 「見たり」「聞いたり」。「見たかった」2005.01.13 */
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (((wdw + 4) != strstr(wdw + 4,"い")) || ((wdw + 2) == strstr(wdw + 2,"て"))) {
					  /* 過去形語尾「た」を原形語尾「る」に戻す。*/
   _  _  _  _  _  _  _  ptreplace(wdw + ln - 2,2,"る");
   _  _  _  _  _  _  _  conj_chr = 'p';
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  ptinsert(wdw + ln - 2,"る");
   _  _  _  _  _  _  _  conj_chr = 'r'; /* 上（下）１段動詞連用形 */
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if ((wdw + ln - 2) == strstr(wdw + ln - 2,"れば")) {
   _  _  _  _  _  _  ptreplace(wdw + ln - 2,2,"る");
   _  _  _  _  _  _  conj_chr = 'e'; /* 上（または下）１段動詞命令形 */
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (strstr("な、",wdw_gobi) || (strstr("てにまよら",wdw_gobi) && ((wdw + ln) != strstr(wdw + ln,"が"))) || ((strcmp(pwd,"お") == 0) && (strcmp(wdw_gobi,"し") == 0))) {
   _  _  _  _  _  _  _  if ( (strcmp(jpwdq,"おき") == 0) && strstr(az[wc][0],"rD") )
   _  _  _  _  _  _  _     yn = 0;
                                /* 「開けて」+「おきる／おく」+「ます」に対応した。2002.12.19 */
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  ptinsert(wdw + ln - 2,"る");
   _  _  _  _  _  _  _  _  conj_chr = 'r';  /* 上（または下）１段動詞連用形 */
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  if ((wdw + ln - 2) == strstr(wdw + ln - 2,"ちゃった")) {
   _  _  _  _  _  _  _  _  ptreplace(wdw + ln - 2,4,"るてしま");
   _  _  _  _  _  _  _  _  conj_chr = 'D';  /* 一段動詞「曲げちゃった」 2001.04.04 */
   _  _  _  _  _  _  _  _  yn = 1;          /* 「曲げてしまった」に変換する。*/
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  if ( ((wdw + ln - 2) == strstr(wdw + ln - 2,"過ぎ")) || ((wdw + ln - 2) == strstr(wdw + ln - 2,"そう")) || (strcmp(wdw_gobi,"始") == 0) || (strcmp(wdw_gobi,"終") == 0) ) {
   _  _  _  _  _  _  _  _  _  ptinsert(wdw + ln - 2,"る"); /* 「見過ぎる」=>「見」「過ぎる」  2001.05.06 挿入した。 */
   _  _  _  _  _  _  _  _  _  conj_chr = 'r';  /* 「見そう(だ)」=>「見」「そう(だ)」2001.05.25 挿入した。 */
   _  _  _  _  _  _  _  _  _  yn = 1; /* 「見始める」=>「見」「始める」、「見終わる」=>「見」「終わる」  2002.07.14 挿入した。*/
   _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _  _     yn = 0;
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  _  break;
   _  _  _  }
   _  _  }
   _  }
   }
   return(yn);
end


static int godan_katsu(char jpw[], char gobi[], int ln, char wdw[], char wdx[])
					/* ５段活用の可能性を試す。*/
begin
  /* global variables: cnb, shs[], rny[], onb[], kak[], mzn[], mei[], conj_chr */
   register int  i;
   int  yn = 0;
   unsigned int lnx, lnj;
   char jpwdq[JWordLen], wdxq[JWordLen], wdwq[JSentLen], jodoushi[5], au_ai[5];
   char *pt_bar;

   strcpy(jpwdq,jpw);
   strcpy(wdwq,wdw);
   if (cnb >= 0) {
   _  pt_bar = strchr(caz[cnb],'|');
   _  lnx = strlen(wdx);
   _  if (pt_bar && strchr(pt_bar + 1,'r')) {
   _  _  if ((strcmp(wdx + lnx - 2,"る") == 0) && (wdw == strstr(wdw,wdx)))
   _  _     ptcut(wdwq + lnx - 2,2);
   _  }
   _  else {
   _  _  if (pt_bar && strchr(pt_bar + 1,'D')) {
   _  _  _  strcpy(wdxq,wdx);  /* 「向かう」=>「向かっていななく」に対応した。2002.09.10 */
   _  _  _  *(wdxq + lnx - 2) = '\0';
   _  _  _  if ( (jpw == strstr(jpw,wdxq)) && (! strstr(jpw,wdx)) && (wdw == strstr(wdw,wdx)) ) {
   _  _  _  _  ptreplace(jpwdq,lnx + 2,wdx);
   _  _  _  _  lnj = strlen(jpwdq);
   _  _  _  _  *(jpwdq + lnj - 2) = '\0';
   _  _  _  _  if (strstr(wdw,jpwdq)) {
   _  _  _  _  _  strcpy(jpwdq,jpw);
   _  _  _  _  _  ptreplace(wdwq,lnj - 2,jpw);
   _  _  _  _  _  ptcut(wdwq + lnj,2);
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     strcpy(jpwdq,jpw);
   _  _  _  }
   _  _  }
   _  }
   }                 /* 「着く（５段）」と「着る（上１段）」の混同を防ぐ。*/
   for (i = 0; i <= 8; i++) {
   _  if (strcmp(gobi,shs[i]) == 0) {
   _  _  if ((i == 6) && (ln > 7) && (strcmp(jpw + ln - 6,"ている") == 0))
   _  _     break;
   _  _  if ((i == 1) && ((strcmp(jpw + ln - 4,"行く") == 0) || (strcmp(jpw + ln - 4,"いく") == 0)))
   _  _     strcpy(jpwdq + ln - 2,"って"); /* 「て」音便形の例外：「行く」*/
   _  _  else                 /* 「歩く」=>「歩いて」,「行く」=>「行って」*/
   _  _     strcpy(jpwdq + ln - 2,onb[i]);
   _  _  if ((i == 4) || (i == 5) || (i == 8)) {
   _  _  _  if ((wdwq + ln - 2) == strstr(wdwq + ln - 2,"んじゃった") )
   _  _  _     ptreplace(wdwq + ln,4,"でしま"); /* 「かむ」=> 「かんじゃった」 */
   _  _  }                                      /* 2001.04.04 挿入した。*/
   _  _  else {
   _  _  _  if ((wdwq + ln) == strstr(wdwq + ln,"ちゃった") )  /* 「咲く」=>「咲いちゃった」 */
   _  _  _     ptreplace(wdwq + ln,4,"てしま");
   _  _  }
   _  _  if (wdwq == strstr(wdwq,jpwdq)) {
   _  _  _  yn = 1;  /* 原文が「て」音便形の場合（第２属性'D'とする）*/
   _  _  _  if (i == 2) {
   _  _  _  _  ptreplace(wdwq + ln - 2,2,shs[i]); /* 'D' だったのを修正した。 */
   _  _  _  _  conj_chr = 'r'; /* 「さ」行だけが例外的に音便形が無い。2001.02.09 */
   _  _  _  }
   _  _  _  else {
   _  _  _  _  ptreplace(wdwq + ln - 2,4,shs[i]);
   _  _  _  _  conj_chr = 'D';
   _  _  _  }
   _  _  _  break;
   _  _  }
   _  _  else {
   _  _  _  if ((i == 1) && ((strcmp(jpw + ln - 4,"行く") == 0) || (strcmp(jpw + ln - 4,"いく") == 0)))
   _  _  _     strcpy(jpwdq + ln - 2,"った"); /* 「た」音便形の例外：「行く」*/
   _  _  _  else               /* 「歩く」=>「歩いた」,「行く」=>「行った」*/
   _  _  _     strcpy(jpwdq + ln - 2,kak[i]);
   _  _  _  if (wdwq == strstr(wdwq,jpwdq)) {
   _  _  _  _  yn = 1;
   _  _  _  _  ptcpy(jodoushi,wdwq + ln + 2,wdwq + ln + 4);
   _  _  _  _  if ( strstr("ら,り,い",jodoushi) || ((wdwq + ln) == strstr(wdwq + ln,"たかった")) ) { 
                      /* 「たい」の場合も加えた。2001.03.15 */
   _  _  _  _  _  ptreplace(wdwq + ln -2,2,shs[i]);    /* 「たかった」2005.01.13 */
   _  _  _  _  _  if ( (strcmp(jodoushi,"い") == 0) || (strcmp(jodoushi,"か") == 0)  )
   _  _  _  _  _     conj_chr = 'r';
   _  _  _  _  _  else
   _  _  _  _  _     conj_chr = 'D'; /*「たり」「だり」「たら」「だら」の場合は */
   _  _  _  _  }                  /*  第２属性を「D」とする。 */
   _  _  _  _  else {	 /* 原文が過去形の場合（第１属性'p'とする) */
   _  _  _  _  _  ptreplace(wdwq + ln - 2,4,shs[i]);
   _  _  _  _  _  conj_chr = 'p';
   _  _  _  _  }
   _  _  _  _  break;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  strcpy(jpwdq + ln - 2,rny[i]);
   _  _  _  _  if (wdwq == strstr(wdwq,jpwdq)) {
   _  _  _  _  _  yn = 1;
   _  _  _  _  _  if (strcmp(pwd,"おたがいに") == 0) { /* 「おたがいに助け合う」*/
   _  _  _  _  _  _  ptcpy(au_ai,wdwq + ln,wdwq + ln + 4);
   _  _  _  _  _  _  if (strstr("合わ合い合う合え合お合っ",au_ai)) {
   _  _  _  _  _  _  _  ptreplace(wdwq + ln - 2,6,jpw + ln - 2);
   _  _  _  _  _  _  _  conj_chr = 'r'; /* ここは未だ暫定処置。2000.12.07 */
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  ptreplace(wdwq + ln - 2,2,shs[i]);
   _  _  _  _  _  _  _  conj_chr = 'r'; /* 原文が連用形の場合（第２属性'r'とする）*/
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  ptreplace(wdwq + ln - 2,2,shs[i]);
   _  _  _  _  _  _  conj_chr = 'r'; /* 原文が連用形の場合（第２属性'r'とする）*/
   _  _  _  _  _  }
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     yn = godan_miz_mei_kanyu(i,ln,wdwq,jpwdq);
                       /* ５段活用「未然、命令、勧誘」語尾の処理 */
   _  _  _  }
   _  _  }
   _  }
   }
   if (yn)
      strcpy(wdw,wdwq);
   return(yn);
end


static int godan_miz_mei_kanyu(int i, int ln, char wdwq[], char jpwdq[])
          /* ５段活用「未然、命令、勧誘」語尾の処理 */
begin  /* global variables:  */
  /* global variables: cnb, shs[][], mzn[][], mei[][], kanyu[][], conj_chr */
   int  yn = 0;
   char jodoushi[5];
   char *pt_wdw;

   strcpy(jpwdq + ln - 2,mzn[i]);
   ptcpy(jodoushi,wdwq + ln,wdwq + ln + 2);
   if ((wdwq == strstr(wdwq,jpwdq)) && strstr("せなねずぬれ",jodoushi)) {
   _  yn = 1;    /* 原文が未然形の場合（第２属性'm'とする）*/
   _  ptreplace(wdwq + ln - 2,2,shs[i]);
   _  conj_chr = 'm';
   }
   else {
   _  strcpy(jpwdq + ln - 2,mei[i]);
   _  if (wdwq == strstr(wdwq,jpwdq)) {
   _  _  yn = 1; /* 原文が命令形の場合（第２属性'e'とする）*/
   _  _  pt_wdw = wdwq + ln - 4;
   _  _  if ( (pt_wdw == strstr(pt_wdw,"ません")) || (pt_wdw == strstr(pt_wdw,"ませ。")) )
   _  _     yn = 0;
   _  _  else {
   _  _  _  if ( (ln >= 6) && ((pt_wdw - 2) == strstr(pt_wdw - 2,"てくれた")) )
   _  _  _     yn = 0;
   _  _  _  else {
   _  _  _  _  if ((wdwq + ln) == strstr(wdwq + ln,"た。")) /* 「傾いた」と「傾けた」の混同を防ぐ。2002.10.27 */
   _  _  _  _     yn = 0;   /* ただし、これで「走れた。」「書けた。」なども排除されてしまう。*/
   _  _  _  }               /* 本当は、「止む/止める」「裂く/裂ける」などの自動詞・他動詞対のみ排除したい。*/
   _  _  }
   _  _  if (yn == 1) {
   _  _  _  ptreplace(pt_wdw + 2,2,shs[i]);
   _  _  _  conj_chr = 'e';
   _  _  }
   _  }
   _  else {
   _  _  strcpy(jpwdq + ln - 2,kanyu[i]);
   _  _  if (wdwq == strstr(wdwq,jpwdq)) {
   _  _  _  yn = 1;    /* 原文が勧誘形の場合（第２属性'u'とする）*/
   _  _  _  ptcpy(jodoushi,wdwq + ln + 2,wdwq + ln + 6);
   _  _  _  if ((strcmp(jodoushi,"とし") == 0) || (strcmp(jodoushi,"とす") == 0))
   _  _  _     ptreplace(wdwq + ln - 2,2,shs[i]);
   _  _  _  else
   _  _  _     ptreplace(wdwq + ln - 2,4,shs[i]);
   _  _  _  conj_chr = 'u';
   _  _  }
   _  }
   }
   return(yn);
end


static int  desumasu_ck(int ln, char jpw[], char wdw[])
			  /* 「ですます体」への変換 */
begin
   int  yn = 0;
   char gobi[9], jpwdq[JWordLen];

   strcpy(jpwdq,jpw);
   strcpy(gobi, jpw + ln - 6);
   if (strcmp(gobi,"である") == 0) {
	   /* 日本語原文が「...です」なら「...である」に変換する。*/
   _  strcpy(jpwdq + ln - 4,"す");
   _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  yn = 1;
   _  _  ptreplace(wdw + ln - 4, 2,"ある");
   _  }
   _  else {
   _  _  strcpy(jpwdq + ln - 4,"した"); /* 日本語原文が「．．．でした」 */
   _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  yn = 1;
   _  _  _  conj_chr = 'p';
   _  _  _  ptreplace(wdw + ln - 4, 4,"ある");
   _  _  }
   _  }
   _  if (! yn) {
   _  _  strcpy(jpwdq + ln - 6,"だ");
   _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  yn = 1;
   _  _  _  if ((wdw + ln - 4) == strstr(wdw + ln - 4,"った")) {
   _  _  _  _  conj_chr = 'p';
   _  _  _  _  if ((wdw + ln) == strstr(wdw + ln,"ら"))
   _  _  _  _     ptreplace(wdw + ln - 6, 4,"である");
   _  _  _  _  else
   _  _  _  _     ptreplace(wdw + ln - 6, 6,"である");
   _  _  _  }
   _  _  _  else
   _  _  _     ptreplace(wdw + ln - 6, 2,"である");
   _  _  }
   _  _  else {
   _  _  _  strcpy(jpwdq + ln - 6,"ね");  /* 女性の話し言葉 */
   _  _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  _  yn = 1;
   _  _  _  _  ptreplace(wdw + ln - 6, 2,"である");
   _  _  _  }
   _  _  }
   _  }
   }
   else {
   _  if (ln >= 10) {
   _  _  strcpy(gobi,jpw + ln - 8);
   _  _  if (strcmp(gobi,"ではない") == 0) {
      /* 日本語原文が「...ではありません」なら「...ではない」に変換する。*/
   _  _  _  strcpy(jpwdq + ln - 4,"ありません");
   _  _  _  if (wdw == strstr(wdw,jpwdq)) {
   _  _  _  _  yn = 1;
   _  _  _  _  ptreplace(wdw + ln - 4, 10,"ない");
   _  _  _  }
   _  _  }
   _  }
   }
   return(yn);
end

static int  dearu_ck(char jpwdq[], int ln, char wdw[])
		 /* 「である」の活用形の可能性をチェックする。*/
begin  /* global variables: conj_chr  */
   int  yn = 0;
   char *pt_gobi;

   *(jpwdq + ln - 4) = '\0';
   if (wdw == strstr(wdw,jpwdq)) {
   _  pt_gobi = wdw + ln - 4;
   _  if (pt_gobi == strstr(pt_gobi,"、")) {
   _  _  yn = 1;
   _  _  conj_chr = 'r';
   _  _  ptinsert(wdw + ln - 4,"ある");
   _  }
   _  else {
   _  _  if ((pt_gobi == strstr(pt_gobi,"はありま")) || (pt_gobi == strstr(pt_gobi,"はな"))) {
   _  _  _  yn = 1;
   _  _  _  conj_chr = 'm';
   _  _  _  if (pt_gobi == strstr(pt_gobi,"はな"))
   _  _  _     ptreplace(pt_gobi,2,"ある");
   _  _  _  else 
   _  _  _     ptreplace(pt_gobi,6,"ある");
   _  _  }
   _  }
   }
   else
     strcat(jpwdq,"ある");
   return(yn);
end


static int  keiyo_katsuyo(char jpw[], char wdx[], char wdw[])
			    /* 日本語形容詞、形容動詞の活用の可能性を探る */
begin  /* global variable  conj_chr, jwd[] */
   unsigned int  lnp;
   int  yn = 0;
   char jpwq[JWordLen];

   lnp = strlen(jpw);
   if ((lnp >= 4) && (strcmp(jpw + lnp - 2,"な") == 0))
      yn = na_katsuyou(lnp,jpw,wdx,wdw);
		   /* 形容動詞（辞書登録語尾は「な」）の活用変化を吟味する。*/
   else {
   _  if ((lnp >= 4) && (strcmp(jpw + lnp - 2,"い") == 0))
		   /* 形容詞（辞書登録語尾は「い」）の活用変化を吟味する。*/
		 yn = i_katsuyou(lnp,jpw,wdw);
   _  else {
   _  _  if ((lnp >= 8) && ((strcmp(jpw + lnp - 6,"ている") == 0) || (strcmp(jpw + lnp - 6,"でいる") == 0))) {
   _  _  _  strcpy(jpwq,jpw);         /* 「生きている;5alive」などの例 */
   _  _  _  strcpy(jpwq + lnp - 2,"ます"); /* 「澄んでいる」などにも対応した。*/
   _  _  _  if (strstr(wdw,jpwq) == wdw) {   /* 2000.11.07 */
   _  _  _  _  yn = 1;
   _  _  _  _  ptreplace(wdw + lnp - 2,4,"る");
   _  _  _  }
   _  _  _  else {
   _  _  _  _  strcpy(jpwq + lnp - 4,"る"); /* 「混んでいる」=>「混んでる」の省略形に対応 */
   _  _  _  _  if (strstr(wdw,jpwq) == wdw) {   /* 2001.05.11 */
   _  _  _  _  _  yn = 1;
   _  _  _  _  _  ptinsert(wdw + lnp - 4,"い");
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if ((lnp >= 4) && (strcmp(jpw + lnp - 2,"の") == 0)) { /* 「架空の;5imaginary」などの例 */
   _  _  _  _  if ((cnb < 0) || ((caj[cnb][0] == '5') && (conj_chr == '0')) || ((caj[cnb][0] == '1') && (strlen(jwd) <= (lnp - 2)))) {
   _  _  _  _  _  strcpy(jpwq,jpw); /* 「病気;1disease」「病気の;5sick」に対応した。2000.12.17 */
   _  _  _  _  _  strcpy(jpwq + lnp - 2,"で"); /* 「活動;1activities」「活動中の;5active」にも対応した。2002.12.08 */
   _  _  _  _  _  if (strstr(wdw,jpwq) == wdw) {
   _  _  _  _  _  _  yn = 1;
   _  _  _  _  _  _  conj_chr = '0';
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  strcpy(jpwq + lnp - 2,"なの");   /* 2002.07.03 挿入した。*/
   _  _  _  _  _  _  if (strstr(wdw,jpwq) == wdw) { /* 「病気の」=>「病気なの」 */
   _  _  _  _  _  _  _  yn = 1;
   _  _  _  _  _  _  _  conj_chr = '0';
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  strcpy(jpwq + lnp - 2,"か");   /* 2001.04.09 挿入した。*/
   _  _  _  _  _  _  _  if (strstr(wdw,jpwq) == wdw) { /* 「本当の」=>「本当かしら」 */
   _  _  _  _  _  _  _  _  yn = 1;
   _  _  _  _  _  _  _  _  conj_chr = '0';
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  _  strcpy(jpwq + lnp - 2,"だ");   /* 2004.08.29 挿入した。*/
   _  _  _  _  _  _  _  _  if (strstr(wdw,jpwq) == wdw) { /* 「本当の」=>「本当だ（った）」 */
   _  _  _  _  _  _  _  _  _  yn = 1;
   _  _  _  _  _  _  _  _  _  conj_chr = '0';
   _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(yn);
end


static int  na_katsuyou(int lnp, char jpw[], char wdx[], char wdw[])
       /* 形容動詞（辞書登録語尾は「な」）の活用変化を吟味する。*/
begin   /* global variables:  cnb, conj_chr */
   int  yn = 0, check = 0;
   char jpw_root[JWordLen], jpwq[JWordLen];

   ptcpy(jpw_root,jpw,jpw + lnp - 2);
   if ( (cnb < 0) || strstr(wdw,jpw) || strstr(jpw,"くて") || (strcmp(wdx,jpw) == 0) )
      check = 1;
   if ( (! check) && strstr(jpw_root,wdx) ) {/* strcmp(jpw_root,wdx) == 0 の条件を strstr(pw_root,wdx) に改めた。*/
   _  if  (wdw + lnp - 2 == strstr(wdw + lnp - 2,"で"))         /* （最長一致法） 2002.09.23 */
   _     check = 1;
   _  if ( (! check) && (wdw + lnp - 2 == strstr(wdw + lnp - 2,"だ")) )
   _     check = 1;
   _  if ( (! check) && (wdw + lnp - 2 == strstr(wdw + lnp - 2,"とは")) )
   _     check = 1;
   _  if ( (! check) && (wdw + lnp - 2 == strstr(wdw + lnp - 2,"にな")) )
   _     check =1;
   }
   if ( (check == 1) && (strstr(wdw,jpw_root) == wdw) ) {
		 /*原文(wdw)と辞書見出し語の語幹部分(jpw_root)を比較する。*/
   _  yn = 1;
   _  if ((wdw + lnp - 2) == strstr(wdw + lnp - 2,"に"))
   _     conj_chr = 'r'; /* 原文中の単語の語尾が「に」なら連用形（'r'）*/
   _  else {
   _  _  strcpy(jpwq,jpw_root);
   _  _  strcpy(jpwq + lnp - 2,"だった");
   _  _  if (strstr(wdw,jpwq) == wdw) {
   _  _  _      /* 原文中の単語の語尾が「(な)だった」ならゼロ語尾(conj_chr='0')とする。*/
   _  _  _  conj_chr = '0';             /* 2001.05.07 修正した。*/
   _  _  _  ptinsert(wdw + lnp - 2,"な");
   _  _  }
   _  _  else {
   _  _  _  strcpy(jpwq + lnp - 2,"でした");
   _  _  _  if (strstr(wdw,jpwq) == wdw) {
   _  _  _      /* 原文中の単語の語尾が「(な)でした」ならゼロ語尾(conj_chr='0')とする。*/
   _  _  _  _  conj_chr = '0';             /* 2002.09.23 追加した。*/
   _  _  _  _  ptinsert(wdw + lnp - 2,"な");
   _  _  _  }
   _  _  _  else {
   _  _  _  _  conj_chr = '0';  /* ゼロ語尾の場合は conj_chr の値を '0' とする。*/
   _  _  _  _  strcpy(jpwq + lnp - 2,"だ"); 
   _  _  _  _  if (strstr(wdw,jpwq) == wdw)
   _  _  _  _     ptreplace(wdw + lnp - 2,2,"である");
   _  _  _  }
   _  _  }
   _  }
   }
   return(yn);
end


static int  i_katsuyou(int lnp, char jpw[], char wdw[])
		         /* 形容詞（辞書登録語尾は「い」）の活用変化を吟味する。*/
begin /* global variables: conj_chr  */
   int  yn = 0;
   char jpwq[JWordLen], nxt_gobi[3];

   ptcpy(jpwq,jpw,jpw + lnp - 2);
   strcat(jpwq,"く"); /* 原文中の単語の語尾が「く」なら連用形（'r'）*/
   if (strstr(wdw,jpwq) == wdw) {
   _  yn = 1;
   _  conj_chr = 'r'; /* 連用形の場合は conj_chr の値を 'r' とする。*/
   }
   else {
   _  strcpy(jpwq + lnp - 2,"かった");
   _  if (strstr(wdw,jpwq) == wdw) {
   _  _  yn = 1; /* 原文中の単語の語尾が「かった」なら過去形（'p'）　*/
   _  _  if ((wdw + lnp) == strstr(wdw + lnp,"ったら"))
   _  _     ptreplace(wdw + lnp - 2,4,"い"); /* 「たら」に対応した。2004.09.05 */
   _  _  else {
   _  _  _  ptreplace(wdw + lnp - 2,6,"い");
   _  _  _  conj_chr = 'p'; /* 過去形の場合は conj_chr の値を 'p' とする。*/
   _  _  }
   _  }
   _  else {
   _  _  strcpy(jpwq + lnp - 2,"そう");
   _  _  if (strstr(wdw,jpwq) == wdw) {
   _  _  _  ptcpy(nxt_gobi,wdw + lnp + 2,wdw + lnp + 4);
   _  _  _  if (strstr("だでなにねよ",nxt_gobi)) {
   _  _  _  _  yn = 1; /* 原文中の単語の語尾が「そう」なら　*/
   _  _  _  _  conj_chr = '0'; /* conj_chr の値を '0'(ゼロ語尾）とする */
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if ((lnp > 6) && (strcmp(jpwq + lnp - 6,"いなそう") == 0)) { 
   _  _  _  _  strcpy(jpwq + lnp - 4,"ず、");
   _  _  _  _  if (strstr(wdw,jpwq) == wdw) {
   _  _  _  _  _  yn = 1; /* 「形式ばっていない」=>「形式ばっていず、」*/
   _  _  _  _  _  conj_chr = 'r'; /* conj_chr の値を 'r' とする。2001.02.11 */
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   if (! yn) {
   _  strcpy(jpwq + lnp - 2,"過ぎ");
   _  if (strstr(wdw,jpwq) == wdw) {
   _  _  yn = 1; /*             「高過ぎる」=>「高い」「過ぎる」*/
   _  _  conj_chr = '0'; /* conj_chr の値を '0' とする。2001.05.06 */
   _  }
   _  else {
   _  _  if (lnp > 5) {
   _  _  _  strcpy(jpwq + lnp - 4,"ません");
   _  _  _  if (strstr(wdw,jpwq) == wdw) {
   _  _  _  _  yn = 1; /* 「形式ばっていない」=>「形式ばっていません」*/
   _  _  _  _  conj_chr = 'k'; /* conj_chr の値を 'k' とする。2001.02.17 */
   _  _  _  }     /* 採用するときに「敬」にして属性に加える。2001.05.10 */
   _  _  }
   _  }
   }
   if (!yn) {
   _  if ( (lnp >= 10) && ((jpw + lnp - 8) == strstr(jpw + lnp - 8,"できない")) 
   && ((wdw + lnp - 8) == strstr(wdw + lnp - 8,"することができない")) ) {
   _  _  ptcut(wdw + lnp - 8,10); /* 辞書に、「..する」の後に「..できない」が */
   _  _  yn = 1;                  /* 登録されている場合に対応した。2004.08.15 */
   _  }
   }
   return(yn);
end


static int kanji_kana_henkan(char jpw[], char wdw[])
                                   /* 漢字表示とかな表示の違いをチェックする*/
begin
   int  lnjp, yn = 0;
   char jpw_root[JWordLen], *pt_kudasai;
   
   lnjp = strlen(jpw);
   if ((lnjp > 8) && (strcmp(jpw + lnjp - 6,"下さい") == 0)) {
   _  ptcpy(jpw_root,jpw,jpw + lnjp - 6);
   _  pt_kudasai = wdw + lnjp - 6;
   _  if ((wdw == strstr(wdw,jpw_root)) && (pt_kudasai == strstr(pt_kudasai,"ください"))) {
   _  _  ptreplace(pt_kudasai,8,"下さい");
   _  _  yn = 1;
   _  }
   }
   return(yn);
end

int umeJukugo(char *pts, char jpw[], char wdw[])  /* 埋め込み型熟語の処理 */
begin  /* global variables: conj_chr , ksm[][], kanyu[][] */
   register int i;
   int j2, yn, ln2, conjType = 5;
   char jp1[WordLen], jp2[WordLen], jp2q[WordLen], jp3[40], *ps2, *pt2;
   char jp2_tail[3], jp2_tail2[5], jodoushi[5], katsuyo_gobi[3], katsuyo_gobi2[5];

   ptcpy(jp1,jpw,pts);    /*  jpw の中で # より前の部分 = jp1  */
   if (isdigit(*(pts + 1)))
      strcpy(jp2,pts + 2);    /*  jpw の中で # より後ろの部分 = jp2  */
   else
      strcpy(jp2,pts + 1);
   if (wdw != strstr(wdw,jp1))
      yn = 0;
   else {
   _  ps2 = strchr(jp2,'#');
   _  if (ps2) {
   _  _  if (isdigit(*(ps2 + 1)))
   _  _     strcpy(jp3,ps2 + 2);
   _  _  else
   _  _     strcpy(jp3,ps2 + 1);
   _  _  *ps2 = '\0';
   _  }
   _  yn = umeck(wdw,jp1,jp2,pts,1,&j2);
   _  if (yn && ps2)
   _     yn = umeck(wdw,jp2,jp3,ps2,j2,&j2);
   _  if ((yn >= 5) && (! strstr(wdw,jp2))) {
   _  _  ln2 = strlen(jp2);  /* 活用している単語の埋め込み文の処理 */
   _  _  strcpy(jp2q,jp2);
   _  _  if (strcmp(jp2 + ln2 - 4,"する") == 0)
   _  _     conjType = 3;  /* 活用タイプは「さ変」動詞  2005.06.02 */
   _  _  if (conjType == 3)
   _  _     *(jp2q + ln2 - 4) = '\0';
   _  _  else
   _  _     *(jp2q + ln2 - 2) = '\0';
   _  _  pt2 = strstr(wdw,jp2q);
   _  _  if (pt2) {
   _  _  _  if (conjType == 3)
   _  _  _     strcpy(jp2_tail2,"する");
   _  _  _  else {
   _  _  _  _  strcpy(jp2_tail,jp2 + ln2 - 2);
   _  _  _  _  if (strcmp(jp2_tail,"る") == 0) {
   _  _  _  _  _  strcpy(jp2_tail2,jp2 + ln2 - 4);
   _  _  _  _  _  for (i = 0; i <= 31; i++) {  /* １段活用か５段活用か判定する */
   _  _  _  _  _  _  if (strcmp(jp2_tail2,ksm[i]) == 0) {
   _  _  _  _  _  _  _  conjType = 1;
   _  _  _  _  _  _  _  break;
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
    /* 以下は、上下１段動詞と５段動詞では、１つずれる。*/
   _  _  _  if (conjType == 5)
   _  _  _     ptcpy(jodoushi,pt2 + ln2,pt2 + ln2 + 2);
   _  _  _  else
   _  _  _     ptcpy(jodoushi,pt2 + ln2 - 2,pt2 + ln2);
   _  _  _  if (strcmp(jodoushi,"ま") == 0)   /* 連用形の処理 */
   _  _  _     conj_chr = 'r';
   _  _  _  else {
   _  _  _  _  if (strcmp(jodoushi,"な") == 0)
   _  _  _  _     conj_chr = 'm';              /* 未然形の処理 */
   _  _  _  _  else {
   _  _  _  _  _  if (conjType == 5)
   _  _  _  _  _     ptcpy(katsuyo_gobi,pt2 + ln2 - 2,pt2 + ln2);
   _  _  _  _  _  else
   _  _  _  _  _     *katsuyo_gobi = '\0';
   _  _  _  _  _  if (strstr("ただてで",jodoushi)) {
   _  _  _  _  _  _  if ((conjType == 1) || (*katsuyo_gobi && strstr("いっしん",katsuyo_gobi)))
   _  _  _  _  _  _     conj_chr = 'D';
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (conjType == 1) {
   _  _  _  _  _  _  _  ptcpy(katsuyo_gobi2,pt2 + ln2 - 2,pt2 + ln2 + 2);
   _  _  _  _  _  _  _  if (strcmp(katsuyo_gobi2,"よう") == 0)
   _  _  _  _  _  _  _     conj_chr = 'u';
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else {
   _  _  _  _  _  _  _  if (conjType == 5) {
   _  _  _  _  _  _  _  _  ptcpy(katsuyo_gobi2,pt2 + ln2 - 2,pt2 + ln2 + 2);
   _  _  _  _  _  _  _  _  for (i = 0; i <= 8; i++) {
   _  _  _  _  _  _  _  _  _  if (strcmp(katsuyo_gobi2,kanyu[i]) == 0) {
   _  _  _  _  _  _  _  _  _  _  conj_chr = 'u';
   _  _  _  _  _  _  _  _  _  _  break;
   _  _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  _  if (conjType == 5) /* 五段活用 「歩いた」=>「歩くた」 */
   _  _  _     ptreplace(pt2 + ln2 - 2,2,jp2_tail);
   _  _  _  else {
   _  _  _  _  if (conjType == 3) /* サ変活用 「した」=>「するた」 2005.06.02 */
   _  _  _  _     ptreplace(pt2 + ln2 - 4,2,jp2_tail2);
   _  _  _  _  else
   _  _  _  _     ptinsert(pt2 + ln2 - 2,jp2_tail); /* 一段活用 「見た」=>「見るた」 */
   _  _  _  }
   _  _  }
   _  }
   }
   return(yn);
end

static int umeck(char wdw[], char jpa[], char jpb[], char *ps, int l0, int *j2)
begin                /* 埋め込み型熟語かどうかのチェック */
   int l1, ln, yn, jq;
   unsigned int ll;
   char z, shpSent[SentLen], j2q[WordLen];

   l1 = strlen(jpa) + l0;
   yn = 5;
   jq = 0;
   while (1) {
   _  *j2 = ninstr(l1,wdw,jpb); /* wdw の中の jp2 と一致する部分を探し直す。 */
   _  if ((*(ps + 1) != '1') && (*j2 == l1 + 1)) {
   _  _  yn = 0; /* 品詞コード指定があるのに wdw の中の # が空語であれば失格 */
   _  _  break;
   _  }
   _  ln = strlen(jpb);
   _  if (*j2) {
   _  _  ll = *j2 + ln;
   _  _  yn = 1;
   _  }
   _  else {
   _  _  if ((ln >= 4) && (ln <= WordLen)) {
   _  _  _  if (strcmp(jpb + ln - 4,"する") == 0) {
   _  _  _  _  ptcpy(j2q,jpb,jpb + ln - 4);
   _  _  _  _  if (! (*j2 = ninstr(l1,wdw,j2q)))
   _  _  _  _     yn = 0;
   _  _  _  _  else {
   _  _  _  _  _  if ((wdw + *j2 + ln - 5) == strstr(wdw + *j2 + ln - 5,"した"))
   _  _  _  _  _     conj_chr = 'p'; /* #熟語動詞が過去形に活用して出現した場合に対処した。2005.06.02 */
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  ptcpy(j2q,jpb,jpb + ln - 2);
   _  _  _  _  if (! (*j2 = ninstr(l1,wdw,j2q)))
   _  _  _  _     yn = 0;
   _  _  _  _  else {
   _  _  _  _  _  if ((wdw + *j2 + 1) == strstr(wdw + *j2 + 1,"かった"))
   _  _  _  _  _     conj_chr = 'p'; /* #熟語形容詞が過去形に活用して出現した場合に対処した。2005.04.10 */
   _  _  _  _  _  else {
   _  _  _  _  _  _  if ((wdw + *j2 + ln - 3) == strstr(wdw + *j2 + ln - 3,"かった"))
   _  _  _  _  _  _     conj_chr = 'p';
   _  _  _  _  _  }   /* #熟語が過去形に活用して出現した場合に対処した。(その２) 2005.04.23 */
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else
   _  _     yn = 0;
   _  }
   _  if (yn) {
   _  _  if (*j2 > l1)
   _  _     ptcpy(shpSent,wdw + l1 - 1,wdw + *j2 - 1);
   _  _  else {
   _  _  _  if ((yn > 1) && (*(ps + 1) != ' ') && ((*(ps + 1) != '1') || ((conj_chr != 'P') && (conj_chr != 'p')))) {
   _  _  _  _  yn = 0;
   _  _  _  _  break;
   _  _  _  } /* 品詞コード指定があるのに wdw の中の # が空語であれば失格 */
   _  _  _  else        /* ただし、埋め込み型動詞の受身形では、# の部分が */
   _  _  _     *shpSent = '\0';             /* 主語として前方に出ている。 */
   _  _  }
   _  _  yn *= shpSentCk(shpSent);
   _  }               /*   yn = 0; ==>   wdw の中に jpb が含まれていない */
   _  else
   _     yn = 0;
   _  if (yn < 4) {
   _  _  if ((! yn) && jq) {
   _  _  _  *j2 = jq;
   _  _  _  yn = 5;
   _  _  }
   _  _  break;
   _  }
   _  else {
   _  _  yn = 5;
   _  _  ll = *j2 + ln;
   _  _  if ((strlen(wdw) != ll - 1 || (ps > 0 && strcmp(jpa,jpb) != 0)) && wdw[ll - 1] != ' ') {
   _  _  _  l1 = ll;
   _  _  _  jq = *j2;
   _  _  }
   _  _  else
   _  _     break;
   _  }
   }
   if (yn && (*(ps + 1) != ' ') && *shpSent) {
   _  z = *(ps + 1);    /* 品詞コード指定が無ければ、合格として通過する。*/
   _  yn *= umeCode(z,shpSent); /* 指定された品詞コードのチェック */
   }
   return(yn);
end


static int  shpSentCk(char shpSent[])
begin
   int  yn;
   char *ptQ;

   yn = 1;
   if (strstr(shpSent,"、") || strstr(shpSent,"。") || strstr(shpSent,"？"))
      yn = 0;
   else {
   _  ptQ = strstr(shpSent,"”");
   _  if (ptQ && (! strstr(ptQ + 3,"”")))
   _     yn = 0;
   _  else {    /* 埋め込みの部分は１５文字以上有ってはいけない。*/
   _  _  if (strlen(shpSent) >= 30)
   _  _     yn = 0;
   _  }
   }
   return(yn);
end


static int umeCode(char z, char shpSent[])
begin                       /* 指定された品詞コードのチェック */
   int yn = 5;                  /* shpSent[] は埋め込まれる日本語単語。*/

   if (strchr("0123456789",z) && *shpSent && (z != '8'))
      yn = 1; /* 指定品詞コードが '8'（冠詞）以外の数字で、埋め込み候補が空でなければ、ここではいちおう合格としておく。*/
   else {
   _  if (z == 'G') {
   _  _  if (strstr(shpSent,"てい"))
   _  _     yn = 1; /* 指定品詞コードが 'G' の時は、埋め込み語 */
   _  _  else       /* が "てい" を含めば合格、そうでなければ失格 */
   _  _     yn = 0;
   _  }
   }
   return(yn);
end


static void wordQuest(char wdh[], char wdp[], char wdx[])
	    /* *****  辞書にない単語をユーザーに問い合わせる。**** */
begin       /* global variables: jps[], jwd[] */
   int ln, Ans;
   char dumr[SentLen];

   ln = strlen(jwd);
   strcpy(dumr,wdh + ln);
   printf("\n\n\n\n\n\n");
   printf("［原文］   %s \n",jps);
   printf("          [%s]  %s \n\n",jwd,dumr);
   printf("右の文字は辞書にありません。：   %s  \n",jwd);
   printf("\n 1. この文字の訳語を入力する。　2. この文字を訂正する。  3. 原文中の前後の文字からなる複数文字単語（熟語）にして、訳語を入力する。\n");
   *dumr = '\0';
   while ((*dumr != '1') && (*dumr != '2') && (*dumr != '3'))
      gets(dumr);
   Ans = *dumr - '0';
   switch(Ans) {
     case 2:
       wdTeisei(ln,wdh); /* 日本語単語の訂正を入力する。*/
       break;
     case 3:
       jukuInput(wdp,wdh);      /* 熟語にして、訳を入力する。*/
     case 1:
       yakInput(wdx);           /* 辞書に無い単語の訳語を入力する。*/
   }
end

static void wdTeisei(int ln, char wdh[])
			   /* 日本語単語の訂正を入力する。*/
begin                      /* global variables: jps[], jwd[] */
   char *pw, wdg[WordLen];

   *wdg = '\0';
   printf("日本語単語  =   ");
   while (! isalpha(*wdg))
      gets(wdg);
   pw = strstr(jps,jwd);
   if (pw)
      ptreplace(pw,ln,wdg);
   else
      ptreplace(jps,ln,wdg);
   ptreplace(wdh,ln,wdg);
   pw = strchr(wdg,' ');
   if (pw)
	  ptcpy(jwd,wdg,pw);
   else
      strcpy(jwd,wdg);
end


static void jukuInput(char wdp[], char wdh[])  /* 熟語にして、訳を入力する。*/
begin                     /* global variables: jwd[], wc, jwn[][] */
   register int i,j;
   char rq[WordLen];
   
   *wdp = '\0';
   printf("\n %s を含む原文中の熟語を入力して下さい。\n",jwd);
   while (! *wdp)
      gets(wdp);
   if (instr(wdh,wdp) == 1)
      strcpy(jwd,wdp);
   else {
   _  for (i = wc; i >= 0; i--) {
   _  _  if (instr(wdp,jwn[i]) == 1) {
   _  _  _  *rq = '\0';
   _  _  _  for (j = i; j <= wc; j++)
   _  _  _     strcat(rq,jwn[j]);
   _  _  _  break;
   _  _  }
   _  _  if (i == 0)
   _  _     printf("\n\n  入力された熟語が原文に合致しません。");
   _  }
   _  ptinsert(wdh,rq);
   _  wc = i - 1;
   _  strcpy(jwd,wdp);
   }
end

static void yakInput(char wdx[])     /* 辞書に無い単語の訳語を入力する。*/
begin                     /* global variables: caj[][], caz[][], cnb */
   char code, wda[JWordLen], *ptn;

   *wda = '\0';
   printf("\n  上の単語の訳語 = ");
   while (*wda == '\0')
	  gets(wda);
   printf("\n\n 上の英語の品詞コードは次の何番ですか？ \n");
   code = '\0';
   printf("\n 1 名詞。 2 代名詞。 3 動詞。 4 助動詞。 5 形容詞。 6 副詞。 7 前置詞。 8 冠詞。 9 接続詞。 X 間投詞。 \n");
   while ( (! isdigit(code)) && ( code != 'X'))
	  code = getchar();
   printf("\n\n  上の単語に属性が有れば入力して下さい。特に動詞は、自動詞なら j と、また他動詞なら i と入力して下さい。 \n");
   caz[0][0] = '\0';
   while (! caz[0][0]) {
   _  fgets(caz[0],ZokuLen,stdin);  /* <==  dummy command  */
   _  fgets(caz[0],ZokuLen,stdin);
   }
   ptn = strchr(caz[0],'\n');
   if (ptn)
	  *ptn = '\0';
   caj[0][0] = code;
   caj[0][1] = '\0';
   caj[1][0] = '\0';
   strcat(caj[0],wda);
   strcpy(wdx,jwd);
   cnb = 0;
end
