#include <stdio.h>     /* ******  jkakut.c ******  */
#include <string.h>  /* kakut, zkcCk, saiyou */
#include <ctype.h>  /* find_root, homoCk, banme, dollCk, dollSute */
		  /* arrowCk, herCk, yakAkitume, lyKakut, umeKakut, shpfgCk */
#include "jehonfnc.h" /* invar_vb, posses, nxtWd */
/* #include <process.h> */   /*           for MS-C & TURBO C++    */
/*         #include <stdlib.h>  ;   for Lattice C           */
/* #include <mbctype.h> */

#define USER

#include "macro.h"


static int  homoCk(char cac, char kd[], char wdw[], char wdx[]);
static int  find_root(char wdw[], char wdx[]);
static void compoWord(void);
static void godan_recover(char *ptyou, char wdw[], int lnx);
static void dollCk(char wdp[]);
static int  doll_hantei(char *dolzp, char *dolz1p, char wdp[], int pl, int wc1);
static int  dollSute(int pl, int ok, int wc1, char  *dolz1p, char z);
static void arrowCk(void);
static void arrow_sute(char *dolzp);
static void umeKakut(char kd[], char wdw[]);
static int  shpfgCk(char nbstr[]);
static void wdw_adjust(char k1[], char k2[], char k3[], char wdw[]);
static int  saiyou(char wdx[], char wdw[], char wdp[], char kd[]);
static int  mitourokugo_shori(void);
static void doushi_saiyou(int ln, char wdw[], char *ptzok);
static void nxtWd(int ln, char kd[], char wdw[], char wdh[], char wdp[]);
static void too_many_words(void);
static void wdh_renewal(int ln, char wdw[], char wdh[], char wdp[]);
static int  preSymbCk(int ln, char wdh[], char jwd1[]);
static void datta_shori(int ln, char wdh[],char jwd[]);
static void michigo_hankaku_shori(char jwd[], char wdh[]);
static int  shuushi_inyoufu_shori(char wdh[], char jwd[], char jwd1[]);
static void chouboin_shori(char wdh[], char jwd[]);
static void joshi_jodoushi_shori(char hcode, char jwd[], char jwd1[], char wdh[], char *pt2, int ln, char kd[], char wdw[]);
static void kakuj_shori(char jwd1[], char wdh[]);
static void masu_shori(char wdh[]);
static void deshita_shori(char wdh[]);
static void teonbi_shori(char jwd1[], char wdh[]);
static void te_iru_shori(char wdh[]);
int  is_katakana(char *jpwd);

#include "honyavar.h"


void  kakut(char wdp[], char wdx[], char wdw[], char wdh[])
                         /* 辞書で見つけた訳語を採用する手続き */
begin    /* global variables: caj[][], pwd[], wc, jwd[], conj_chr, SERR */
   int ln, lnx, lnw, skip = 0;
   char kd[WordLen], cac, wdx_2[WordLen];

   cac = caj[0][0];
   if (cac != '\0')  {
   _  skip = homoCk(cac,kd,wdw,wdx);   /* 同形異義語などのチェック */
   _  if ((conj_chr == '-') && (! skip)) {
   _  _  compoWord(); /* 複合語（属性'-'）の後半部の結合処理。*/
   _  _  ln = strlen(jwd);       /* 2000.09.15 */
   _  _  if (! *wdx)
   _  _     strcpy(wdx,jwd);
   _  _  strcpy(kd,caj[0] + 1);
   _  _  skip = 1;
   _  }
   /* *******  全角数字が連続している場合の処理 ********* */
   _  if (  (wc >= 0) && (az[wc][0] == strstr(az[wc][0],"n|全")) && (caz[0] == strstr(caz[0],"n|全"))) {
   _  _  strcat(aj[wc][0],caj[0] + 1);
   _  _  if (aj[wc][1][0]) {
   _  _  _  aj[wc][1][0] = '\0';
   _  _  _  if (aj[wc][2][0])
   _  _  _     aj[wc][2][0] = '\0';
   _  _  }
   _  _  strcat(jwn[wc],jwd);
   _  _  ln = strlen(jwd);       /* 2005.02.20 */
   _  _  if (! *wdx)
   _  _     strcpy(wdx,jwd);
   _  _  strcpy(kd,caj[0] + 1);
   _  _  skip = 1;
   _  }
   /* *******  単語の区切りの確定　******** */
		 /* 0<= skip <=2; skip = 1 が返されて来た時は、nxtWd() へ直行する。*/
   _  if (! skip) {
   _  _  wc++;
		   /* 現単語の辞書引きを終了し、原文からの切り出し語を確定する。*/
   _  _  lnw = strlen(jwd);
   _  _  lnx = strlen(wdx);
   _  _  if (lnw < lnx) {
   _  _  _  if (wdw == strstr(wdw,wdx))
   _  _  _     strcpy(jwd,wdx);
   _  _  _  else {
   _  _  _  _  strcpy(wdx_2,wdx);        
   _  _  _  _  wdx_2[lnx - 2] = '\0';
   _  _  _  _  if ( (strcmp(wdw,wdx_2) == 0) && (conj_chr == 'r') ) {
   _  _  _  _  _  strcpy(jwd,wdx_2); /* 埋め込み熟語に埋め込まれる最後の部分 */
   _  _  _  _  _  strcpy(kd,jwd);  /* 2005.06.02 */
   _  _  _  _  }
   _  _  _  _  if ((caj[cnb][0] == '5') && (conj_chr == '0')) {
   _  _  _  _  _  if (wdw == strstr(wdw,wdx_2)) {       /* 2000.12.18 */
   _  _  _  _  _  _  strcpy(jwd,wdx_2);   /* 形容詞のゼロ語尾に対処した。*/
   _  _  _  _  _  _  lnx -= 2;        /* 「病気の;5ill」と「病気;1disease」*/
   _  _  _  _  _  _  strcpy(kd,jwd);
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if ((lnx == 0) && (caj[0][0] == '6')) {
   _  _  _  _  ptcpy(wdx,wdw,wdw + lnw + 2);
   _  _  _  _  strcpy(jwd,wdx);
   _  _  _  _  strcpy(kd,jwd); /* 2001.05.24 挿入した。*/
   _  _  _  }/* 「..いで」語尾副詞の動詞訳語引き直しに失敗した。*/
   _  _  }
   _  _  if (wc >= 1) {
   _  _  _  if (aj[wc - 1][0][0] == '\0') {
   _  _  _  _  strcat(jwn[wc - 1]," ");
   _  _  _  _  ptinsert(jwn[wc],jwn[wc - 1]);
   _  _  _  _  jwn[wc - 1][0] = '\0';
   _  _  _  }
	    /* ひとつ前の単語が '$','<','#'を含む熟語の場合のチェック */
   _  _  _  dollCk(wdp);     /* 誤って '$' の熟語を採用した事が分かると、*/
   _  _  _  if (! SERR) /* SERR = 5 とセットされる。それ以外は SERR = 0 */
   _  _  _     arrowCk();
   _  _  _  else
   _  _  _     skip = 2;
   _  _  }
   _  _  if (! skip) {
   _  _  _  if (strchr(wdx,'#'))
   _  _  _     strcpy(kd,wdx);
   _  _  _  else {
   _  _  _  _  if (*wdx && (strstr(wdw,wdx) == wdw))
   _  _  _  _     strcpy(kd,wdx);
   _  _  _  _  else {
   _  _  _  _  _  if ((*wdp) && ((caj[0][0] != '5') || (! strstr(caz[0],"|r"))))
   _  _  _  _  _     strcpy(kd,wdp);
   _  _  _  _  _  else
   _  _  _  _  _     strcpy(kd,jwd);
   _  _  _  _  }
   _  _  _  }
   _  _  _  umeKakut(kd,wdw); /*埋め込み型熟語の確定処理*/
   _  _  _  if (SERR == 5)       /* 失敗すると、SERR = 5 にセットされ、*/
   _  _  _     skip = 2;                        /* バックトラックする。*/
   _  _  }
   _  }
   _  if ((skip == 1) && strchr("0?!",cac)) {
	     /* 辞書引き単語が終止符号「、」「。」「？」「！」だった場合 */
   _  _  wc++;
   _  _  strcpy(kd,jwd);
   _  _  skip = 0;
   _  }
   _  if (! skip)
   _     ln = saiyou(wdx,wdw,wdp,kd);     /*  訳語を採用する。 */
   _  if (cac == 'S')
   _     ln = 2;
   _  if (skip < 2)      /* 原文から次に辞書引きをする単語を切り出す。*/
   _     nxtWd(ln,kd,wdw,wdh,wdp);
   }
end

static int  homoCk(char cac, char kd[], char wdw[], char wdx[])
								  /* 同形異義語などのチェック */
begin            /* global varibables: jwd[], conj_chr, caz[][][] */
   int  homo, skip = 0;
   char *pt2;

   if (! strchr(caz[0],conj_chr))
	  conj_chr = '\0';
   pt2 = strchr(caz[0],'|');
   if (pt2 && strchr(pt2 + 1,'0') && (! conj_chr))
	  conj_chr = '0';
   if (! strchr("0?!",cac)) {
   _  if (cac == 'S') {  /* 主題提示の「は」は品詞コード'S'となっている。*/
   _  _  strcpy(kd,jwd);
   _  _  skip = 1;
   _  }
   _  if (strchr("13569",cac)) {
   _  _  if ((! conj_chr) || (! strchr("GhHlK",conj_chr))) {
		  /* 辞書の引き直しをしていない時は  conj_chr = '\0'　と、なっている */
   _  _  _  homo = find_root(wdw,wdx);
			 /* 同義語が有る時は、homo = 1 にセットされ、再度辞書引きを行う。*/
				  /* *homo = 1 :  動詞からの連用形派生名詞(第２属性 = 用)や、*/
				   /* 副詞（広く）と形容詞連用形（広く）＋「て」の混同など。 */
   _  _  _  if (homo == 1) {       /* homo == 1 => 同形異義語 */
   _  _  _  _  *wdx = '\0';         /* homo == 0 => otherwise  */
   _  _  _  _  homo = 0;
   _  _  _  _  skip = 2;   /* skip == 2 なら、関数末尾まで直行する。*/
   _  _  _  }  /*  skip == 0 なら、途中の全ての処理を行う。*/
   _  _  }
   _  }
   }
   else
	  skip = 1;
   return(skip);
end


static int find_root(char wdw[], char wdx[])  /* 動詞からの派生名詞、など */
begin         /* global variables; cnb, caj[][], caz[][], jwd[], conj_chr */
   int ln, lnx, homo = 0, i, j;
   char *ptln, *ptyou, nxt_wd[5] ,gobi[5];


   ln = strlen(jwd);
   lnx = strlen(wdx);    
   if (caj[0][0] == '6') {
   _  if ( (strcmp(jwd + ln - 2,"く") == 0) && ((ln + 2) > lnx) ) {
   _  _  strcpy(jwd + ln - 2,"い"); /* 最長一致法を守る為、第２の条件を入れた。2002.09.21 */
   _  _  homo = 1;             /* 日本語形容詞の連用形と副詞の混同 '広く' */
   _  _  conj_chr = 'r';
   _  }
   _  else {
   _  _  if ((lnx > 5) && (! strchr(caz[0],'q'))) {
   _  _  _  strcpy(gobi,wdx + lnx - 4);
   _  _  _  for (i = 0; i <= 8; i++) {
   _  _  _  _  if (strcmp(gobi,onb[i]) == 0) {
   _  _  _  _  _  ptln = strchr(caz[cnb],'|');
   _  _  _  _  _  if (ptln)
   _  _  _  _  _     ptyou = strstr(ptln + 1,"用");
   _  _  _  _  _  if ( ptln && ptyou && *(ptyou + 1) ) {
   _  _  _  _  _  _  if ((ptyou + 2) != strstr(ptyou + 2,shs[i]))   /* 2005.01.25 */
   _  _  _  _  _  _     goto NEXT_i; /* 同じ「って」語尾から異なる終止語尾が得られることに対応した。*/
   _  _  _  _  _  }
   _  _  _  _  _  strcpy(jwd,wdx);
   _  _  _  _  _  strcpy(jwd + lnx - 4,shs[i]);
   _  _  _  _  _  if (strcmp(jwd,wdx) > 0) {   /* 辞書の２重引きを防ぐ条件を付けた。2002.09.10 */
   _  _  _  _  _  _  homo = 1; /* 「急いで」=>副詞と動詞の「て」音便形 */
   _  _  _  _  _  _  conj_chr = 'D';  /* 2001.05.24 挿入した。*/
   _  _  _  _  _  }
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  _ NEXT_i:;
   _  _  _  }
   _  _  }
   _  }  
   }
   else {
   _  ptln = strchr(caz[0],'|');
   _  if (ptln)
   _     ptyou = strstr(ptln + 1,"用");
   _  if ((caj[0][0] == '1') && ptln && ptyou) {
					   /* 動詞の連用形が名詞として辞書引きされた場合 */
   _  _                              /* 傾き,輝き,焦り,笑い, .... 等 */
   _  _  ptcpy(nxt_wd,wdw + lnx,wdw + lnx + 4);
				 /* nxt_wd[] は原文中で次に続く部分*/
   _  _  if (strstr("ます,ませ,まし,てい,た。,て、,なさ,たい,合う",nxt_wd)) {
   _  _  _  if (*(ptyou + 2) == '5')/* 第２属性の「用5」は「5段連用」*/
   _  _  _     godan_recover(ptyou,wdw,lnx);
		/* 原文 wdw[]、切り出し語 jwd[] の連用形部分を終止形に変換する。*/
   _  _  _  else {
   _  _  _  _  if (*(ptyou + 2) == '1') { /* 第２属性の「用1」は */
   _  _  _  _  _  strcat(jwd,"る");         /* 上（下）１段動詞 */
   _  _  _  _  _  ptinsert(wdw + lnx,"る");
   _  _  _  _  }
   _  _  _  _  else { /* 2000.10.09 補足した。*/
   _  _  _  _  _  printf("\n\n 辞書に動詞活用型が登録して有りません！！ \n");
   _  _  _  _  _  printf("     caj[0] = %s,  caz[0] = %s  \n\n",caj[0],caz[0]);
   _  _  _  _  _  exit(1);
   _  _  _  _  }
   _  _  _  }
   _  _  _  j = -1;    /* 直後が「ます」等なら動詞以外の訳語は捨てる。*/
   _  _  _  for (i = 0; i <= cnb; i++) {
   _  _  _  _  if (caj[i][0] == '3') {
   _  _  _  _  _  j++;
   _  _  _  _  _  strcpy(caj[j],caj[i]);
   _  _  _  _  _  strcpy(caz[j],caz[i]);
   _  _  _  _  }
   _  _  _  }
   _  _  _  cnb = j;
   _  _  _  caj[j + 1][0] = '\0';
   _  _  _  conj_chr = 'r';
   _  _  _  if (cnb < 0)
   _  _  _     homo = 1;
   _  _  }
   _  }
   }
   return(homo);
end


static void compoWord(void)  /* 複合語（属性'-'）の後半部の結合処理。*/
begin
/* global variables: aj[][][], az[][][], caj[][], caz[][], conj_chr, wc, cnb */
   register int i;
   char *ptbar, *ptbari, fst_zoku[ZokuLen], snd_zoku[ZokuLen];
   
   ptbar = strchr(caz[0],'|');
   if (ptbar && (caz[0] < ptbar))
      ptcpy(fst_zoku,caz[0],ptbar);
   else
      *fst_zoku = '\0';
   if (ptbar && *(ptbar + 1))
      strcpy(snd_zoku,ptbar + 1);
   else
      *snd_zoku = '\0';
   for (i = 0; i <= YakMaxCt; i++) {
   _  if (! aj[wc][i][0])
   _     break;
   _  strcat(aj[wc][i],caj[0] + 1);
   _  ptbari = strchr(az[wc][i],'|');
   _  if (ptbari) {
   _  _  if (*fst_zoku)
   _  _     ptinsert(ptbari,fst_zoku);
   _  _  if (*snd_zoku)
   _  _     strcat(az[wc][i],snd_zoku);
   _  }
   _  else
   _     strcat(az[wc][i],caz[0]);
   }
   strcat(jwn[wc],"−");
   strcat(jwn[wc],jwd);
end



static void godan_recover(char *ptyou, char wdw[], int lnx)
	    /* 原文 wdw[]、切り出し語 jwd[] の連用形部分を終止形に変換する。*/
begin  /* global variable: jwd[] */
   register int i;
   static char renyo_gobi[9][3] = {"い","き","ぎ","し","ち","に","び","み","り"},
	       shuu_gobi[9][3] = {"う","く","ぐ","す","つ","ぬ","ぶ","む","る"};
   char tail[3];

   if (*(ptyou + 3)) {
   _  ptcpy(tail,ptyou + 3,ptyou + 5);
   _  strcpy(jwd + lnx - 2,tail);
   _  ptreplace(wdw + lnx - 2,2,tail);
   }
   else {
   _  ptcpy(tail,wdw + lnx - 2,wdw + lnx);
   _  for (i = 0; i <= 8; i++) {
   _  _  if (strcmp(tail,renyo_gobi[i]) == 0) {
   _  _  _  strcpy(jwd + lnx - 2,shuu_gobi[i]);
   _  _  _  ptreplace(wdw + lnx - 2,2,shuu_gobi[i]);
   _  _  _  break;
   _  _  }
   _  _  else {
   _  _  _  if (strcmp(tail,shuu_gobi[i]) == 0)
   _  _  _     break;
   _  _  }
   _  _  if (i == 8) {
   _  _  _  beeping(2);
   _  _  _  color_green;
   _  _  _  printf("\n 派生名詞の連用形語尾が辞書登録されていません！！\n");
   _  _  _  color_white;
   _  _  _  exit(1);
   _  _  }
   _  }
   }
end


static void dollCk(char wdp[])
                           /* ひとつ左の単語が「$」指定の熟語の場合の処理 */
begin           /* global variables: ct, wc, cnb, az[][][], caj[][], conj_chr  */
    register int i;
	int wc1, pl = 0, ok = 0;
    char z, azd[ZokuLen], az1[ZokuLen], *dolp, *dolzp, *dolz1p;

    ct = 1;
    wc1 = wc - 1;
    strcpy(azd,az[wc1][0]);
    dolzp = strchr(azd,'$');
    strcpy(az1,az[wc1][1]);
    dolz1p = strchr(az1,'$');
    if ((dolzp && (! dolz1p) && aj[wc1][1][0]) || ((! dolzp) && dolz1p))
       pl = 1;  /* az[wc - 1][0] か az[wc - 1][1] のどちらか１方のみに '$' が含まれている時はpl = 1 */
    if (dolzp && dolz1p && aj[wc1][2][0] && (! strchr(az[wc1][2],'$')))
       pl = 2;    /* az[wc - 1][2] だけが '$' を含まなければ、 pl = 2 */
    if ((! dolzp) && dolz1p) {
    _  dolzp = dolz1p;
    _  strcpy(azd,az1);
    }
    if (dolzp && ((strlen(azd) == 3) || (strlen(azd) == 4)))
       ok = doll_hantei(dolzp,dolz1p,wdp,pl,wc1);
        /* $ 熟語かどうか判定する。 */
    if (ok < 2) {
    _  i = 1;
	_  for (i = 2; i <= YakMaxCt; i++) {
    _  _  if (! aj[wc1][i][0])
	_  _     break;
	_  _  dolp = strchr(az[wc1][i],'$');
	_  _  if (dolp) {
	_  _  _  z = *(dolp + 2);
    _  _  _  if (isdigit(z)) {
    _  _  _  _  if (z != aj[wc][0][0])
    _  _  _  _     aj[wc1][i][0] = '\0';
    _  _  _  }
    _  _  _  else {
    _  _  _  _  if (! strchr(caz[0],z))
    _  _  _  _     aj[wc1][i][0] = '\0';
    _  _  _  }
    _  _  }
    _  }
    }
end

static int  doll_hantei(char *dolzp, char *dolz1p, char wdp[], int pl, int wc1)
                                   /* $ 熟語かどうか判定する。 */
begin  /* global variables: cnb, caj[][] */

   unsigned int  ln;
   register int  i;
   int  ok = 0;
   char dums[5], z;
   
   z = *(dolzp + 2);
   if (z == 's') {    /*「$ 熟語」の結合は、適訳チェックを受けた後で、 */
   _  dums[0] = '\0';    /*    bunpcnd モジュールの bsymbck() で行う。 */
   _  ln = strlen(wdp);
   _  if (ln >= 4)
   _     strcpy(dums,wdp + ln - 4);
   _  if ((strcmp(dums,"self") == 0) || (strcmp(dums,"lves") == 0))
   _     ok = 2;
   }
   else {
   _  for (i = 0; i <= cnb; i++) {
   _  _  if (isdigit(z)) {  /* 埋め込まれる訳語の候補が属性指定を満足 */
   _  _  _  if (caj[i][0] == z)     /* すれば、 ok = 1 とセットする。*/
   _  _  _     ok = 1;
   _  _  _  else { 
   _  _  _  _  if ((z == '1') && (caj[i][0] == '2'))
   _  _  _  _     ok = 1; /* 1(名詞)指定の時は、2(代名詞)でもよい。*/
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if (((z == 'p') && (caj[i][0] == '8')) || (strchr("hnt",z) && strchr(caz[i],z)))
   _  _  _     ok = 1;
   _  _  _  else {
   _  _  _  _  if ((z == 'D') && (instrc(caz[i],'h') == 0))
   _  _  _  _     ok = 1;
   _  _  _  }
   _  _  }
   _  _  if ((! ok) && (! pl))
   _  _     caj[i][0] = '\0';
   _  }
   }
   if ((z != 's') || (! ok))
      ok = dollSute(pl,ok,wc1,dolz1p,z);
                    /* 属性指定を満たさない訳語候補を捨てる。 */
   return(ok);
end


static int  dollSute(int pl, int ok, int wc1, char  *dolz1p, char z)
  /* 「$」型熟語に埋め込まれる訳語候補の、属性指定を満たさないものを捨てる。*/
begin  /* global variables: aj[][][], az[][][], caj[][] */
   register int i;

    if ((pl == 2) && (ok == 0)) {
    _  for (i = 0; i <= YakMaxCt; i++) {
    _  _  strcpy(aj[wc1][i],aj[wc1][i + 2]);
    _  _  strcpy(az[wc1][i],az[wc1][i + 2]);
    _  _  if (! aj[wc1][i + 2][0])
    _  _     break;
    _  }
    _  ok = 2;
    }
    else {
    _  if ((pl == 0) && (z != 's'))
    _     yakAkitume();
    _  if ((caj[0][0] == '\0') || (ok == 0)) {
    _  _  if (pl == 0) {
    _  _  _  printf("$ の熟語ではなかった。en[wc - 1] = %s  aj[wc - 1][0] = %s \n",jwn[wc - 1],aj[wc - 1][0]);
    _  _  _  printf("辞書に新しい熟語の登録をして下さい！！\n");
    _  _  _  exit(1);
    _  _  }
    _  _  else {
    _  _  _  if (dolz1p)
    _  _  _     i = 1;
    _  _  _  else
    _  _  _     i = 0;
    _  _  _  do { /* $ の熟語候補 aj[wc1][??] を捨てて、空きを詰める。*/
    _  _  _  _  strcpy(aj[wc1][i],aj[wc1][i + 1]);
    _  _  _  _  strcpy(az[wc1][i],az[wc1][i + 1]);
    _  _  _  } while (aj[wc1][++i][0] != '\0');
    _  _  }
    _  }
    }
    return(ok);
end

static void arrowCk(void)     /* 左隣の単語を取り込む熟語「<」の処理 */
begin   /* global variables: wc, cnb, caj[][], caz[][], aj[][][], az[][][] */
   register int i;
   int chck = 1;
   char bzd[ZokuLen], *dolzp;

   ct = 1;
   *bzd = '\0';
   for (i = 0; i <= cnb; i++) {
   _  if (! caj[i][0]){
   _  _  chck = 0;
   _  _ break;
   _  }
   _  else {
   _  _  if (strchr(caz[i],'<')) {
   _  _  _  strcpy(bzd,caz[i]);
   _  _  _  break;
   _  _  }
   _  }
   }
   if (chck && *bzd && (! i)) {
   _  dolzp = strchr(bzd,'<');
   _  if (dolzp && (wc <= 0)) {
   _  _  printf("\n 取り込み型「<」 熟語エラー！！  熟語 = %s \n",caj[0]);
   _  _  exit(1);
   _  }
   _  if (dolzp && ((strlen(bzd) == 3) || (strlen(bzd) == 4)) && (caj[1][0] == '\0'))
   _     arrow_sute(dolzp);            /* < 熟語でない訳語を捨てる。*/
   }
end


static void arrow_sute(char *dolzp)
                         /* < 熟語でない訳語を捨てる。*/
begin  /* global variables: wc, aj[][][], az[][][] */

   register int  i;
   int  cnt;
   char z;
   
   z = *(dolzp + 2);
   for (i = 0; i <= YakMaxCt; i++) {
   _  if (aj[wc - 1][i][0] == '\0')
   _     break;
   _  switch (z) {         /* 属性指定に合致しない訳語候補は捨てる。*/
   _    case 't':;
   _    case 'n':;
   _    case 'h':
   _      if (! strchr(az[wc - 1][i],z))
   _         aj[wc - 1][i][0] = '\0';
   _      break;
   _    case 'p':
   _      if (aj[wc - 1][i][0] != '8')
   _         aj[wc - 1][i][0] = '\0';
   _      break;
   _    case 'D':
   _      if (strchr(az[wc - 1][i],'h'))
   _        aj[wc - 1][i][0] = '\0';
   _      break;
   _    default:
   _      if (isdigit(z)) {
   _      _  if (aj[wc - 1][i][0] != z)
   _      _     aj[wc - 1][i][0] = '\0';
   _      _  break;
   _      }
   _  }
   }
   cnt = 0;     /* ********* あきを詰める。********  */
   for (i = 0; i <= YakMaxCt; i++) {
   _  if (aj[wc - 1][i][0] != '\0') {
   _  _  if (cnt < i) {
   _  _  _  strcpy(aj[wc - 1][cnt],aj[wc - 1][i]);
   _  _  _  strcpy(az[wc - 1][cnt],az[wc - 1][i]);
   _  _  }
   _  _  cnt++;
   _  }
   }
   aj[wc - 1][cnt][0] = '\0';
end

void yakAkitume(void)  /* 捨てられた訳語侯補の空きを詰める。 */
begin            /* global variables: cnb, caj[][], caz[][] */
   register int i, j;
   int  st, aki = 0;

   for (i = 0; i<= cnb; i++) {
   _  if (caj[i][0] == '\0') {
   _  _  aki = 1;
   _  _  break;
   _  }
   }
   if (aki) {
   _  st = i;
   _  j = st;
   _  if (st == cnb)
   _     cnb--;
   _  else {
   _  _  for (i = st + 1; i <= cnb; i++) {
   _  _  _  if (caj[i][0]) {
   _  _  _  _  strcpy(caj[j],caj[i]);
   _  _  _  _  strcpy(caz[j],caz[i]);
   _  _  _  _  j++;
   _  _  _  }
   _  _  }
   _  _  caj[j][0] = '\0';
   _  _  cnb = --j;
   _  }
   }
end


static void umeKakut(char kd[], char wdw[])     /*  埋め込み熟語の確定処理 */
begin   /* global variables:  shpfg, no, caj[][]  */
   register int i;
   int j1, ln, dbl, lnw, jump = 0;
   char k1[45], k2[45], k3[45], hd[2], *ptj, nbstr[3];

   if (shpfg)    /* 埋め込み型熟語の埋め込まれる部分の品詞コードチェック */
      jump = shpfgCk(nbstr);
   if (jump < 4) {
   _  ln = strlen(kd);
   _  j1 = instrc(kd,'#');
   _  dbl = 0;
   _  while (j1 >= 2) {
   _  _  left(k1,kd,j1 - 1);
   _  _  if (isdigit(*(kd + j1))) {
   _  _  _  strcpy(k2,kd + j1 + 1);
   _  _  _  hd[0] = *(kd + j1);
   _  _  _  hd[1] = '\0';
   _  _  } /* kd[] の中の、# より前を k1[] とし、後ろの部分を k2[] とする。*/
   _  _  else {
   _  _  _  strcpy(k2,kd + j1);
   _  _  _  *hd = '\0';
   _  _  }
   _  _  if (kd[ln - 1] == '>')
   _  _     cutoff(k2,strlen(k2) - 2,2);
   _  _  wdw_adjust(k1,k2,k3,wdw);
                     /* k2[] が wdw[] の中で活用しているときは、原形に戻す。*/
   _  _  no++;
   _  _  numbtohan(no,nbstr);
   _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  if (! caj[i][0])
   _  _  _     break;
   _  _  _  ptj = strchr(caj[i],'#');
   _  _  _  if ((dbl > 0) && ptj)
   _  _  _     ptj = strchr(ptj + 2,'#');
   _  _  _  if (ptj) /* 訳語の中の#の後に番号を挿入する。*/
   _  _  _     ptinsert(++ptj,nbstr);
   _  _  }
   _  _  strcpy(kd,k2);
   _  _  j1 = instrc(kd,'#');
   _  _  dbl++;
   _  _  lnw = strlen(wdw);
   _  _  if (*hd)
   _  _     sprintf(wdw + lnw," #%d%c%s",no,*hd,k3);
   _  _  else
   _  _     sprintf(wdw + lnw," #%d%s",no,k3);
   _  }
   }
end

static int shpfgCk(char nbstr[])
                     /* 埋め込み型熟語の埋め込まれる部分の品詞コードチェック */
begin /* global variables: shpfg, wc, SERR, SERRNB, conj_chr, jwd[], caj[][], aj[][][], az[][][] */
   register int i, j;
   int jump = 0;

   if ((shpfg != '3') && (shpfg != 'G')) {
   _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  if ((caj[i][0] != '3') && (caj[i][0] != '4')) {
   _  _  _  if (! caj[i][0])
   _  _  _     jump = 1;  /* 動詞句でないなら、動詞や助動詞ばかりではダメ */
   _  _  _  break;
   _  _  }
   _  _  if ((caj[i][0] == '3') && strchr(caz[i],'G') && (shpfg == '1')) {
   _  _  _  jump = 2;
   _  _  _  break;
   _  _  }
   _  }
   }
   if (! jump) {
   _  if ((aj[wc - 1][0][0] == '#') && ((shpfg == '1') || (shpfg == '2'))) {
   _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  if (! caj[i][0])   /* 名詞句なら前置詞で始まってはダメ */
   _  _  _     break;
   _  _  _  else
   _  _  _     if ((caj[i][0] != '7') && strcmp(jwd,"in")) {
   _  _  _     _  jump = 3;
   _  _  _     _  break;
   _  _  _     }
   _  _  }
   _  }
   _  else
   _     jump = 3;
   }
   if (jump <= 1) {
   _  for (i = wc - 1; i >= 0; i--) {
   _  _  if (aj[i][0][0] == '#') {
   _  _  _  strcpy(nbstr,az[i][0]);
   _  _  _  nbstr[2] = '\0';
   _  _  _  jump = 2;
   _  _  _  break;
   _  _  }
   _  }
   _  if (jump < 2) {
   _  _  beeping(10);
   _  _  printf("\n # error !!  誤って、# の熟語 jwn[%d] = %s を選択してしまいました。\n",wc,jwn[wc]);
   _  _  printf("  これよりも長い熟語を辞書登録するか、この熟語を辞書から削除するか、どちらかを行ってから、翻訳をやり直して下さい。\n");
   _  exit(1);
   _  }
   _  for (j = i - 2; j >= 0; j--) {
   _  _  if (strstr(aj[j][0],nbstr)) {
   _  _  _  SERR = 5;
   _  _  _  SERRNB = j;
   _  _  _  conj_chr = '\0';
   _  _  _  jump = 4;
   _  _  _  beeping(10);
   _  _  _  printf("\n # error !!  誤って、# の熟語 jwn[%d] = %s を選択してしまいました。\n",j,jwn[j]);
   _  _  _  printf("バックトラックします。\n");
   _  _  _  break;
   _  _  }
   _  }
   _  if (jump < 4) {
   _  _  beeping(10);
   _  _  printf("\n # error !!  誤って、# の熟語 jwn[%d] = %s を選択してしまいました。\n",wc,jwn[wc]);
   _  _  printf("  これよりも長い熟語を辞書登録するか、この熟語を辞書から削除するか、どちらかを行ってから、翻訳をやり直して下さい。\n");
   _  }
   }
   return(jump);
end


static void wdw_adjust(char k1[], char k2[], char k3[], char wdw[])
                     /* k2[] が wdw[] の中で活用しているときは、原形に戻す。*/
begin

   unsigned int  h2, h3, ln1, ln2, lnv;
   char k2d[45], k2q[WordLen];
   
   h3 = instrc(k2,'#');
   ln1 = strlen(k1);
   if (h3 == 0) {
   _  h2 = ninstr(ln1 + 2,wdw,k2);
   _  if (! h2) {
   _  _  ln2 = strlen(k2);
   _  _  if ((ln2 >= 4) && (ln2 <= WordLen)) {
   _  _  _  ptcpy(k2q,k2,k2 + ln2 - 2);
   _  _  _  h2 = ninstr(ln1 + 2,wdw,k2q);
   _  _  _  if (h2 && (wdw[h2 - 2] == ' ')) {
   _  _  _  _  lnv = ninstrc(h2 + ln2 - 2,wdw,' ');
   _  _  _  _  if (lnv)
   _  _  _  _     ptreplace(wdw + h2 - 1,lnv - h2,k2);
   _  _  _  _  else
   _  _  _  _     strcpy(wdw + h2 - 1,k2);
   _  _  _  }
   _  _  }
   _  }
   }
   else { /* kd[] が # を２カ所に含む場合、最後の部分を k3[] とする。*/
   _  left(k2d,k2,h3 - 2);
   _  h2 = ninstr(ln1 + 2,wdw,k2d);
   _  if (wdw[h2 - 2] != ' ')
   _     h2 = ninstr(h2 + 1,wdw,k2d);
   }
   mid(wdw,ln1 + 1,h2 - 1 - ln1,k3);
   cutoff(wdw,0,h2 - 1);
end


static int  saiyou(char wdx[], char wdw[], char wdp[], char kd[])
	   /*  訳語に採用する手続き。 */
begin  /* global variables: wc, cnb, conj_chr, shpfg, pwd[], jwn[][], caj[][], caz[][], aj[][][], az[][][] */
   register int j, i;
   unsigned int  ln, lnj, lnx;
   int  aki = 0, yn = 1;
   char *ptzok, wdxq[JWordLen];

   if (! *wdx)
      strcpy(wdx,jwd);
   lnj = strlen(jwd);
   lnx = strlen(wdx);
   
   ptzok = strchr(caz[0],'|');
   if (ptzok && strchr(ptzok + 1,'r') && (lnj < strlen(wdx)) && (wdw != strstr(wdw,wdx))) {
   _  strcpy(jwd,wdx);
   _  if ( (! strchr(wdx,'#')) && (lnj < strlen(wdw)) ) {
   _  _  strcpy(kd,wdx); /* 第２の条件を加えた。 2005.06.02 */
   _  _  lnj = strlen(jwd);
   _  _  if (strcmp(wdx + lnj - 4,"ない") == 0) {
   _  _  _  if (wdw + lnj - 4 == strstr(wdw + lnj - 4,"ず、"))
   _  _  _     ptreplace(wdw + lnj - 4,2,wdx + lnj - 4);
   _  _  _  else {
   _  _  _  _  if (wdw + lnj - 4 == strstr(wdw + lnj - 4,"ません")) {
   _  _  _  _  _  ptreplace(wdw + lnj - 4,6,wdx + lnj - 4); /* 2001.02.17 */
   _  _  _  _  _  strcat(caz[0],"寧");/* 「ていない」=>「ていません」に対応した。*/
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     ptreplace(wdw + lnj - 2,2,wdx + lnj - 2);
   _  _  _  }
   _  _  }
   _  _  else{
   _  _  _  if ( (lnj > 6) && (strcmp(wdx + lnj - 6,"ている") == 0) && (wdw + lnj - 6== strstr(wdw + lnj - 6,"ていま")) )
   _  _  _     ptinsert(wdw + lnj - 2,"る");
   _  _  _  else
   _  _  _     ptreplace(wdw + lnj - 2,2,wdx + lnj - 2);
   _  _  }
   _  }
   } 
   if ( (strchr(wdx,'#')) || (*wdw == '\0') || ((! *wdp) && (conj_chr != '0')) )
      strcpy(jwn[wc],wdx);     /* 上の最後の条件を加えた。2004.06.17 */
   else {
   _  if (wdw == strstr(wdw,wdx)) {
   _  _  strcpy(jwn[wc],wdx);
   _  _  strcpy(kd,wdx);
   _  }
   _  else {
   _  _  if (conj_chr == '0') {
   _  _  _  strcpy(wdxq,wdx);
   _  _  _  wdxq[lnx - 2] = '\0';
   _  _  _  if (wdw == strstr(wdw,wdxq)) {
   _  _  _  _  strcpy(jwn[wc],wdx);
   _  _  _  _  strcpy(kd,wdxq);
   _  _  _  }
   _  _  _  else
   _  _  _     strcpy(jwn[wc],wdp);
   _  _  }
   _  _  else
   _  _     strcpy(jwn[wc],wdp);
   _  }
   }
   if ((lnj == 2) && ptzok && (! strchr(ptzok,'1')))
      strcat(caz[0],"1");
   if (conj_chr == 'h' || conj_chr == 's') {
   _  if (! strstr(cj[wc],"'s"))
   _     strcat(cj[wc],"'s");
   _  conj_chr = '\0';
   }
   ln = strlen(kd);
   if ((wc > 0) && ((az[wc - 1][0][0] == 'Y') || (az[wc - 1][0][1] == 'Y'))) 
      yn = mitourokugo_shori();            /* 辞書未登録語の訳語採用処理 */
   if (yn) {
   _  if ((caj[0][0] == '7') && (strcmp(pwd,"の") == 0)) {
   _  _  ptzok = strchr(caz[0],'|');
   _  _  if (ptzok && strstr(ptzok,"の")) {
   _  _  _  --wc; /* 「の」(of)＋「下で」(under)＝＞「の下で」(under) */
   _  _  _  strcpy(jwn[wc],jwn[wc + 1]);
   _  _  _  aki = 0;  /* 「の上に」("7on") と「上に」("6up") を区別する。*/
   _  _  _  j = 1;    /*  2001.01.18 */
   _  _  _  for (i = 1; i <= cnb; i++) {
   _  _  _  _  if (! aki) {
   _  _  _  _  _  if (strstr(caz[i],"|の"))
   _  _  _  _  _    ++j;
   _  _  _  _  _  else {
   _  _  _  _  _  _  aki = 1;
   _  _  _  _  _  _  caj[i][0] = '\0';
   _  _  _  _  _  _  caz[i][0] = '\0';
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if (strstr(caz[i],"|の")) {
   _  _  _  _  _  _  strcpy(caj[j],caj[i]);
   _  _  _  _  _  _  strcpy(caz[j],caz[i]);
   _  _  _  _  _  _  caj[i][0] = '\0'; /* 2001.01.22 この２行を追加した。*/
   _  _  _  _  _  _  caz[i][0] = '\0';
   _  _  _  _  _  _  ++j;
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  caj[i][0] = '\0';
   _  _  _  _  _  _  caz[i][0] = '\0';
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  if ((caj[0][0] == '7') && (strcmp(pwd,"に") == 0)) {
   _  _  ptzok = strchr(caz[0],'|');
   _  _  if (ptzok && strstr(ptzok,"に")) {
   _  _  _  --wc; /* 「に」(of)＋「よって」(by)＝＞「によって」(by) */
   _  _  _  strcpy(jwn[wc],jwn[wc + 1]);  /*  2002.07.27 */
   _  _  }
   _  }
   _  if ((strcmp(caz[0],"n") == 0) && cnb && isdigit(caj[0][1])) {
   _  _  caj[0][0] = '\0';
   _  _  yakAkitume();
   _  }
   _  ptzok = strchr(caz[0],'|');
   _  if ((strcmp(caz[0],"n") == 0) && cnb && isdigit(caj[0][1])) {
   _  _  caj[0][0] = '\0';
   _  _  yakAkitume();
   _  }
   _  ptzok = strchr(caz[0],'|');
   _  if ((caj[0][0] == '3') && ptzok)
   _     doushi_saiyou(ln,wdw,ptzok); /* 動詞訳語を採用する時の活用形処理 */
   _  strcpy(pwd,jwn[wc]);
   _  if ((*kd == '#') && isdigit(pwd[1]) && pwd[2])
   _     shpfg = pwd[2];
   _  if (cnb < 5) {
   _  _  aj[wc][cnb + 1][0] = '\0';
   _  _  az[wc][cnb + 1][0] = '\0';
   _  }
   _  if ((! wc) || ((wc == 2) && (strcmp(pwd,"：") == 0))) {
   _  _  for (i = 0; i <= cnb; i++)
   _  _     ptinsert(caz[i],"O");
   _  }                    /* 文章の先頭の単語には 'O' 属性を附加しておく。*/
   _  for (i = 0; i <= cnb; i++) {
       /* 辞書引き訳語変数 caj,cazの値を適訳選択用変数 aj,azにコピーする。*/
   _  _  strcpy(aj[wc][i],caj[i]);
   _  _  strcpy(az[wc][i],caz[i]);
   _  }
   _  if ((strcmp(caz[0],"n|全") == 0) && wc && strstr(az[wc - 1][0],"n|全")) {
   _  _  wc--;
   _  _  strcat(aj[wc][0],caj[0] + 1);
   _  _  strcat(jwn[wc],jwn[wc + 1]);
   _  _  strcat(jwn0[wc],jwn0[wc + 1]);
   _  _  aj[wc][1][0] = '\0';
   _  _  aj[wc][2][0] = '\0';
   _  _  aj[wc][3][0] = '\0';
   _  }
   }
   return(ln);
end

static int  mitourokugo_shori(void) /* 辞書未登録語の訳語採用処理 */
begin  /* global variables: wc, caj, caz, jwd, pwd, jwn, aj[][][], az[][][] */
   register int  i;
   int  lnpwd, yn = 1;

   if ((caz[0][0] == 'Y') && (! strstr(az[wc - 1][0],"SJ"))) {
   _  --wc;  /* １つ前の単語と現単語が共に辞書未登録語なら１つに結合させる。*/
   _  if (strcmp(aj[wc][0],"1 ") == 0) {
   _  _  aj[wc][0][1] = '\0';
   _  _  aj[wc][1][0] = '\0';
   _  }
   _  for (i = 0; i <= 2; i++) {
   _  _  if (aj[wc][i][0] && caj[i][0])
   _  _     strcat(aj[wc][i],caj[i] + 1);
   _  }
   _  strcat(jwn[wc],jwd);
   _  strcat(pwd,jwd);
   _  yn = 0;
   }
   else {   /* １つ前の文字までで未登録語が終わっていれば、画面表示する。*/
   _  puts("caj[i], caz[i] にコピーする。");
   _  printf("jwd = %s \n",aj[wc - 1][0]);
   _  lnpwd = strlen(pwd);
   _  if ((strcmp(pwd + lnpwd - 2,"い") == 0) && (! aj[wc - 1][3][0])) {
   _  _  sprintf(aj[wc -1][3],"5%s",pwd);
   _  _  strcpy(az[wc - 1][3],az[wc - 1][2]);
   _  _  aj[wc - 1][4][0] = '\0';
   _  }
   }
   return(yn);
end

static void doushi_saiyou(int ln, char wdw[], char *ptzok)
                                   /* 動詞訳語を採用する時の活用形処理 */
begin   /* global variables: caj[][], caz[][], wc, pwd[], jwn[][]  */
   register int i;

   if (strchr(ptzok + 1,'e')) {   /* 動詞の命令形の処理 */
   _  if ((wdw + ln) == strstr(wdw + ln,"ます")) {
   _  _  ptinsert(caj[0] + 1,"can ");
   _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  if (! caj[i][0])
   _  _  _     break;
   _  _  _  else 
   _  _  _     strcat(caz[i],"敬");
   _  _  }
   _  _  ptcut(wdw + ln,4);
   _  }
   }
   else {
   _  if (strchr(ptzok + 1,'u')) {   /* 動詞の勧誘形の処理 */
   _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  if (! caj[i][0])
   _  _  _     break;
   _  _  _  else
   _  _  _     strcat(caz[i],"誘");
   _  _  }
   _  _  if ((wdw + ln) == strstr(wdw + ln,"と"))
   _  _     ptinsert(caj[0] + 1,"will ");
   _  }
   _  else {
   _  _  if ((conj_chr == 'D') && ((wdw + ln) == strstr(wdw + ln,"は"))) {
   _  _  _  ptcut(wdw + ln,2);
   _  _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  _  if (! caj[i][0])
   _  _  _  _     break;
   _  _  _  _  else
   _  _  _  _     strcat(caz[i],"は");
   _  _  _  }
   _  _  }
   _  }
   }
   if (strstr(ptzok + 1,"に") && (! strstr(ptzok + 1,"にを")) && (strcmp(pwd,"に") == 0)) {
   _  --wc; /* （格助詞「に」）＋（「に」を取る他動詞）の訳語を１つに結合 */
   _  strcpy(jwn[wc],jwn[wc + 1]);
   }
   else {
   _  if ((wc > 2) && strstr(ptzok + 1,"を") && (strcmp(pwd,"を") == 0)) {
   _  _  if (strcmp(jwn[wc - 2],"の") == 0) {
   _  _  _  strcat(az[wc - 2][0],"OJ");
   _  _  _  strcat(az[wc - 2][1],"OJ");
   _  _  _  aj[wc - 1][0][0] = '\0';
   _  _  _  aj[wc][1][0] = '\0';
   _  _  }
   _  _  else {
   _  _  _  if ((aj[wc - 2][0][0] == '6') && (aj[wc - 3][0][0] == '1')) {
   _  _  _  _  strcat(az[wc - 3][0],"OJ");
   _  _  _  _  if (aj[wc - 3][1][0] == '1')
   _  _  _  _     strcat(az[wc - 3][1],"OJ");
   _  _  _  _  aj[wc - 1][0][0] = '\0';
   _  _  _  }
   _  _  }
   _  }
   }
   if (wdw == strstr(wdw,"だったら")) {
   _  strcpy(jwd,"である");
   _  ptreplace(wdw,4,"である");
   }
end


static void nxtWd(int ln, char kd[], char wdw[], char wdh[], char wdp[])
				  /* 原文から次に辞書引きをする単語を切り出す。*/
begin    /* global variables: wc, conj_chr, jwd[], aj[][][], az[][][], caj[][], caz[][]  */
   int  symb;
   unsigned int ln_kd;
   char jwd1[JWordLen], kdq[JWordLen], wdw_end[3];
   char *pt2, hcode;

   ptcpy(jwn0[wc],wdh,wdh + ln);
   if ( (strcmp(kd,wdw) < 0) || (strcmp(jwn0[wc],wdw) < 0) || (conj_chr && strchr("0r",conj_chr)))  {
		   /* ここでは、文末から１つ手前迄の単語をチェックしている。*/
   _  if (wc >= WordNumb - 1)
   _     too_many_words(); /* 日本文の単語数が多過ぎた場合の処理 */
   _  if (strcmp(kd,wdw) == 0)  {
   _  _  *wdh = '\0';
   _  _  *wdp = '\0';
   _  _  conj_chr = '\0';
   _  }
   _  else
   _     wdh_renewal(ln,wdw,wdh,wdp);
    /* 日本語原文の未処理部分 wdw[] から、現単語の長さ ln だけ切り落として、wdh[] の値を更新する。*/
   _  if (*wdh != '#') { /* 原文未処理部分の先頭が'#'ではない場合（通常の場合）*/
   _  _  if (strlen(wdh) >= 4) {
   _  _  _   symb = preSymbCk(ln,wdh,jwd1);
		/* 新たな jwd[] を切り出し、それが記号か否かをチェックする。*/
   _  _  _  if (! symb) {
   _  _  _  _  hcode = aj[wc][0][0];
   _  _  _  _  if (strchr("12",hcode) || (az[wc][0][0] == 'M') || (wc && (hcode == '|') && strchr("13",aj[wc - 1][0][0])))
   _  _  _  _     kakuj_shori(jwd1,wdh);  /* 格助詞の処理 */
   _  _  _  _  else {
   _  _  _  _  _  pt2 = strchr(az[wc][0],'|');
   _  _  _  _  _  if (strchr("345",caj[0][0]) && pt2)
   _  _  _  _  _     joshi_jodoushi_shori(hcode,jwd,jwd1,wdh,pt2,ln,kd,wdw);
                     /* 用言末尾に付く助詞や助動詞の処理 */
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (wc && (strcmp(jwn[wc],"の") == 0) && (aj[wc - 1][0][0] == '5'))
   _  _  _  _  _  _     kakuj_shori(jwd1,wdh);
			     /* 形容詞＋「の」の場合も格助詞処理をする。*/
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  strcpy(jwd,wdh);
   _  _  _  if (isalpha(*jwd) && (strcmp(jwd + 1,"。") == 0))
   _  _  _     *(jwd + 1) = '\0';
   _  _  }
   _  }
   }
   else {
   _  if (strcmp(kd,wdw) == 0)  {
   _  _  *wdh = '\0';
   _  _  *wdp = '\0';
   _  }
   _  else {
   _  _  ln_kd = strlen(kd);
   _  _  if (ln_kd >= 4) {
   _  _  _  ptcpy(kdq,kd,kd + ln_kd - 2);
   _  _  _  if ( (strcmp(kdq,wdw) == 0) && (az[wc - 1][0][0] == '#') ) {
   _  _  _  _  *wdh = '\0';
   _  _  _  _  *wdp = '\0';
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if ( (ln_kd == strlen(wdw)) && (wdw == strstr(wdw,kdq)) && (az[wc - 1][0][0] == '#') ) {
   _  _  _  _  _  strcpy(wdw_end,wdw + ln_kd - 2);
   _  _  _  _  _  if ( (strcmp(wdw_end,"て") == 0) || (strcmp(wdw_end,"で") == 0) ) {
   _  _  _  _  _  _  *wdh = '\0';
   _  _  _  _  _  _  *wdp = '\0';
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  if (*wdh) {
   _  _  _  printf("wdw == error!!  kd = %s  wdw = %s \n jwd = %s, aj[wc][0] = %s \n",kd,wdw,jwd,az[wc][0]);
   _  _  _  printf("日本語単語「%s」の活用型の分析に失敗しました。別の単語を使って、日本語文を入力し直して下さい！！",jwd);
   _  _  _  exit(1);
   _  _  }
   _  }
   }
   if (*jwd == ' ')
      *(jwd + 1) = '\0';
end


static void too_many_words(void) /* 日本文の単語数が多過ぎた場合の処理 */
begin   /* global variables: wc, aj[][][], az[][][] */
   register int  i, j;
   int  yy;
   char z, zseq[WordNumb];

   for (i = 0; i <= wc - 1; i++) {
   _  z = az[i][0][0];
   _  if (z)
   _    zseq[i] = z;
   _  else
   _    zseq[i] = ' ';
   }
   zseq[wc] = '\0';
   yy = instr(zseq,"YY");
   while (yy) { /* 単語の数が多すぎるので、辞書に */
   _  for (i = yy; i <= wc; i++) { /* 無い単語が続いている部分を１つ */
   _  _  for (j = 0; j <= YakMaxCt; j++) {  /*  に結合する。*/
   _  _  _  strcpy(aj[i - 1][j],aj[i][j]);
   _  _  _  strcpy(az[i - 1][j],az[i][j]);
   _  _  _  if (! aj[i][j][0])
   _  _  _     break;
   _  _  }
   _  }
   _  aj[wc][0][0] = '\0';
   _  ptcut(zseq + yy,1);
   _  --wc;
   _  yy = instr(zseq,"YY");
   }
   if (wc >= WordNumb - 1) {
   _  beeping(15);
   _  printf("\n\n 入力された英文中の単語の数が多すぎて、翻訳出来ません。 \n");
   _  for (i = 0; i <= wc; i++)
   _     printf("\n aj[%d][0] = %s ",i,aj[i][0]);
   _  printf("\n\n");
   _  printf("\n\n 現在までの単語の数 = %d \n",wc);
   _  printf("\n\n 単語の数を %d 以下に減らして再入力して下さい！！\n\n",wc,WordNumb - 1);
   _  exit(1);
   }
end


static void wdh_renewal(int ln, char wdw[], char wdh[], char wdp[])
	/* 日本語原文の未処理部分 wdw[] から、現単語の長さ ln だけ切り落として、wdh[] の値を更新する。*/
begin  /* global variables: conj_chr, caj[][], jwd[] */
   unsigned int  lnzoku;

   if (caj[0][0] == 'S') { /* 主題提示の「は」の品詞コードが'S' */
   _  caj[0][0] = '\0';
   _  strcpy(wdh,wdw + 2);
   }
   else {
   _  if ((wdw != strstr(wdw,jwd))  && (! strchr(caj[0],'#'))) {
   _  _  lnzoku = strlen(caz[0]);
   _  _  if (caj[0][0] == '3') {
   _  _  _  if (caz[0][lnzoku - 1] == 'r')
   _  _  _     strcpy(wdh,wdw + ln - 2);  /* ここは残しておくか？ */
   _  _  _  else {
   _  _  _  _  if ((lnzoku > 2) && (strcmp(caz[0] + lnzoku - 2,"敬") == 0))
   _  _  _  _     strcpy(wdh,wdw + ln + 2); /* 追加した。2001.05.10 */
   _  _  _  _  else
   _  _  _  _     strcpy(wdh,wdw + ln);
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  if ((caj[0][0] == '4') || (caj[0][0] == '5')) {
   _  _  _  _  if ((lnzoku > 2) && (strcmp(caz[0] + lnzoku - 2,"敬") == 0))
   _  _  _  _     strcpy(wdh,wdw + ln + 2); /* 追加した。2001.05.10 */
   _  _  _  _  else
   _  _  _  _     strcpy(wdh,wdw + ln);
   _  _  _  }
   _  _  _  else
   _  _  _     strcpy(wdh,wdw + ln);
   _  _  }
   _  }
   _  else
   _     strcpy(wdh,wdw + ln);
   }
   conj_chr = '\0';
   while (wdh == strstr(wdh,"　"))
      ptcut(wdh,2);             /* 先頭の余分な全角空白を削除する。*/
   if (! strchr(caz[0],'Y')) {
   _  while (*wdh == ' ')       /* 先頭の余分な半角空白を削除する。*/
   _     ptcut(wdh,1);
   }
   *wdp = '\0';
   if (*wdh == '#') {
                  /* 未処理部分 wdh[] の先頭が'#'なら、*/
            	  /* '#'とその直後の番号を jwd[] にコピーする。*/
   _  if (isdigit(*(wdh + 2)))
   _     ptcpy(jwd,wdh,wdh + 3);
   _  else
   _     ptcpy(jwd,wdh,wdh + 2);
   }
end

static int  preSymbCk(int ln, char wdh[], char jwd1[])
	  /* 新たな jwd[] を切り出し、それが記号か否かをチェックする。*/
begin
  /* global variables: cnb, wc, jwd[], jwn0[][], jwn[wc], aj[][][], az[][][] */
   int  symb = 0, i;
   unsigned int  lnj;
   char *pt_dot, *pt_bar;

   if (wdh == strstr(wdh,"　"))
      ptcut(wdh,2);
   ptcpy(jwd,wdh,wdh + 4);/* 原文中の先頭倍角２文字を jwd[] として切り出す。 */
   if ( (strcmp(jwd + 2,"　") == 0) && (strlen(wdh) >= 6) ) {
   _  ptcut(wdh + 2,2); /* 入力された日本語文に全角空白が含まれている場合に対応した。*/
   _  *(jwd + 2) = '\0';       /* 2004.09.05 */
   }
   lnj = strlen(jwd);
   if (strcmp(jwd,"った") == 0)
      datta_shori(ln,wdh,jwd);
                  /* 「だった」で「だ」まで処理された、その次の処理 */
   else {
   _  if ( (wc >= 0) && (aj[wc][0][0] == '3') && (pt_bar = strchr(az[wc][0],'|')) ) {
   _  _  if ( (pt_dot = strchr(pt_bar + 1,'D')) && ((wdh + lnj) == strstr(wdh + lnj,"い")) ) {
   _  _  _  for (i = 0; i <= 8; i++) {
   _  _  _  _  if (strcmp(jwd,onb[i]) == 0) { /* 「住んでいる」=>「住む」+「いる」と対応した。2004.07.25 */
   _  _  _  _  _  ptcut(wdh,4);
   _  _  _  _  _  if (*(pt_dot + 1) == '1')
   _  _  _  _  _     ptcut(pt_dot + 1,1);
   _  _  _  _  _  ptcpy(jwd,wdh,wdh + 4);
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  else {
   _  _  if (strcmp(jwd + 2,"「") == 0) {
   _  _  _  *(jwd + 2) = '\0';
   _  _  _  conj_chr = '1';   /* 2000.10.25 追加 */
   _  _  }
   _  _  else {
   _  _  _  if (wc && (strcmp(jwd,"だ。") == 0) && aj[wc][0][0]) {
   _  _  _  _  strcpy(jwd,"である");
   _  _  _  _  ptreplace(wdh,2,"である");
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (strchr(caz[0],'Y')) {
   _  _  _  _  _  if (((*jwd >= 'A') && isalpha(*jwd)) || (*jwd == '-') || ((*jwd == ' ') && (*(jwd + 1) >= 'A')))
   _  _  _  _  _     michigo_hankaku_shori(jwd,wdh);
                        /* 未知語に続くアルファベット文字の処理 */
                        /* isalpha(負の数) = 256 となってしまうため、条件 "*jwd >= 'A'" を加えた。*/
                               /* 2000.09.13 */
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   if ((wc == 0) && (strcmp(jwd,"田：") == 0)) {
   _  strcat(aj[0][0],"ta");
   _  if (aj[0][1][0])
   _     strcat(aj[0][1],"ta");
   _  if (aj[0][2][0])
   _     strcat(aj[0][2],"ta");
   _  ptcut(wdh,2);
   _  strcpy(jwd,"：");
   _  symb = 1;
   }
   if (! symb) {
   _  if (strcmp(jwd,"・・") == 0) {
   _  _  pt_dot = wdh + 4;
   _  _  while (pt_dot == strstr(pt_dot,"・")) {
   _  _  _  strcat(jwd,"・");
   _  _  _  pt_dot += 2;
   _  _  }
   _  _  symb = 1;
   _  }
   _  else {
   _  _  if ((jwd == strstr(jwd,"...")) && (*(jwd + 3) != '.')) {
   _  _  _  *(jwd + 3) = '\0';
   _  _  _  symb = 1;
   _  _  }
   _  }
   }
  if (! symb) {
   _  ptcpy(jwd1,jwd,jwd + 2);  /* 原文の先頭倍角１文字を jwd1[] とする。 */
   _  if (strstr("、。「」：’”",jwd1)) {
   _  _  symb = shuushi_inyoufu_shori(wdh,jwd,jwd1);
                     /* 終止符号や引用符の処理 */
   _  }
   _  else {
   _  _  if (strstr("、。「」：’”",jwd + 2))
   _  _     *(jwd + 2) == '\0';
   _  _  else {
   _  _  _  if ((strcmp(jwd1,"ー") == 0) && (! strstr("カマド",jwd + 2)))
   _  _  _     chouboin_shori(wdh,jwd);
          /* "コンピュータ" と "コンピューター" など書式の揺れを処理する */
   _  _  _  else {
   _  _  _  _  if (strcmp(jwd1,"−") == 0) {  /* ハイフンの処理。 2000.09.14 追加 */
   _  _  _  _  _  if (wc < 0) {
   _  _  _  _  _  _  printf("\n\n Hyphen error!! wdh = %s \n    jps = %s \n\n",wdh,jps);
   _  _  _  _  _  _  exit(1);
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  for (i = 0; i <= YakMaxCt; i++) {
   _  _  _  _  _  _  _  if (! aj[wc][i][0])
   _  _  _  _  _  _  _     break;
   _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _     strcat(aj[wc][i],"-");
   _  _  _  _  _  _  }
   _  _  _  _  _  _  conj_chr = '-';
   _  _  _  _  _  _  ptcut(wdh,2);
   _  _  _  _  _  _  ptcpy(jwd,wdh,wdh + 4);
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(symb);
end


static void datta_shori(int ln, char wdh[],char jwd[])
              /* 「だった」で「だ」まで処理された、その次の処理 */
begin   /* global variables: wc, cnb, jwn0[][]  */
   int  j;
   
   if (strcmp(jwn0[wc] + ln - 2,"だ") == 0) {
   _  for (j = 0; j <= cnb; j++) {
   _  _  if (aj[wc][j][0] == '3')
   _  _     ptinsert(az[wc][j],"p");
   _  }
   }
   else {
   _  if (az[wc][0][0] == 'Y') {
   _  _  aj[wc][0][0] = '3';
   _  _  aj[wc][1][0] = '\0';
   _  _  strcat(aj[wc][0],"った");
   _  _  strcat(jwn[wc],"った");
   _  _  strcat(jwn0[wc],"った");
   _  _  ptinsert(az[wc][0],"p");
   _  }
   }
   ptcut(wdh,4);
   if (strlen(wdh) >= 4)
      ptcpy(jwd,wdh,wdh + 4);
   else
      strcpy(jwd,wdh);
end

static void michigo_hankaku_shori(char jwd[], char wdh[])
                 /* 未知語に続くアルファベット文字の処理 */
begin   /* global variables: wc, aj[][][], jwn[][] */
   char jwd_body[4], jwd_head[3], jwd2[4];
   
   strcpy(jwd_body,jwd + 1);
   *(jwd_body + 2) = '\0';
   if (strstr("でにはをの、。",jwd_body) || (*jwd == '-')) {
   _  jwd_head[0] = *jwd;
   _  jwd_head[1] = '\0';
   _  strcat(aj[wc][0],jwd_head);
   _  strcat(jwn[wc],jwd_head);
   _  ptcut(wdh,1);
   _  ptcpy(jwd,wdh,wdh + 4);
   }
   else {
   _  if (('A' <= *jwd_body) && (*jwd_body <= 'z') && ('A' <= *(jwd + 2)) && (*(jwd + 2) <= 'z') && ((*(jwd + 3) < 'A') || (*(jwd + 3) > 'z')) )
   _     *(jwd + 3) = '\0'; /* VC++ ver4 では isalpha() が効かないので、すべて */
   _  else {                /* 'A' <= ... <= 'z' に改めた。2000.09.16 */
   _  _  strcpy(jwd2,jwd + 2);
   _  _  if ((jwd[1] >= 'A') && (jwd[1] <= 'z') && strstr("、。でにはを",jwd2)) {
   _  _  _  jwd[2] = '\0';
   _  _  _  strcat(aj[wc][0],jwd);
   _  _  _  strcat(jwn[wc],jwd);
   _  _  _  ptcut(wdh,2);
   _  _  _  ptcpy(jwd,wdh,wdh + 4);
   _  _  }
   _  _  else {
   _  _  _  if (*jwd_body < 0) { /* 2000.11.01 追加した。 */
   _  _  _  _  jwd[1] = '\0';
   _  _  _  _  strcat(aj[wc][0],jwd);
   _  _  _  _  strcat(jwn[wc],jwd);
   _  _  _  _  ptcut(wdh,1);
   _  _  _  _  ptcpy(jwd,wdh,wdh + 4);
   _  _  _  }
   _  _  }  
   _  }
   _  if ((wdh + 3) == strstr(wdh + 3,"「"))
   _     *(jwd + 3) = '\0'; /* 上のチェックが効かない場合のバグ対策 */
   }
end

static int  shuushi_inyoufu_shori(char wdh[], char jwd[], char jwd1[])
    /* 終止符号や引用符の処理 */
begin  /* global variables: wc, aj[][][]  */
   unsigned int lnh;
   int  symb = 0;

   lnh = strlen(wdh);
   if ((strcmp(jwd1,"「") == 0) && (strcmp(wdh + lnh - 2,"」") == 0)) {
   _  if ((wc == 0) || ((wc == 1) && ((aj[0][0][0] == '1') && ((aj[1][0][0] == '1') || (aj[1][0][0] == '8'))))) {
   _  _  ptreplace(wdh,2,"："); /* 会話文の場合は「 を： に直す。*/
   _  _  *(wdh + lnh - 2) = '\0';
   _  _  strcpy(jwd,"：");
   _  }
   _  symb = 1;
   }
   else {	   /* jwd1 が句読点なら、その直後の文字は切り落としておく。*/
   _  jwd[2] = '\0';
   _  conj_chr = '1';
   _  symb = jsymbck(wdh);
   }
   return(symb);
end


static void  chouboin_shori(char wdh[], char jwd[])
          /* "コンピュータ" と "コンピューター" など書式の揺れを処理する */
begin  /* global variables: wc, jwn[][]  */
   unsigned int ln_pwd;
   char pwd_tail[3];

   ln_pwd = strlen(jwn[wc]);
   strcpy(pwd_tail,jwn[wc] + ln_pwd - 2);
   if ( strstr("カサタナマラワ",pwd_tail) && (! is_katakana(jwd + 2)) ) {
   _  ptcut(wdh,2);
   _  if (strlen(wdh) >= 4)
   _     ptcpy(jwd,wdh,wdh + 4);
   _  else
   _     strcpy(jwd,wdh);
   }
end


static void joshi_jodoushi_shori(char hcode, char jwd[], char jwd1[], char wdh[], char *pt2, int ln, char kd[], char wdw[])
                     /* 用言末尾に付く助詞や助動詞の処理 */
begin  /* global variables: wc, jwn[][], pwd[] */
   unsigned int ln_pwd, lnpw;
   unsigned short code;
   char kdq[JWordLen];
   char *p;
   int nb1;
   
   if (hcode == '5') {
   _  ln_pwd = strlen(jwn[wc]);
   _  p = jwn[wc] + ln_pwd - 2;
   _  nb1 = strcmp(p,"ん");
   _  if ( (nb1 > 0) || ((*(pt2 + 1) == 'r') && (strcmp(jwd1,"は") == 0) && (wdh == strstr(wdh,"はありま"))) )
	    /* ひとつ前の日本語単語の品詞が形容（動）詞で, 連用形の場合や */
		     /* 末尾がひらがなで終了しない場合も格助詞処理をする。*/
   _     kakuj_shori(jwd1,wdh);
   }
   if (strchr(pt2 + 1,'r')) {
   _  if ((strcmp(jwd1,"ま") == 0) && strstr("しす",jwd + 2) && ((wdh + 2) != strstr(wdh + 2,"しょう")))
   _     masu_shori(wdh); /* "ます" の処理 */
   _  else {
   _  _  if (*pwd)
   _  _     lnpw = strlen(pwd);
   _  _  else
   _  _     lnpw = 0;
   _  _  if (lnpw && (strcmp(jwd1,"た") == 0) && (strcmp(pwd + lnpw - 4,"です") == 0))
   _  _     deshita_shori(wdh);       /* "でした" の処理 */
   _  _  else {
   _  _  _  if (lnpw && (strcmp(jwd1,"て") == 0)) {
   _  _  _     teonbi_shori(jwd1,wdh);
	     /* jwd1[] が「て」なら、ひとつ前の単語の第２属性を 'D' として、*/
		 /* 「ている」以外の場合にはjwd1[] を捨て、jwd[] を倍角１文字分 */
   _  _  _  }    /* 後ろへずらす。*/
   _  _  }
   _  }
   }
   else {
   _  if (strchr(pt2 + 1,'D') && (strcmp(jwd,"いる") == 0))
   _     te_iru_shori(wdh); /* 進行形 "...ている" の処理 */
   _  else {
   _  _  if ((strcmp(jwd1,"で") == 0) && strchr(pt2,'#') && (! strstr(wdw,kd))) {
   _  _  _  ptcpy(kdq,kd,kd + ln - 2);
   _  _  _  if (wdw == strstr(wdw,kdq))
   _  _  _     teonbi_shori(jwd1,wdh);
   _  _  }
   _  _  if (wc && (strcmp(jwd,"だ。") == 0) && (! strchr(az[wc][0],'Y'))) {
   _  _  _  strcpy(jwd,"である");
   _  _  _  ptreplace(wdw,2,"である");
   _  _  _  ptreplace(wdh,2,"である");
   _  _  }
   _  }
   }
end


static void kakuj_shori(char jwd1[], char wdh[])  /* 格助詞の処理 */
begin   /* global variables: wc, aj[][][], az[][][], jwd[], jwn[][], conj_chr */
   register int  i;

   if (strstr("はが",jwd1)) {
   _  strcat(az[wc][0],"SJ");
   _  strcat(az[wc][0],jwd1);
   _  for (i = 1; i <= YakMaxCt; i++) {
   _  _  if (! aj[wc][i][0])
   _  _     break;
   _  _  else {                     /* 先頭が「は」または「が」なら、ひとつ */
   _  _  _  strcat(az[wc][i],"SJ");      /* 前の単語の第２属性を SJ とする。*/
   _  _  _  strcat(az[wc][i],jwd1);
   _  _  }
   _  }
   _  ptcut(wdh,2);
   _  if ((strcmp(jwd,"は、") == 0) || (strcmp(jwd,"が、") == 0)) {
   _  _  ptcpy(jwd,wdh,wdh + 2);                  /* jwd1[] を捨て jwd[] を */
   _  _  conj_chr = '0';                       /* 倍角１文字分後ろへずらす。 */
   _  }
   _  else
   _     ptcpy(jwd,wdh,wdh + 4);
   }
   else {
   _  if (strcmp("を",jwd1) == 0) {
   _  _  if (strchr(az[wc][0],'|'))    /* jwd1[] が「を」なら、ひとつ */
   _  _     strcat(az[wc][0],"OJ");    /* 前の単語の第２属性を OJ として、*/
   _  _  else
   _  _     strcat(az[wc][0],"|OJ");
   _  _  for (i = 1; i <= YakMaxCt; i++) {
   _  _  _  if (! aj[wc][i][0])
   _  _  _     break;
   _  _  _  else {
   _  _  _  _  if (strchr(az[wc][0],'|'))
   _  _  _  _     strcat(az[wc][i],"OJ");
   _  _  _  _  else
   _  _  _  _     strcat(az[wc][0],"|OJ");
   _  _  _  }
   _  _  }
   _  _  ptcut(wdh,2);            /* やはり jwd1[] を捨て、jwd[] を */
   _  _  ptcpy(jwd,wdh,wdh + 4); /*  倍角１文字分後ろへずらす。*/
   _  }
   }
end


static void masu_shori(char wdh[])     /* "ます" の処理 */
begin
  /* global variables: wc, cnb, jwd[], aj[][][], az[][][], caj[][], jwn0[][] */
   register int i;
   int  ln0;
   char *pt2a, *pt3a;
   char jwd1[JWordLen];

   ln0 = strlen(jwn0[wc]);
   pt2a = strchr(az[wc][0],'|');
   if (strchr(pt2a + 1,'r')) {
   _  for (i = 0; i <= cnb; i++)
   _     strcat(az[wc][i],"敬");
   _  if (wdh == strstr(wdh,"ました")) {
   _  _  for (i = 0; i <= cnb; i++) {
   _  _  _  pt3a = strchr(az[wc][i],'|');
   _  _  _  if (pt3a)
   _  _  _     ptinsert(pt3a,"p");
   _  _  _  else
   _  _  _     strcat(az[wc][i],"p");
   _  _  }
   _  _  ptcpy(jwn0[wc] + ln0,wdh,wdh + 6);
   _  _  ptcut(wdh,6);
   _  }
   _  else {         /* wdh[] = "ます..." */
   _  _   ptcpy(jwn0[wc] + ln0,wdh,wdh + 4);
   _  _   ptcut(wdh,4);
   _  }
   }
   ptcpy(jwd,wdh,wdh + 4);
   ptcpy(jwd1,jwd,jwd + 2);  /* 原文の先頭倍角１文字を jwd1[] とする。 */
   if (strstr("、。「」：’”",jwd1))
      *(jwd + 2) = '\0';  /* 終止符号や引用符の処理 */
   if ((*jwd == ' ') && ((*(jwd + 2) == ' ') || (*(jwd + 3) == ' '))) {
   _  ptcut(jwd,1);           /* 2001.01.16 追加した。*/
   _  if (*(jwd + 1) == ' ')   /* ハイフンの処理 */
   _     *(jwd + 1) = '\0';
   _  else
   _     *(jwd + 2) = '\0';
   _  ptcut(wdh,1);
   }
end

static void deshita_shori(char wdh[]) /* "でした" の処理 */
begin   /* global variables: wc, jwn0[][] */
   int  lnh, ln0;

   ln0 = strlen(jwn0[wc]);
   ptinsert(az[wc][0],"p");
   if (caj[1][0])
      ptinsert(az[wc][1],"p");
   if (strstr(wdh,"た") == wdh) {
   _  ptcpy(jwn0[wc] + ln0,wdh,wdh + 2);
   _  ptcut(wdh,2);
   _  lnh = strlen(wdh);
   _  if (lnh >= 5)
   _     ptcpy(jwd,wdh,wdh + 4);
   _  else
   _     strcpy(jwd,wdh);
   }
end

static void teonbi_shori(char jwd1[], char wdh[])
	    /* jwd1[] が「て」なら、ひとつ前の単語の第２属性を 'D' として、*/
		       /* jwd1[] を捨て、jwd[] を倍角１文字分後ろへずらす。*/
begin   /* global variables: jwn[][], jwn0[][], wc, cnb, az[][][] */
   register int  j;
   int  ln0;
   char *wdh2, u_tango[4][9] = {"うまく","うれし","うん","うっかり"};

   strcat(jwn[wc],jwd1);
   ln0 = strlen(jwn0[wc]);
   for (j = 0; j <= cnb; j++)
      strcat(az[wc][j],"D");
   ptcpy(jwn0[wc] + ln0,wdh,wdh + 2);
   ptcut(wdh,2);
   ptcpy(jwd,wdh,wdh + 4);
   if (strcmp(jwd,"もう") == 0) { /* 「...てもうまく...」などの区切り誤り */
   _  wdh2 = wdh + 2;                /*     を予防する。*/
   _  for (j = 0; j <= 3; j++) {
   _  _  if (wdh2 == strstr(wdh2,u_tango[j])) {
   _  _  _  ++wc;
   _  _  _  strcpy(aj[wc][0],"6even");
   _  _  _  aj[wc][1][0] = '\0';
   _  _  _  strcpy(az[wc][0],"|1");
   _  _  _  az[wc][1][0] = '\0';
   _  _  _  strcpy(jwn0[wc],"も");
   _  _  _  strcpy(jwn[wc],"も");
   _  _  _  ptcut(wdh,2);
   _  _  _  ptcpy(jwd,wdh,wdh + 4);
   _  _  _  break;
   _  _  }
   _  }
   }
   else {
   _  if (strcmp(jwd,"いる") == 0)   /* 進行形 "...ている" の処理 */
   _    te_iru_shori(wdh);/* 2001.02.09 追加した。*/
   _  else {
   _  _  if (jwd == strstr(jwd,"は")) {
   _  _  _  for (j = 0; j <= cnb; j++)
   _  _  _     strcat(az[wc][j],"SJは");
   _  _  _  ptcpy(jwn0[wc] + ln0,wdh,wdh + 2);
   _  _  _  ptcut(wdh,2);
   _  _  _  ptcpy(jwd,wdh,wdh + 4);
   _  _  }
   _  }
   }
end

static void te_iru_shori(char wdh[])    /* 進行形 "...ている" の処理 */
begin   /* global variables: wc, aj[][][], az[][][], jwd[], jwn0[][] */
   register int  i;
   int  ln0;
   char *pt2;

   for (i = 0; i <= YakMaxCt; i++) {
   _  if (! aj[wc][i][0])
   _     break;
   _  pt2 = strchr(az[wc][i],'|');
   _  if (pt2)
   _     ptinsert(pt2,"G");
   }
   ln0 = strlen(jwn0[wc]);
   ptcpy(jwn0[wc] + ln0,wdh,wdh + 4);
   ptcut(wdh,4);
   if (strlen(wdh) >= 4)
      ptcpy(jwd,wdh,wdh + 4);
   else
      strcpy(jwd,wdh);
end

int  is_katakana(char *jpwd)   /* 片仮名でえあるかどうか判定する。*/
begin   /* 2002.09.16 */

   if (strlen(jpwd) != 2)
      return(0);
   if (strstr("アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲ",jpwd))
      return(1);
   else {
   _  if (strstr("ガギグゲゴザジズゼゾダヂヅデドバビブベボ",jpwd))
   _     return(1);
   _  else
   _     return(0);
   }
end
