#include <stdio.h>     /* ******  jtoe.c ******  */
#include <string.h> /* main, jtoe_main, setUp, ajClear, zbClear, hozon, sentInput */
#include <ctype.h>  /* fileInput, keyboard, tooLong, lesson, REI_yak, LssCk */
#include <time.h>   /* pre_dic, wdw_recover, time_record, qstMark */
#include <process.h>    /*       for MS-C & TURBO C++ */
/*  #include <stdlib.h>  ;       for Lattice C */
		     /* postDic, inyoufu, dicDbg, f_close */

#define QWJTOE

#include "macro.h"  /* postDic, inyoufu, dicDbg, f_close */

#define USER

#include "jehonfnc.h"

static int  jtoe_main(void);
static char setUp(char *NT, char *ZB, char yak_file[], char *kf_pt, int *nh_pt, int *yomu_pt, char j_file[],  char lsta[], char lend[]);
static char ini_file_setting(FILE *init_pt, char yak_file[], char *kf_pt,
                                           char j_file[], int *file_open_err);
static char ini_read(FILE *init_pt, char ini_file_data[9][170],
  char dbg_file[], char yak_file[], char *kf_pt, char j_file[], char chng[]);
static void ini_data_disp(char init_cond[], char ini_data[]);
static void change_quest(char chng[], char dbg_file[]);
static void dbg_file_change(char dbg_file[], char ini_file_data_2[170], char chng[]);
static char YN_reverse(char ini_f_data[]);
static void setDrive(char ini_file_data_6[170]);
static char manual_setUp(char yak_file[], int *file_open_err);
static int  kf_setUp(char *kf_pt, char j_file[]);
static int  rule_form_check(void);
static void ajClear(int t);
static void zbClear(void);
static int  setDebug(char ch);
static void getWatchNb(char watchq[]);
static char hozon(char yak_file[]);
static int sentInput(char *kf, char egs[], char *NT, int nh, int *yomu, char lsta[], char lend[],  char hzn);
static int  j_file_open(char j_file[]);
static int  fileInput(char lsta[], char lend[], int *yomu, int *sentCk,
				      char hzn, char *NT, int nhv, char jps[]);
static void keyboard(void);
static void tooLong(void);
static void lesson(char lsta[], char lend[]);
#if defined(USER)
 static void LssCk(void);
#endif
static int REI_yak(char lsta[], char lend[], int yomu, int *sentCk, char hzn,
							 char *NT, char jps[]);
static int pre_dic(char wdh[],char wdw[],char wdp[],char wdx[], int symbCk);
#if defined(USER)
 static void dicKakut(char wdp[], char wdh[], char wdw[], char wdx[],
			int symbCk, char kf, int watchPT, int *BetsuYk_pt, int *Exit, char hzn);
#else
 static void dicKakut(char wdp[], char wdh[], char wdw[], char wdx[],
				     int symbCk, char kf, int *BetsuYk_pt, int *Exit, char hzn);
#endif
static void wdw_recover(char wdp[],char wdh[],char wdw[]);
static int  hankaku_shori(int symbCk, char wdw[]);
static void time_record(char hzn);
static void qstMark(void);
static int  shpErr(char wdh[], char wdp[], char hzn, int BetsuYk, int *Exit_pt);
static void shpErr2(char wdh[], int *Exit_pt, char hzn);
static void postDic(void);
static void dicDbg(int i);
static void betsuyaku_setting(char egs[], char egs1[], char egs2[], int *katsuyou_nokori, int *k_nokori1, int *k_nokori2);
static int  yaku_swap(char egs[], char egs1[], int ketsugou_nokori, int *k_nokori1);
static void  data_push(char egs[]);
static int  f_close(char hzn, char kf);

#include "honyavar.h"

static FILE *jf_pt;
static long tma, tmz;

/*      unsigned _STACK=7000;    for Lattice C */

int  main(void)
begin
   char Ans[60];
   
  *Ans = '\0';
  title();
  while (*Ans != '3') {
   _  printf(" 次のどれを行いますか？ [1/2/3] \n");
   _  printf("\n 1.  *********   翻訳 \n");
   _  color_light_blue;
   _  printf("\n 2.  *********  辞書の更新 \n");
   _  color_green;
#if defined(QWJTOE)
   _  printf("\n 3.  *********  終了（Windows に戻る） \n");
#else
   _  printf("\n 3.  *********  終了（MS/DOS に戻る） \n");
#endif
   _  color_white;
   _  *Ans = '\0';
   _  while ((! *Ans) || (! strchr("123",*Ans))) {
   _  _  gets(Ans);
   _  _  if (*Ans && (! strchr("123",*Ans))) {
   _  _  _  beeping(1);
   _  _  _  printf("\n 1, 2, 3 のどれかの数字をタイプして下さい。\n");
   _  _  _  *Ans = '\0';
   _  _  }
   _  }
   _  switch (*Ans) {
   _    case '1':
   _      jtoe_main();
   _      break;
   _    case '2':
   _      dicSetUp();
   _      jedcmain();
   _      fclose(jed);
   _      break;
   _    case '3':
#if defined(QWJTOE)
   printf("\n\n\n\n  和英翻訳プログラムを終了しました。\n\n");
   printf(" 画面左上隅の「File」メニューをクリックして「終了(Exit)」を選択するか、\n");
   printf("画面右上隅のバツ印をクリックして画面を閉じてください。\n\n\n");
#endif
   _      break;
   _  }
   _  printf("\n\n");
   }
   return((int) *Ans);
end


static int  jtoe_main(void)
begin
/* global variables: ct, jps[], pst[], pst2[], pes[], pe2[], pwd[], conj_chr */

   int sentCk, symbCk = 0, nh = 0, yomu = 0, ketsugou_nokori, k_nokori1, k_nokori2, Exit = 0;
   int  BackTrack, BetsuYk;
   char NT, ZB, hzn, kf = '\0';
   char wdh[JSentLen], wdw[JSentLen];
   char wdx[JWordLen], wdp[JWordLen], yak_file[20];
   static char egs[YakuLen], egs1[YakuLen], egs2[YakuLen];
   static char j_file[40], lsta[15], lend[15];
#if defined(USER)
   int  watchPT;
   unsigned int code;
#endif

 hzn = setUp(&NT,&ZB,yak_file,&kf,&nh,&yomu,j_file,lsta,lend);        /* 翻訳環境の初期設定 */
 *egs = *egs1 = *egs2 = *jps = '\0'; /* 英訳文 egs[], 日本語原文 jps[] の値を初期化する。*/
#if defined(USER)
 if (*WTWORD) {
 _  strcpy(jwd,WTWORD);
 _  watchPT = ptcal(WTWORD, &code);
 }
 else
    watchPT = 0;
#endif
 while ((NT == 'Y') || (NT == 'y')) {
 _ if (! yomu)
 _    ajClear(0);
 _ if ((ZB == 'N') || (ZB == 'n'))
 _    zbClear();
 /***************      日本語文の入力      ***********/
 _ sentCk = sentInput(&kf,egs,&NT,nh,&yomu,lsta,lend,hzn);
 _ SERR = 0;  /* sentCk = 0;通常の日本語文、 = 1;空文または記号、 = -1;終了 */
 _ shpfg = '\0';
 _ BetsuYk = 0;   /* 別訳文訳出機能を付けた。005.01.29 */
 _ BackTrack = 0;
 _ if (sentCk >= 0) {
 _ _  if (! sentCk) {
 _ _  _  do {
 _ _  _  _  if ((! BetsuYk) || SERR) {
 _ _  _  _  _  if (! SERR) {
 _ _  _  _  _  _  no = 0;    /* 原文のプレエディット（区切り記号の処理など）*/
 _ _  _  _  _  _  predit(wdh,wdp); /* ここで最初の jwd[] が切り出されるはず。*/
 _ _  _  _  _  }
 _ _  _  _  _  while (*wdh || SERR) {
/* ********* 辞書引きのための初期設定、および記号や数字の処理   ********* */
 _ _  _  _  _    DIC:
 _ _  _  _  _  _  symbCk = pre_dic(wdh,wdw,wdp,wdx,symbCk);
 /* jwd[] が記号なら jdiclook モジュールの jsymbck() で symbCk = 1 にセット */
 _ _  _  _  _  _  while ((! wdx[0]) || (symbCk == 1)) {
#if defined(USER)
 _ _  _  _  _  _  _  dicKakut(wdp,wdh,wdw,wdx,symbCk,kf,watchPT,&BetsuYk,&Exit,hzn);
#else
 _ _  _  _  _  _  _  dicKakut(wdp,wdh,wdw,wdx,symbCk,kf,&BetsuYk,&Exit,hzn);
#endif
	/* 辞書を引いて、英語訳語を探す。同義語が有る時は、homo = 1 に*/
	/* セットされ、再度辞書引きを行う。 */
	/* homo = 1 :  動詞からの連用形派生名詞(第２属性 = 用)や、*/
	/* 副詞（広く）と形容詞連用形（広く）＋「て」の混同など。 */
 _ _  _  _  _  _  _  if (Exit == 1)
 _ _  _  _  _  _  _     goto END;
 _ _  _  _  _  _  _  if (symbCk == 1) /* jwd[] が記号だった場合(symbCk == 1)は */
 _ _  _  _  _  _  _     symbCk = 0;      /* 辞書引きをやり直す必要は無い。 */
 _ _  _  _  _  _  _  if ((conj_chr == '1') && (((int)(*jwd) == -127) || ((int)(*jwd) == -126)))
 _ _  _  _  _  _  _     goto DIC;        /* -127 = 0x81 */
 _ _  _  _  _  _  }
 _ _  _  _  _  }
 _ _  _  _  _  postDic();    /* ******** 辞書引きが終了、その後処理  ******** */
 _ _  _  _  }
                         /* ******　　適訳語を選択する。  ***** */
 _ _  _  _  BetsuYk = tekyk(BetsuYk,egs1,egs1);
 _ _  _  _  bunpo();     /* **** 文法規則を適用して、訳文を生成する。**** */
 _ _  _  _  if (SERR > 1) {
 _ _  _  _  _  if (! *egs1) {     /* if (! *egs1) の条件を挿入 2005.01.25  */
 _ _  _  _  _  _  if (SERRNB >= 0) {
 _ _  _  _  _  _  _  ++BackTrack;
 _ _  _  _  _  _  _  if (BackTrack > 3)
 _ _  _  _  _  _  _     SERR = 0;
 _ _  _  _  _  _  _  else {
 _ _  _  _  _  _  _  _  BetsuYk = shpErr(wdh,wdp,hzn,BetsuYk,&Exit);
     /* '#'エラー(埋め込み型熟語)からの回復, 上の DIC: へバックトラックする。*/
 _ _  _  _  _  _  _  _  if (Exit == 1)
 _ _  _  _  _  _  _  _     goto END;
 _ _  _  _  _  _  _  }
 _ _  _  _  _  _  }
 _ _  _  _  _  }
 _ _  _  _  }
 _ _  _  _  else
 _ _  _  _     SERR = 0; /* umekomi bakari no toki wa SERR = 1 to naru. */
/* ********   訳文の仕上げ  ******* */
 _ _  _  _  if (! SERR)
 _ _  _  _     ketsugou_nokori = siage(egs);
 _ _  _  _  if (*egs1)
 _ _  _  _     ketsugou_nokori = yaku_swap(egs,egs1,ketsugou_nokori,&k_nokori1);
 _ _  _  _  if ((*egs && (BetsuYk == 1)) || (BetsuYk == 2) || ((BetsuYk == 4) && (! *egs2)))
 _ _  _  _     betsuyaku_setting(egs,egs1,egs2,&ketsugou_nokori,&k_nokori1,&k_nokori2);
 _ _  _  } while ( (SERR && (SERRNB >= 0)) || (BetsuYk == 1) || (BetsuYk == 2) || ((BetsuYk == 4) && (! *egs2)) );
 _ _  }
 _ _  else {
 _ _  _  sentCk = 0;
 _ _  _  ketsugou_nokori = 0;
 _ _  }
 _ _  yakuDisp(egs,egs1,egs2,&hzn,ketsugou_nokori,k_nokori1,k_nokori2);
 _ _  data_push(egs);       /*  前文データの更新 */
 _ }
 _ kf = nextSent(kf,&NT,&ZB);  /* 次の日本語文の準備。 */
 }
END:;
 printf("\n\n\n  和英翻訳プログラムを終了します。\n\n");
 return(f_close(hzn,kf)); /* ファイルをすべてクローズして終了する。 */
end


static char setUp(char *NT, char *ZB, char yak_file[], char *kf_pt, int *nh_pt, int *yomu_pt, char j_file[],  char lsta[], char lend[])  /* 初期条件の設定 */
begin         /* global variables: Dbg, DRV, jed, pjs[] */
   int  file_open_err, j_file_open_ck;
   char hzn = '\0', Dicfile[15];
   FILE *init_pt;

   *j_file = '\0';
   do {
   _  file_open_err = 0;
   _  init_pt = fopen("jtoeini.jte","r");
   _  if (init_pt) {
   _  _  hzn = ini_file_setting(init_pt,yak_file,kf_pt,j_file,&file_open_err);
   _  _  fclose(init_pt);
   _  }
   _  else {
   _  _  hzn = manual_setUp(yak_file,&file_open_err);
          /* 手動で初期値を設定する。*/
   _  _  j_file_open_ck = kf_setUp(kf_pt,j_file);
        /* 入力方式の設定 ( kf = 'K';キーボード、 = 'F';ファイル )  */
   _  }
   _  if (*kf_pt == 'K')
   _     *yomu_pt = 0;
   _  else {
   _  _  if (strstr(j_file,".REI") || strstr(j_file,".rei")) {
   _  _  _  *nh_pt = 1;
   _  _  _  *yomu_pt = 1;
   _  _  _  lesson(lsta,lend);
   _  _  }
   _  _  time(&tma);
   _  }
   _  *NT = 'Y';
   _  *ZB = 'Y';
   _  SERRNB = -5;
   _  zbClear();

/* ********   辞書ファイルをオープンする。  ************ */
   _  dicptDta(DRV);
   _  Dicfile[0] = DRV;
   _  Dicfile[1] = '\0';
   _  strcat(Dicfile,":jedic.jte");
   _  jed = fopen(Dicfile,"r");
   _  if (! jed) {
   _  _  color_green;
   _  _  printf("\n 辞書ファイルがオープン出来ませんでした。正しいドライブを指定しましたか？ \n");
   _  _  color_white;
   _  _  beeping(10);
   _  _  exit(1);
   _  }
   _  else {
   _  _  if ((Dbg == 'y') || (Dbg == 'Y')) {
   _  _  _  if (rule_form_check())
   _  _  _     exit(1);               /* 適訳・文法規則の書式をチェックする。*/
   _  _  }
   _  }
   _  if ((hzn == 'Y') || (hzn == 'y'))
   _     yakbn = fopen(yak_file,"w+");
   } while (file_open_err);
   time(&tma);
   return(hzn);
end


static char ini_file_setting(FILE *init_pt, char yak_file[], char *kf_pt, char j_file[], int *file_open_err)
begin   /* global variables: Dbg, Dbg2, dbgfl_pt, DRV */
   int  i = 0, chng_nb;
   char  ini_file_data[9][170];
   char  dbg_file[40];
   char  hzn = '\0', chng[20], CNG, YN_char;
   
   *chng = 'C';
   CNG = *chng;
   while (CNG != '0') {
   _  beeping(1);
   _  hzn = ini_read(init_pt,ini_file_data,dbg_file,yak_file,kf_pt,j_file,chng);
#if defined(PROFILE)
   _  break;
#endif
   _  CNG = *chng;
   _  while (('1' <= *chng) && (*chng <= '9')) {
   _  _  switch(*chng) {
   _  _    case '1':
   _  _      if (Dbg == 'Y')
   _  _         Dbg = 'N';
   _  _      else
   _  _         Dbg = 'Y';
   _  _      sprintf(ini_file_data[0],"1.デバッグモード(Y/N): Dbg = %c;\n",Dbg);
   _  _      break;
   _  _    case '2':
   _  _      if (Dbg2 == 'Y')
   _  _         Dbg2 = 'N';
   _  _      else
   _  _         Dbg2 = 'Y';
   _  _      sprintf(ini_file_data[1],"2.デバッグ情報のファイル出力(Y/N): Dbg2 = %c;\n",Dbg2);
   _  _      break;
   _  _    case '3':
   _  _         dbg_file_change(dbg_file,ini_file_data[2],chng);
                                       /* デバッグファイル名を変更する。*/
   _  _      break;
   _  _    case '4':
   _  _    case '5':
   _  _    case '6':
   _  _      chng_nb = *chng - '1';
   _  _      YN_char = YN_reverse(ini_file_data[chng_nb]);
                    /* Y (= Yes), N (= No) を逆転させる。*/
   _  _      if (YN_char == 'Y') {
   _  _      _  if (setDebug(*chng))
   _  _      _     *file_open_err = 1;
                 /* 英単語、適訳規則、文法規則（大域変数）の値をセットする。*/
   _  _      }
   _  _      break;
   _  _    case '7':
   _  _      setDrive(ini_file_data[6]);  /* 辞書などが置かれているドライブを設定する。*/
   _  _      break;
   _  _    case '8':
   _  _      hzn = hozon(yak_file);
   _  _      hzn = toupper(hzn); /* 2000.12.07  追加した。*/
   _  _      if (hzn == 'Y')
   _  _        sprintf(ini_file_data[7],"8.訳文の保存(Y/N)と訳文ファイル名: YN = Y; yak_file = '%s';\n",yak_file);
   _  _      else
   _  _        sprintf(ini_file_data[7],"8.訳文の保存(Y/N)と訳文ファイル名: YN = N; yak_file = '';\n");
   _  _      break;
   _  _    case '9':
   _  _      *kf_pt = '\0';
   _  _      *j_file = '\0';
   _  _      kf_setUp(kf_pt,j_file);
   _  _      if (*kf_pt == 'K')
   _  _         strcpy(ini_file_data[8],"9.日本語文の入力方法[K/F]と日本語文ファイル名: kf = K; j_file = '';\n");
   _  _      else
   _  _        sprintf(ini_file_data[8],"9.日本語文の入力方法[K/F]と日本語文ファイル名: kf = F; j_file = '%s';\n",j_file);
   _  _      break;
   _  _  }
   _  _  ptcut(chng,1);
   _  }
   _  if (('1' <= CNG) && (CNG <= '9')) {
   _  _  fclose(init_pt);
   _  _  init_pt = fopen("jtoeini.jte","w+");
   _  _  for (i = 0; i <= 8; i++)
   _  _     fprintf(init_pt,"%s",ini_file_data[i]);
   _  _  fclose(init_pt);
   _  _  init_pt = fopen("jtoeini.jte","r");
   _  }
   }
   return(hzn);
end

static char ini_read(FILE *init_pt, char ini_file_data[9][170], char dbg_file[], char yak_file[], char *kf_pt, char j_file[], char chng[])
begin   /* global variables: Dbg, Dbg2, dbgfl_pt, DRV, WTWORD[], TKWATCH[], BPWATCH[] */

   int  i = 0;
   char  init_cond[170], ini_data[170];
   char  hzn = '\0', *ptd, *ptz;

   while (fgets(ini_data,170,init_pt)) {
   _  strcpy(ini_file_data[i],ini_data);
   _  ini_data_disp(init_cond,ini_data); /* 初期データを表示する。*/
   _  ptd = strstr(init_cond,"Dbg");
   _  if (ptd) {
   _  _  if (ptd == strstr(ptd,"Dbg = "))
   _  _     Dbg = *(ptd + 6);
   _  _  else
   _  _     Dbg2 = *(ptd + 7);
   _  }
   _  else {
   _  _  ptd = strstr(init_cond,"dbg_file = ");
   _  _  if ((Dbg2 == 'Y') && ptd) {
   _  _  _  ptz = strchr(ptd + 13,';');
   _  _  _  ptcpy(dbg_file,ptd + 12,ptz - 1);
   _  _  }
   _  _  else {
   _  _  _  if (strstr(init_cond,"注目する")) {
   _  _  _  _  if (strstr(init_cond,"YN = Y;"))
   _  _  _  _     setDebug((char) ('1' + i));
   _  _  _  _  else {
   _  _  _  _  _ switch(i) {
   _  _  _  _  _   case 3:
   _  _  _  _  _     *WTWORD = '\0';
   _  _  _  _  _     break;
   _  _  _  _  _   case 4:
   _  _  _  _  _     *TKWATCH = '\0';
   _  _  _  _  _     break;
   _  _  _  _  _   case 5:
   _  _  _  _  _     *BPWATCH = '\0';
   _  _  _  _  _ }
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  ptd = strstr(init_cond,"DRV = ");
   _  _  _  _  if (ptd)
   _  _  _  _     DRV = *(ptd + 6);
   _  _  _  _  else {
   _  _  _  _  _  ptd = strstr(init_cond,"訳文ファイル名: YN =");
   _  _  _  _  _  if (ptd) {
   _  _  _  _  _  _  hzn = *(ptd + 21);   /* ******* non-DEMO 用 ******* */
//   _  _  _  _  _  _  hzn = 'Y'; /* ******* CREST pattern DEMO 用 ********* */
   _  _  _  _  _  _  if (hzn == 'Y') {
   _  _  _  _  _  _  _  ptz = strchr(ptd + 36,';');
   _  _  _  _  _  _  _  ptcpy(yak_file,ptd + 36,ptz - 1);
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else
   _  _  _  _  _  _     *yak_file = '\0';
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  ptd = strstr(init_cond,"日本語文ファイル名: kf = ");
   _  _  _  _  _  _  if (ptd) {
   _  _  _  _  _  _  _  *kf_pt = *(ptd + 25);
   _  _  _  _  _  _  _  if (*kf_pt == 'F') {
   _  _  _  _  _  _  _  _  ptz = strchr(ptd + 38,';');
   _  _  _  _  _  _  _  _  ptcpy(j_file,ptd + 38,ptz - 1);
   _  _  _  _  _  _  _  _  j_file_open(j_file);
   _  _  _  _  _  _  _  }
   _  _  _  _  _  _  _  else
   _  _  _  _  _  _  _     *j_file = '\0';
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  ++i;
   }
   change_quest(chng,dbg_file); /* 初期設定を変更するかどうかの問い合わせ */
   return(hzn);
end


static void ini_data_disp(char init_cond[], char ini_data[])
                                        /* 初期データを表示する。*/
begin
   char *pt_col, *ptn, ini_value[170];
   
   strcpy(init_cond,ini_data);
   pt_col = strchr(ini_data,':');
   if (pt_col && *(pt_col + 1)) {
   _  strcpy(ini_value,pt_col + 1);
   _  *(pt_col + 1) = '\0';
   _  ptn = strchr(ini_value,'\n');
   _  if (ptn)
   _     *ptn = '\0';
   }
   color_yellow;
   printf("\n %s",ini_data);
   if (pt_col) {
   _  color_light_blue;
   _  printf("%s",ini_value);
   }
   color_white;
end


static void change_quest(char chng[], char dbg_file[])
             /* 初期設定を変更するかどうかの問い合わせ */
begin

   color_magenta;
   printf("\n      --------------------------   ");
   color_white;
   printf("\n 上記の初期設定で、変更したい点がありますか？");
   color_light_blue;
   printf("\n        0 ");
   color_yellow;
   printf("...変更無し, ");
   color_light_blue;
   printf("1 - 9 ");
   color_yellow;
   printf("...変更したい項目の番号");
   color_white;
   printf("\n 複数項目を変更したい時は");
   color_light_blue;
   printf("            456[Enter] \n");
   color_white;
   printf("の様に入力する。\n\n");
   while (! isdigit(*chng))
      gets(chng);
   if ((! strchr(chng,'3')) && (Dbg2 == 'Y') && *dbg_file && (! dbgfl_pt)) {
   _  dbgfl_pt = fopen(dbg_file,"w");
   _  if (! dbgfl_pt) {
   _  _  color_magenta;
   _  _  printf("\n デバッグ出力ファイルがオープン出来ませんでした。正しいドライブを指定しましたか？ \n");
   _  _  color_white;
   _  _  beeping(5);
   _  _  if (*chng != '0')
   _  _     strcat(chng,"3");
   _  _  else
   _  _     strcpy(chng,"3");
   _  }
   }
end


static void dbg_file_change(char dbg_file[], char ini_file_data_2[170], char chng[])
                       /* デバッグファイル名を変更する。*/
begin   /* global variables:  Dbg2, dbgfl_pt */

   *dbg_file = '\0';
   if (Dbg2 == 'Y') {
   _  printf("\n 新しいデバッグファイル名を入力してください。\n");
   _  do {
   _  _  gets(dbg_file);
   _  } while(! *dbg_file);
   _  dbgfl_pt = fopen(dbg_file,"w");
   _  if (! dbgfl_pt) {
   _  _  color_magenta;
   _  _  printf("\n デバッグ出力ファイルがオープン出来ませんでした。正しいドライブを指定しましたか？ \n");
   _  _  color_white;
   _  _  beeping(5);
   _  _  ptinsert(chng,"3");
   _  }
   }
   sprintf(ini_file_data_2,"3.デバッグ出力ファイル名: dbg_file = '%s';\n",dbg_file);
end

static char YN_reverse(char ini_f_data[])
       /* Y (= Yes), N (= No) を逆転させる。*/
begin
  char  *tail, *YN_pt;
   
   tail = strstr(ini_f_data,"YN = ");
   YN_pt = tail + 5;
   if (*YN_pt == 'Y')
      *YN_pt = 'N';
   else
      *YN_pt = 'Y';
   return(*YN_pt);
end

static void setDrive(char ini_file_data_6[170])  /* 辞書などが置かれているドライブを設定する。*/
begin  /* global variable:  DRV  */

   printf("\n");
   color_yellow;
   puts("辞書や文法ファイルが置かれているドライブは？　[A - P] \n");
   color_white;
   do {
   _  DRV = getchar();
   } while ((tolower(DRV) < 'a') || (tolower(DRV) > 'p'));
   sprintf(ini_file_data_6,"7.辞書や文法ファイルの在るドライブ[A - P]: DRV = %c;\n",DRV);
end

static char manual_setUp(char yak_file[], int *file_open_err)
          /* 手動で初期値を設定する。*/
begin  /* global variables:  Dbg, Dbg2, DRV */

   char hzn = '\0';

   
   printf("\n     デバッグモードにしますか？   [Y/N]    ");
   Dbg = getchar();
   while ((Dbg != 'N') && (Dbg != 'n') && (Dbg != 'Y') && (Dbg != 'y'))
      Dbg = getchar();
   Dbg = toupper(Dbg);
#if defined(USER)
   if (Dbg == 'Y') {  /* デバッグ時に注目するべき */
               /* 英単語、適訳規則、文法規則（大域変数）の値をセットする。*/
   _  if (setDebug('a'))
   _     *file_open_err = 1;
   }
   else
	   Dbg2 = 'N';
#endif
   printf("\n");
   puts("辞書や文法ファイルが置かれているドライブは？　[A - P] \n");
   while ((tolower(DRV) < 'a') || (tolower(DRV) > 'p'))
      DRV = getchar();
   hzn = hozon(yak_file);
   return(hzn);
end

static int  kf_setUp(char *kf_pt, char j_file[])
        /* 入力方式の設定 ( kf = 'K';キーボード、 = 'F';ファイル )  */
begin
   int j_file_open_ck = 1;

   if ((! *kf_pt) || (! strchr("KkFf",*kf_pt))) {
   _  *j_file = '\0';
   _  printf("\n");
   _  puts("日本語文をどのように入力しますか？ \n  キーボードから = K,　ファイルから読み込む = F 。  [K/F]  \n");
   _  while ((! *kf_pt) || (! strchr("KkFf",*kf_pt)))
   _     *kf_pt = getchar();
   _ *kf_pt = toupper(*kf_pt);
   }
   if (*kf_pt == 'F') {
   _  while (! *j_file) {
   _  _  printf("\n");
   _  _  printf("日本語文ファイル名を入力して下さい。\n");
   _  _  while (! *j_file)
   _  _     gets(j_file);
   _  _  j_file_open_ck = j_file_open(j_file);  /* 日本語文ファイルを開く。*/
   _  _  if (! j_file_open_ck)
   _  _     *j_file = '\0';
   _  }
   _  time(&tma);
   }
        /* 入力方式の設定が終了( kf = 'K';キーボード、 = 'F';ファイル )  */
   return(j_file_open_ck);
end


static int  rule_form_check(void)  /* 適訳・文法規則の書式をチェックする。*/
begin   /* global variables: DRV,  */
   int  file_open_err;
   char Tekiyakfile[15], tekRule[160], Bunpofile[15];
   FILE *tekpt, *bunpt;

   beeping(3);
   color_light_blue;
   printf("\n 現在、すべての適訳規則と文法規則の書式のミスをチェックしています。しばらくお待ちください．．．．\n\n");
   color_white;
   Tekiyakfile[0] = DRV;
   Tekiyakfile[1] = '\0';
   strcat(Tekiyakfile,":tekiyaku.jte");
   file_open_err = 0;
   if ((tekpt = fopen(Tekiyakfile,"r")) == NULL) {
   _  printf("\n %s がオープンできませんでした。\n",Tekiyakfile);
   _  file_open_err = 1;
   _  goto ENDFNC;
   }
   else {
   _  while(fgets(tekRule,158,tekpt))
   _     tekFormcheck(tekRule); /* 適訳規則の書式をチェックする。*/
   _  fclose(tekpt);
   }
   Bunpofile[0] = DRV;
   Bunpofile[1] = '\0';
   strcat(Bunpofile,":bunpo.jte");
   if ((bunpt = fopen(Bunpofile,"r")) == NULL) {
   _  printf("Bunpofile がオープンできませんでした。");
   _  file_open_err = 1;
   _  goto ENDFNC;
   }   /* デバッグモードの時は、あらかじめ全ての規則の書式をチェックする。*/
   else {
   _  *pbun = '\0';
   _  while (fgets(pbun,184,bunpt))
   _     bunFormcheck(); /* 文法規則の書式をチェックする。*/
   _  fclose(bunpt);
   _  beeping(3);
   _  color_green;
   _  printf("\n 書式のチェックは終了しました。ミスは発見されませんでした。\n");
   _  color_white;
   }
  ENDFNC:
   return(file_open_err);
end



static void ajClear(int t)  /* 訳語を入れる変数たちの初期化 */
begin
   int i, j;

   for (i = t; i <= WordNumb - 1; i++) {
   _  for (j = 0; j <= YakMaxCt; j++) {
   _  _  aj[i][j][0] = '\0';
   _  _  az[i][j][0] = '\0';
   _  }
   _  jn[i][0] = '\0';
   _  jn0[i][0] = '\0';
   }
end


static void zbClear(void)  /* 前文情報を保存する変数たちの初期化 */
begin
   *sj = *sj2 = *oj = *oj2 = *vr = *vr2 = '\0';
   *sz = *sz2 = *oz = *oz2 = *vz = *vz2 = '\0';
   *washa = *washa2 = *washa3 = *wasz = *wasz2 = *wasz3 = '\0';
   *sjnew = *sznew = *ojnew = *oznew = *vrnew = *vznew = '\0';
   *pjs  = *pj2 = *pes = *pe2 = '\0';
end

#if defined(USER)
static int  setDebug(char ch)   /* デバッグ時に注目するべき */
begin              /*英単語、適訳規則、文法規則（大域変数）の値をセットする。*/
         /* global variables: Dbg2, dbgfl_pt, WTWORD[], TKWATCH[], BPWATCH[] */
   int  ln, file_open_err = 0;
   char dbg_file[40], YN, watchq[256];
   

   switch(ch) {
     case 'a':
       Dbg2 = '\0';
       puts("   デバッグ情報をファイルに出力しますか？   [Y/N]    ");
       Dbg2 = getchar();
       while ((Dbg2 != 'N') && (Dbg2 != 'n') && (Dbg2 != 'Y') && (Dbg2 != 'y'))
          Dbg2 = getchar();
       Dbg2 = toupper(Dbg2);
       if (Dbg2 == 'Y') {
       _  printf("\n");
       _  printf("デバッグ出力ファイル名を入力して下さい。\n");
       _  *dbg_file = '\0';
       _  while (! *dbg_file)
       _     gets(dbg_file);
       _  dbgfl_pt = fopen(dbg_file,"w");
       _  if (! dbgfl_pt) {
       _  _  color_magenta;
       _  _  printf("\n デバッグ出力ファイルがオープン出来ませんでした。正しいドライブを指定しましたか？ \n");
       _  _  color_white;
       _  _  beeping(15);
       _  _  file_open_err = 1;
       _  _  goto ENDFNC;
       _  }
       }
       printf("\n 辞書引きステップで注目する日本語単語を指定しますか？ [Y/N]  一つだけ指定することが出来ます。\n");
       YN = '\0';
       while ((YN != 'N') && (YN != 'n') && (YN != 'Y') && (YN != 'y'))
          YN = getchar();
       YN = toupper(YN);
       if (YN == 'N')
          goto TEKYK;
       *WTWORD = '\0';
     case '4':
       if (! *WTWORD) {
       _  *watchq = '\0';
       _  printf("\n 注目する日本語単語（熟語も可）入力して下さい。\n");
       _  while (! *watchq) {
       _  _  gets(watchq);
       _  _  if (*watchq) {
       _  _  _  ln = strlen(watchq);
       _  _  _  if (ln >= JWordLen) {
       _  _  _  _  beeping(10);
       _  _  _  _  color_yellow;
       _  _  _  _  printf("\n 日本語単語（熟語）が長すぎます！！  %d 文字以下にして下さい。\n",WordLen);
       _  _  _  _  *watchq = '\0';
       _  _  _  }
       _  _  }
       _  }
       _  strcpy(WTWORD,watchq);
       }
       if (ch != 'a')
          break;
      TEKYK:
       *TKWATCH = '\0';
       printf("\n 注目する適訳規則を指定しますか？ [Y/N]  一つだけ指定することが出来ます。\n");
       YN = '\0';
       while ((YN != 'N') && (YN != 'n') && (YN != 'Y') && (YN != 'y'))
          YN = getchar();
       YN = toupper(YN);
       if (YN == 'N')
          goto BUNPO;
     case '5':
       if (! *TKWATCH) {
       _  *watchq = '\0';
       _  printf("\n 注目する適訳規則の番号を４桁の数字で指定して下さい。\n");
       _  getWatchNb(watchq);      /* 注目する規則の番号の入力を促す。*/
       _  strcpy(TKWATCH,watchq);
       }
       if (ch != 'a')
          break;
      BUNPO:
       *BPWATCH = '\0';
       printf("\n 注目する文法規則を指定しますか？ [Y/N]  一つだけ指定することが出来ます。\n");
       YN = '\0';
       while ((YN != 'N') && (YN != 'n') && (YN != 'Y') && (YN != 'y'))
          YN = getchar();
       YN = toupper(YN);
       if (YN == 'N')
         goto ENDFNC;
     case '6':
       if (! *BPWATCH) {
       _  *watchq = '\0';
       _  printf("\n 注目する文法規則の番号を４桁の数字で指定して下さい。\n");
       _  getWatchNb(watchq);      /* 注目する規則の番号の入力を促す。*/
       _  strcpy(BPWATCH,watchq);
       }
   }
  ENDFNC:
   return(file_open_err);
end

static void getWatchNb(char watchq[])  /* 注目する規則の番号の入力を促す。*/
begin
   int  ln;
   
   while (! *watchq) {
   _  gets(watchq);
   _  if (*watchq) {
   _  _  ln = strlen(watchq);
   _  _  if (ln != 4) {
   _  _  _  beeping(2);
   _  _  _  color_yellow;
   _  _  _  printf("\n ４桁の番号を入力して下さい！！ \n");
   _  _  _  *watchq = '\0';
   _  _  }
   _  }
   }
end
#endif

static char hozon(char yak_file[]) /* 訳文を保存するかどうかの問い合わせ */
begin
   char hzn = '\0';
   
   printf("\n");
   puts("訳文をファイルに保存しますか？    [Y/N]  \n");
   while ((hzn != 'N') && (hzn != 'n') && (hzn != 'Y') && (hzn != 'y'))
         hzn = getchar();
   yak_file[0] = '\0';
   if ((hzn == 'Y') || (hzn == 'y')) {
   _  printf("\n");
   _  puts("訳文を保存するファイル名を入力して下さい。（半角英数　８文字以内）　\n");
   _  while (! isalpha(yak_file[0]))
   _     gets(yak_file);
   }
   return(hzn);
end

static int sentInput(char *kf, char egs[], char *NT, int nh, int *yomu, char lsta[], char lend[],  char hzn)  /* 日本語文の入力 */
begin   /* global variable: jps[] */
   int  rtn, sentCk;  /* 引数 kf を *kf に是正した。2001.06.14 */
   char   j_file[20];


   if ((*kf != 'K') && (*kf != 'k') && (*kf != 'F') && (*kf != 'f')) {
   _  printf("\n");
   _  puts("日本語文をどのように入力しますか？ \n  キーボードから = K,　ファイルから読み込む = F 。  [K/F]  \n");
   _  while ((*kf != 'K') && (*kf != 'k') && (*kf != 'F') && (*kf != 'f'))
   _     *kf = getchar();
   _  if ((*kf == 'F') || (*kf == 'f')) {
   _  _  printf("\n");
   _  _  printf("日本語文ファイル名を入力して下さい。\n");
   _  _  *j_file = '\0';
   _  _  while (! *j_file)
   _  _     gets(j_file);
   _  _  jf_pt = fopen(j_file,"r");
   _  _  if (! jf_pt) {
   _  _  _  color_magenta;
   _  _  _  printf("\n 日本語文ファイルがオープン出来ませんでした。正しいドライブを指定しましたか？ \n");
   _  _  _  color_white;
   _  _  _  beeping(15);
   _  _  _  exit(1);
   _  _  }
   _  _  if (strstr(j_file,".REI") || strstr(j_file,".rei")) {
   _  _  _  nh = 1;
   _  _  _  *yomu = 1;
   _  _  _  lesson(lsta,lend);
   _  _  }
   _  _  time(&tma);
   _  }
   _  else
   _     *yomu = 0;
   }     /* 入力方式の設定が終了( *kf = 'K';キーボード、 = 'F';ファイル )  */
   rtn = 0;
   if ((*kf == 'F') || (*kf == 'f'))
      rtn = fileInput(lsta,lend,yomu,&sentCk,hzn,NT,nh,egs);
					 /* 日本語文ファイル j_file[] からの日本語文 jps[] の入力 */
   else
      if ((! *jps) && ((*kf == 'K') || (*kf == 'k'))) {
      _  keyboard();                 /* キーボードからの日本語文入力 */
      _  if (strcmp(jps,"!END") == 0) {
      _  _  sentCk = -1;
      _  _  *NT = 'N';
      _  _  rtn = 1;
      _  }
      }
   if (! rtn) {
   _  sentCk = spacedel(); /* 余分の空白を削る。jpredit モジュールにある。*/
   _  if (sentCk)
   _     *jps = '\0';
   _  else
   _     if (strlen(jps) >= JSentLen - 4)
   _        tooLong(); /* 入力された日本語文が長すぎるとき */
   }
   return(sentCk);
end


static int  j_file_open(char j_file[])
                         /* 日本語文ファイルを開く。*/
begin  /* global variable:  jf_pt  */

   jf_pt = fopen(j_file,"r");
   if (! jf_pt) {
   _  color_magenta;
   _  printf("\n j_file[] =:= %s \n",j_file);
   _  printf("\n 日本語文ファイルがオープン出来ませんでした。正しいドライブを指定しましたか？ \n");
   _  color_white;
   _  beeping(5);
   _  return(0);
   }
   else
	  return(1);
end



static int  fileInput(char lsta[], char lend[], int *yomu, int *sentCk, char hzn, char *NT, int nhv, char egs[]) 
                  /* 日本語文ファイルからの入力 */
begin   /* global variables: jf_pt, jps[] */
   int quit, rtn = 0;
   char *ptz;
   
   quit = 0;
   if (fgets(jps,JSentLen,jf_pt)) {
   _  ptz = strchr(jps,'\n');
   _  if (ptz)
   _     *ptz = '\0';
   _  while (*jps == ' ')
   _     ptcut(jps,1);
   _  if (! *jps) {
   _  _  strcpy(egs,"(A vacant line.)");
   _  _  zbClear();
   _  _  *sentCk = 1;
   _  _  rtn = 1;
   _  }
   _  if (strlen(jps) >= JSentLen - 2)
   _     tooLong(); /* 入力された日本語文が長すぎるとき */
   _  if ((nhv == 1) && *jps) {
   _  _  *sentCk = 0;
#if defined(USER)
   _  _  if (jps == strstr(jps,"第"))
   _  _     LssCk(); /* "第？課" の書式をチェックする。 */
#endif
   _  _  *yomu = REI_yak(lsta,lend,*yomu,sentCk,hzn,NT,egs);
				     /* 拡張子 .REI を持つファイルの翻訳 */
   _  _  if (*sentCk) /* *yomu = 1;指定範囲以前、 = 0;指定範囲内、  */
   _  _     rtn = 1;                         /*   = -1;指定範囲終了 */
   _  }
   _  else {
   _  _  if ((jps[0] == '[') && (strlen(jps) <= 4) && strchr(jps,']')) {
   _  _  _  strcpy(egs,jps);  /* .rei 以外の例文ファイルにも拡張した。*/
   _  _  _  zbClear();        /* 2003.11.21 */
   _  _  _  *sentCk = 1;
   _  _  _  rtn = 1;             
   _  _  }
   _  }
  }
   else
      quit = 1;
   if (quit) {
   _  time_record(hzn);   /* record the execution time. */
   _  *NT = 'Q';
   _  egs[0] = '\0';
   _  jps[0] = '\0';
   _  *sentCk = -1;
   _  rtn = 1;
   }
   return(rtn);
end

static void keyboard(void)     /* キーボードからの日本語文入力 */
begin      /* global variable:  jps[]  */

   printf("\n");
   printf("   英訳させたい日本語文を入力して下さい。（%d 文字以下）\n",JSentLen - 10);
   printf("\n");
   gets(jps);
   if (jps[0] == '\0')
      gets(jps);
end

static void tooLong(void) /* 入力された日本語文が長すぎるとき */
begin      /* global variable: jps[] */

   color_light_blue;
   printf("\n\n input sentence = %s ",jps);
   color_red;
   printf("\n\n 日本語文が長過ぎて翻訳出来ません。\n 日本語文を短くして、入力をやり直して下さい！！\n");
   color_white;
   beeping(10);
   exit(1);
end

static void lesson(char lsta[],char lend[])  /* 例文ファイル「---.rei」の処理のための初期設定 */
begin
   int  nsta, nend;

   printf("\n\n\n");
   nsta = nend = 0;
   *lsta = '\0';
   *lend = '\0';
   puts("第何課から始めますか？　A; 1 =< A =< 40 \n");
   while (nsta < 1 || nsta > 40)
      scanf("%d",&nsta);
   numbtozen(nsta,lsta);
   ptinsert(lsta,"第");
   strcat(lsta,"課");
   puts("第何課まで訳しますか？　Z; 1 =< A =< Z =< 40 \n");
   while (nend < nsta || nend > 40)
      scanf("%d",&nend);
   nend++;
   numbtozen(nend,lend);
   ptinsert(lend,"第");
   strcat(lend,"課");
end

#if defined(USER)
static void LssCk(void)        /* "第？課" の書式をチェックする。 */
begin         /* global variable: jps[] */
   int  ln;
   char *ptsp, baikaku[3];

   ln = strlen(jps);
   ptsp = jps + ln;
   while (*(--ptsp) == ' ')
      *ptsp = '\0';
   if ( (ln < 6) || ((ln > 8) && ((jps + 4) == strstr(jps + 4,"課"))) ) {
   _  color_light_blue;  /* jps[] = "第２次世界大戦...." の場合に対処した。2003.12.20 */
   _  printf("\n 日本語文 = %s ",jps);
   _  color_yellow;
   _  printf("\n\n 日本語文ファイルの冒頭は、「第」+ （倍角数字）+ 「課」+「復改(Enter)」 としてください。「課」の後ろに文字や空白を入れないように！！\n\n");
   _  color_white;
   _  beeping(10);
   _  exit(1);
   }
   else {
   _  if (strchr(jps,' ') || strcmp(jps + ln - 2,"課")) {
   _  _  ptcpy(baikaku,jps + 2,jps  + 4);
   _  _  if (! strstr("１２３",baikaku)) {
   _  _  _  color_yellow;
   _  _  _  printf("\n 日本語文 = %s ",jps);
   _  _  _  color_green;
   _  _  _  printf("\n\n 日本語文ファイルの冒頭は、「第」+ （倍角数字）+ 「課」（+「復改(Enter)キー」を打つ）としてください。（数字）の後ろに文字や空白を入れないように！！\n\n");
   _  _  _  color_white;
   _  _  _  beeping(10);
   _  _  _  exit(1);
   _  _  }
   _  }
   }
end
#endif


static int  REI_yak(char lsta[], char lend[], int yomu, int *sentCk, char hzn, char *NT, char egs[])        /* 拡張子 .REI を持つファイルの翻訳 */
		/* global variables: ct, jps[] */
begin
   int  ln;
   char dmy[10];

   if ((strcmp(jps,lsta) == 0) || (strcmp(jps,lend) == 0))
      yomu--;
   if (yomu) {
   _  if (yomu < 0) {
   _  _  time_record(hzn); /* 翻訳経過時間を記録する。 */
   _  _  *NT = 'Q';
   _  }
   _  *sentCk = -1;
   }
   else {
   _  if ((jps[0] == '[') && (strlen(jps) <= 4) && strchr(jps,']')) {
   _  _  strcpy(egs,jps);
   _  _  zbClear();
   _  _  *sentCk = 1;
   _  }
   _  else {
   _  _  ln = strlen(jps);
   _  _  if (((ln == 6) || (ln == 8)) && (strstr(jps,"第") == jps) && (strcmp(jps + ln - 2,"課") == 0)) {
   _  _  _  ptcpy(dmy,jps + 2,jps + ln - 2);
   _  _  _  nzentohan(dmy,egs);
   _  _  _  ptinsert(egs,"Lesson ");
   _  _  _  zbClear();
   _  _  _  *sentCk = 1;
   _  _  }
   _  }
   }
   return(yomu);
end

static int  pre_dic(char wdh[], char wdw[], char wdp[], char wdx[], int symbCk)
begin     /* 辞書引きのための初期設定、および記号や数字の処理  */
	  /* global variables: jwd[], Cap, cnb, conj_chr */

   cnb = 0;
   if (*(jwd + 1))
      symbCk = jsymbck(wdh); /* jdiclook モジュールにある関数 */
   else
      symbCk = 1;
   if (symbCk == 1)  {
   _  strcpy(wdw,wdh);
   _  strcpy(wdp,jwd);
   _  strcpy(wdx,jwd);
   }
   else {
   _  if (! strchr("-1",conj_chr))
   _     conj_chr = '\0';
   _  cnb = -1;
   _  wdx[0] = '\0';
   }
   return(symbCk);
end

#if defined(USER)
 static void dicKakut(char wdp[], char wdh[], char wdw[], char wdx[], int symbCk, char kf, int watchPT, int *BetsuYk_pt, int *Exit_pt, char hzn)
#else
 static void dicKakut(char wdp[], char wdh[], char wdw[], char wdx[], int symbCk, char kf, int *BetsuYk_pt, int *Exit_pt, char hzn)
#endif
 begin             /* 辞書を引いて、日本語訳語を探す。*/
	   /* global variables: SERR, SERRNB, conj_chr */
#if defined(USER)
	  /* WATCHPT */
#endif
  int ppt;
  unsigned int  code;
  char jwdq[5];

  if ((symbCk < 1) || (strcmp(caz[0],"n|全") == 0)) {
  _  wdw_recover(wdp,wdh,wdw);     /*      wdw[] を復元する。*/
  _  if (conj_chr == '1') {
  _  _  if ((aj[wc][0][0] == '5') && strstr(az[wc][0],"|0") && (strcmp(jwd,"で") == 0) && (strstr(wdw,"でした") != wdw)) {
  _  _  _  strcpy(caj[0],"9and");  /* 「静か」+「で」 => "5quiet" + "9and"  */
  _  _  _  strcpy(caz[0],"F|");     /* 2000.11.07 追加した。*/
  _  _  _  cnb = 0;
  _  _  _  caj[1][0] = '\0';
  _  _  _  goto Kakut;
  _  _  }
  _  _  else {
  _  _  _  ptcpy(jwdq,wdw,wdw + 4);
  _  _  _  ppt = ptcal(jwdq,&code);
  _  _  }
  _  }
  _  else
  _     ppt = ptcal(jwd, &code);
	    /* *** 辞書引きのページ・ポインターを計算　  **** */
  _  if (ppt >= 0) {
#if defined(USER)
  _  _  if (watchPT == ppt)
  _  _     WATCHPT = 10;
  _  _  else
  _  _     WATCHPT = 0;
#endif
 _  _  diclook(ppt,wdx,wdw,wdp,Exit_pt,hzn);
  _  _  if (*Exit_pt == 1)
  _  _     goto ENDDK;
  _  _  if ((caj[0][0] == '\0') &&(wdx[0] =='\0')) /* 辞書引きが失敗した時の処理 */
  _  _     jishoFail(wdx,wdh,wdp,wdw,kf);
		       /* 語尾が活用しているものと仮定して、原型復元を試みる */
  _  }
  _  else
  _     symbCk = hankaku_shori(symbCk,wdw); /* 半角文字列の単語の処理 */
  }
  else
     if ( (! *(jwd + 1)) && (! strstr(caz[0],"半")) )
    	symbCk = hankaku_shori(symbCk,wdw); /* 半角文字列の単語の処理 */
 Kakut:;
  kakut(wdp,wdx,wdw,wdh);
			  /* 単語の区切りの確定、次の単語の辞書引きへ */
  if ((SERR > 1) && (! conj_chr)) {
  _  if (SERRNB >= 0) {
  _  _  *BetsuYk_pt = shpErr(wdh,wdp,hzn,*BetsuYk_pt,Exit_pt);
			/* '#'エラー(埋め込み型熟語)からの回復 */
  _  _  *wdp = '\0';    /* 親関数（jtoe_main()）の DIC: へバックトラックする。*/
  _  }
  _  else {
  _  _  beeping(15);
  _  _  printf("\n '#' 熟語のエラーです。\n");
  _  _  printf("    wdh = %s, wdp = %s \n",wdh,wdp);
  _  _  if (hzn == 'Y' || hzn == 'y') {
  _  _  _  fprintf(yakbn,"\n '#' 熟語のエラーです。\n");
  _  _  _  fprintf(yakbn,"    wdh = %s, wdp = %s \n",wdh,wdp);
  _  _  }
  _  _  *Exit_pt = 1;
  _  }
  }
 ENDDK:;
end

static void wdw_recover(char wdp[],char wdh[],char wdw[])
                                           /* wdw[] を復元する。 */
begin   /* global variables: jwd[], ct, conj_chr */
   int lnp;

   if (conj_chr && (! strchr("-01",conj_chr)))  {
   _  if (*wdp)
   _     lnp = strlen(wdp);
   _  else
   _     lnp = strlen(jwd);
   _  if (wdw != strstr(wdw,jwd)) {
   _  _  if (*wdp && (wdh == strstr(wdh,wdp))) {
   _  _  _  strcpy(wdw,jwd);
   _  _  _  strcat(wdw,wdh + lnp);
   _  _  }
   _  _  else
   _  _     if ((conj_chr == 'r') && strcmp(jwd + lnp - 2,"い") == 0) {
   _  _     _  ptreplace(wdw + lnp - 2,2,"い");
	  /* 日本語単語自身だけでなく、原文中の対応する部分も原型に戻す。 */
   _  _     }
   _  }
   _  else
   _     ct = 1;
   _  if (ct == 2)
   _     ct = 0;  /* 活用型の可能性を何度も試している場合 */
   }
   else
      strcpy(wdw,wdh);
end

static int  hankaku_shori(int symbCk, char wdw[]) /* 半角文字列の単語の処理 */
begin  /* global variables: jwd[], caj[][], caz[][], cnb  */
   unsigned int  lnj;
   char *ptMaru, *ptGimon, *ptTen, *ptKakko, *ptS, *wdw3, gobi[3], qconj_chr[2];

   ptMaru = strstr(jwd,"。");
   if (ptMaru)
	 *ptMaru = '\0';
   else {
   _  ptGimon = strstr(jwd,"？");
   _  if (ptGimon)
   _  	 *ptGimon = '\0';
   _  else {
   _  _  ptTen = strstr(jwd,"、");
   _  _  if (ptTen)
   _  _  	 *ptTen = '\0';
   _  _  else {  /* 2000.10.13 追加した。 */
   _  _  _  ptKakko = strstr(jwd,"「");
   _  _  _  if (ptKakko)
   _  _  _     *ptKakko = '\0';
   _  _  _  else {  /* 2002.09.11 追加した。 */
   _  _  _  _  ptS = strstr(jwd + 1,"氏");
   _  _  _  _  if (ptS)
   _  _  _  _     *ptS = '\0';
   _  _  _  _  else {  /* 2002.09.16 追加した。 */
   _  _  _  _  _  ptS = strstr(jwd + 1,"’");
   _  _  _  _  _  if (ptS)
   _  _  _  _  _     *ptS = '\0';
   _  _  _  _  _  else {
   _  _  _  _  _  _  if ( (*(jwd + 1) < 'A') || (*(jwd + 1) > 'z') )
   _  _  _  _  _  _     *(jwd + 1) = '\0'; /* 2002.10.12 追加した。 */
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   if (*(jwd + 2) == ' ')
     *(jwd + 2) = '\0';
   wdw3 = wdw + 3;
   ptcpy(gobi,wdw3,wdw3 + 2);
   if (strstr("。？、はがをのにでと",gobi))
      *(jwd + 3) = '\0';
   if (strcmp(jwd,"-") == 0) {
   _  strcpy(caj[0],"0-");
   _  strcpy(caz[0],"-|");
   }
   else {
   _  strcpy(caj[0],"1");
   _  strcat(caj[0],jwd);
   _  if ( (*jwd >= 'A') && (*jwd <= 'Z') )
   _     strcpy(caz[0],"YOK|");
   _  else {
   _  _  lnj = strlen(jwd);
   _  _  if (lnj <= 2)
   _  _     strcpy(caz[0],"Y|1");
   _  _  else
   _  _     strcpy(caz[0],"Y|");
   _  }
   }
   if (conj_chr) {
   _  qconj_chr[0] = conj_chr;
   _  qconj_chr[1] = '\0';
   _  ptinsert(caz[0] + 1,qconj_chr);
   }
   symbCk = 1;
   cnb = 0;
   return(symbCk);
end


static void time_record(char hzn)    /* 翻訳にかかった時間を記録する。 */
       /* global variables: tma, tmz, yakbn, ct */
begin

   time(&tmz);
   printf("\n *******************************************\n");
     printf(" * start time   = %s ",ctime(&tma));
     printf("* end time     = %s ",ctime(&tmz));
     printf("* execution time =     %ld 秒             ",tmz - tma);
   printf("\n *******************************************\n\n\n\n");
   if (hzn == 'Y' || hzn == 'y') {
   _  _ fprintf(yakbn,"\n *******************************************\n");
   _  _ fprintf(yakbn," * start time   = %s ",ctime(&tma));
   _  _ fprintf(yakbn,"* end time     = %s ",ctime(&tmz));
   _    fprintf(yakbn,"* execution time =     %ld 秒             ",tmz - tma);
   _  fprintf(yakbn,"\n *******************************************\n\n\n\n");
   }
   beeping(9);
end


static void qstMark(void) /* 疑問符より前の単語の属性に「?」を付ける。 */
begin  /* global variables: wnb, aj[][][], az[][][] */
   int i, j, cn;

   for (i = wnb; i >= 1; i--)
      if (aj[i][0][0] == '?') {
      _  for (j = i; j >= 0; j--) {
      _  _  if ( ((aj[j][0][0] == '|') && (aj[j][0][1] == '\"')) || (aj[j][0][1] == '!') )
      _  _     break;
      _  _  if (strcmp(jn[j],"）") == 0)
      _  _     break;
      _  _  if (strcmp(jn[j],"：") == 0)
      _  _     break;
      _  _  if (jn[j] == strstr(jn[j],"．．．"))
      _  _     break;
      _  _  if ((aj[j][0][1] == '.') && (aj[j][0][2] != '.'))
      _  _     break;
      _  _  if (j && (aj[j][0][0] == '0') && (aj[j - 1][0][0] == 'X'))
      _  _     break;
      _  _  for (cn = 0; cn <= YakMaxCt; cn++) {
      _  _  _  if (aj[j][cn][0] == '\0')
      _  _  _     break;
      _  _  _  else
      _  _  _     ptinsert(az[j][cn],"?");
      _  _  }
      _  }
      _  break;
      }
end

static int  shpErr(char wdh[], char wdp[], char hzn, int BetsuYk, int *Exit_pt)
                                              /* sharp '#' error recovery */
/* global variables: no, SERRNB, Title, aj[][][], cj[][], en[][], jn0[][] */
begin
   unsigned int lnn;
   int  i, betsu;
   char *ptc;

   if (cj[SERRNB][0]) {
   _  ptc = strchr(cj[SERRNB],'#');
   _  if (ptc && isdigit(*(++ptc)))
   _     no = (*ptc) - '0' - 1;
   }             /* 埋め込まれる部分の個数のカウンター値を、元に戻しておく。*/
   else {
   _  ptc = strchr(aj[SERRNB][0],'#');
   _  if (ptc && isdigit(*(++ptc)))
   _     no = (*ptc) - '0' - 1;
   }
   predit(wdh,wdp);
   ptc = strchr(cz[SERRNB],'<');
   if (ptc) { /* 左隣の単語を取り込む熟語(<)では、取り込んでから空いた左に */
   _  if (isdigit(*(ptc + 2))) {    /* 詰めるので、元の右に戻す必要がある。*/
   _  _  strcpy(cj[SERRNB + 1],cj[SERRNB]);
   _  _  ptcpy(cz[SERRNB + 1],cz[SERRNB],ptc + 3);
   _  _  strcpy(jn[SERRNB + 1],jn[SERRNB]);
   _  _  cj[SERRNB][0] = *(ptc + 2);
   _  _  cj[SERRNB][1] = '\0';
   _  _  ptcut(ptc,3);
   _  _  strcpy(jn[SERRNB],jn0[SERRNB]);
   _  _  lnn = strlen(jn[SERRNB]);
   _  _  if (strlen(jn[SERRNB + 1]) > lnn)
   _  _     ptcut(jn[SERRNB + 1],lnn + 1);
   _  _  SERRNB++;
   _  }
   _  else {
   _  _  beeping(15);
   _  _  printf("\n\n There is no code for '<' in %s, %s \n",cz[SERRNB],cj[SERRNB]);
   _  _  printf("\n Impossible to backtrack!!! \n");
   _  _  if ((hzn == 'Y') || (hzn == 'y')) {
   _  _  _  fprintf(yakbn,"\n ****************************************\n");
   _  _  _  fprintf(yakbn,"日本語文 =  %s \n",jps);
   _  _  _  fprintf(yakbn," # 熟語からのエラー回復に失敗しました。\n");
   _  _  }
   _  _  *Exit_pt = 1;
   _  }
   }
   else
      shpErr2(wdh,Exit_pt,hzn);
   if (BetsuYk && (SERRNB >= 1)) {
   _  betsu = 0;
   _  for (i = SERRNB - 1; i >= 0; i--) {
   _  _  if (aj[i][1][0]) {
   _  _  _  betsu = 1;
   _  _  _  break;
   _  _  }
   _  }
   _  if (! betsu)
   _     BetsuYk = 0;
   }
   return(BetsuYk);
end

static void shpErr2(char wdh[], int *Exit_pt, char hzn)
			/* sharp '#' error recovery; Part 2 */
/* global variables: wc, SERRNB,shpfg, aj[][][], az[][][], cj[][], cz[][], en[][], en0[][], wd[],pwd[], conj_chr, wc, *yakbn */
begin
   register int i;
   unsigned int lnwd;
   char *ptS;

   if (SERRNB >= 1) {
   _  ptS = wdh;
   _  for (i = 1; i <= SERRNB; i++) {
   _  _  ptS = strstr(ptS,jn0[i]);
   _  }
   _  if (ptS) {
   _  _  ptptcut(wdh,ptS - 1);
   _  _  strcpy(pwd,jn[SERRNB - 1]);
   _  }
   _  else {
   _  _  beeping(15);
   _  _  printf("\n # 熟語からのエラー回復に失敗しました。\n");
   _  _  if ((hzn == 'Y') || (hzn == 'y')) {
   _  _  _  fprintf(yakbn,"\n ****************************************\n");
   _  _  _  fprintf(yakbn,"日本語文 =  %s \n",jps);
   _  _  _  fprintf(yakbn," # 熟語からのエラー回復に失敗しました。\n");
   _  _  }
   _  _  *Exit_pt = 1;
   _  }
   }
   strcpy(jwd,jn0[SERRNB]);
   lnwd = strlen(jwd);
   if (lnwd > 4)
      *(jwd + 4) = '\0';
   if (strchr(az[SERRNB][0],'p'))
      conj_chr = 'p';
   else {
   _  if (strchr(az[SERRNB][0],'O'))
   _     conj_chr = 'O';
   _  else {
   _  _  if (strchr(az[SERRNB][0],'G'))
   _  _     conj_chr = 'G';
   _  }
   }
   wc = SERRNB - 1;
   if (strchr(aj[wc][0],'#')) {
   _  strcpy(aj[wc][0],cj[wc]);
   }
   shpfg = '\0';
end
                        


static void  postDic(void)  /* **** 辞書引きが終了、その後処理  **** */
begin  /* global variable: aj[][][], az[][][], jn[][], Dbg, wnb, wc, shpfg  */
   register int i1, j;
   int i;

   wnb = wc;
   shpfg = '\0';
   if (wnb < WordNumb - 1)
      ajClear(wnb + 1);
   if (wnb)
      qstMark();
   for (i = 0; i <= wnb; i++) {
   _  if ((! aj[i][0][0]) && i < wnb) {
   _  _  for (i1 = i + 1; i1 <= wnb; i1++) {
   _  _  _  for (j = 0; j <= YakMaxCt; j++) {
   _  _  _  _  strcpy(aj[i1 - 1][j],aj[i1][j]);
   _  _  _  _  strcpy(az[i1 - 1][j],az[i1][j]);
   _  _  _  _  if (! aj[i1][j][0])
   _  _  _  _     break;
   _  _  _  }
   _  _  _  strcpy(jn[i1 - 1],jn[i1]);
   _  _  }
   _  _  wnb--;
   _  }
   _  if ((Dbg == 'Y') || (Dbg == 'y'))
   _     dicDbg(i);  /* 辞書引きの結果を表示する。 */
   }
end


static void dicDbg(int i)     /* 辞書引きの結果をスクリーンに表示する。 */
begin  /* global variables: aj[][][], az[][][] */
   register int j;
   int ln;

   printf("\n\n");
   color_yellow;
   printf("jn[%d] = %s \n",i,jn[i]);
   color_white;
#if defined(USER)
   _  if (Dbg2 == 'Y')
   _     fprintf(dbgfl_pt,"jn[%d] = %s \n",i,jn[i]);
#endif
   for (j = 0; j <= YakMaxCt; j++) {
   _  if (aj[i][j][0] == '\0')
   _     break;
   _  ln = strlen(aj[i][j]);
   _  if (ln < 14) {
   _  _  printf("aj[%d][%d] = ",i,j);
   _  _  color_magenta;
   _  _  printf("%c",aj[i][j][0]);
   _  _  color_light_blue;
   _  _  printf("%-14s",aj[i][j] + 1);
   _  }
   _  else {
   _  _  if (ln < 24) {
   _  _  _  printf("aj[%d][%d] = ",i,j);
   _  _  _  color_magenta;
   _  _  _  printf("%c",aj[i][j][0]);
   _  _  _  color_light_blue;
   _  _  _  printf("%-24s",aj[i][j] + 1);
   _  _  }
   _  _  else {
   _  _  _  printf("aj[%d][%d] = ",i,j);
   _  _  _  color_magenta;
   _  _  _  printf("%c",aj[i][j][0]);
   _  _  _  color_light_blue;
   _  _  _  printf("%s\n",aj[i][j] + 1);
   _  _  _  printf("%-23s","   ");
   _  _  }
   _  }
   _  color_green;
   _  printf("az[%d][%d] = %s   \n",i,j,az[i][j]);
   _  color_white;
#if defined(USER)
   _  if (Dbg2 == 'Y') {
   _  _  if (ln < 14)
   _  _     fprintf(dbgfl_pt," aj[%d][%d] = %-15s",i,j,aj[i][j]);
   _  _  else {
   _  _  _  if (ln < 24)
   _  _  _     fprintf(dbgfl_pt," aj[%d][%d] = %-25s",i,j,aj[i][j]);
   _  _  _  else {
   _  _  _  _  fprintf(dbgfl_pt," aj[%d][%d] = %s\n",i,j,aj[i][j]);
   _  _  _  _  fprintf(dbgfl_pt,"%-23s","   ");
   _  _  _  }
   _  _  }
   _  _  fprintf(dbgfl_pt,"az[%d][%d] = %s   \n",i,j,az[i][j]);
   _  }
#endif
   }
end

static void betsuyaku_setting(char egs[], char egs1[], char egs2[], int *ketsugou_nokori, int *k_nokori1, int *k_nokori2)
begin /* global variable: cj[][] */
   register int i;

   if (*egs1) {
   _  if (! *egs2) {
   _  _  strcpy(egs2,egs);
   _  _  *k_nokori2 = *ketsugou_nokori;
   _  _  *egs = '\0';
   _  _  *ketsugou_nokori = 0;
   _  }
   }
   else {
   _  strcpy(egs1,egs);
   _  *k_nokori1 = *ketsugou_nokori;
   _  *egs = '\0';
   _  *ketsugou_nokori = 0;
   }
   for (i = 0; i <= WordNumb - 1; i++)
      cj[i][0] = '\0';
end

static int yaku_swap(char egs[], char egs1[], int ketsugou_nokori, int *k_nokori1)
begin
   int  q_nokori;
   char q_egs[YakuLen];
   
   if (ketsugou_nokori && (! *k_nokori1)) {
   _  strcpy(q_egs,egs1);
   _  q_nokori = *k_nokori1;
   _  strcpy(egs1,egs);
   _  *k_nokori1 = ketsugou_nokori;
   _  strcpy(egs,q_egs);
   _  ketsugou_nokori = q_nokori;
   }
   if ((SERR == 5) && *egs1 && (! *egs)) {
   _  strcpy(egs,egs1);
   _  *egs1 = '\0';
   _  SERR = 0;
   }
   return(ketsugou_nokori);
end


static void  data_push(char egs[])       /*  前文データの更新 */
begin  /* global variables: pjs[],pj2[],pes[],pe2[] */
                         /* vrnew[],vr[],vr2[],vznew[],vz[],vz2[] */

   strcpy(pj2,pjs);
   strcpy(pjs,jps);
   strcpy(pe2,pes);
   strcpy(pes,egs);
   if (*sjnew) {
   _  strcpy(sj2,sj);
   _  strcpy(sz2,sz);
   _  strcpy(sj,sjnew);
   _  strcpy(sz,sznew);
   _  *sjnew = '\0';
   }
   if (*ojnew) {
   _  strcpy(oj2,oj);
   _  strcpy(oz2,oz);
   _  strcpy(oj,ojnew);
   _  strcpy(oz,oznew);
   _  *ojnew = '\0';
   }
   if (*vrnew) {
   _  strcpy(vr2,vr);
   _  strcpy(vz2,vz);
   _  strcpy(vr,vrnew);
   _  strcpy(vz,vznew);
   _  *vrnew = '\0';
   }
end

static int  f_close(char hzn, char kf)
                                  /* ファイルをすべてクローズして終了する。 */
begin  /* global variables: *jed, *yakbun, *jf_pt, *outfl_pt */

   if (hzn == 'Y' || hzn == 'y')
      fclose(yakbn);
   if (kf == 'F' || kf == 'f')
      fclose(jf_pt);
#if defined(USER)
   if (Dbg2 == 'Y')
      fclose(dbgfl_pt);
#endif
   return(fclose(jed));
end
