#include <stdio.h>     /* *****  posted.c  ****** */
#include <string.h>    /* siage, yakugoConnec, preConnec, adv_noun_conn */
#include <ctype.h>     /* X_connec, yaku_conn, akiSakujo, suiko, yakuDisp */
/* #include <process.h> */    /*           for MS-C && TURBO C++ */
/*   #include <stdlib.h>             for Lattice C   */
			/* nextSent  */

/*  #define  QWJTOE  */

#define  USER

#include "macro.h"

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

static void yakugoConnec(char egs[]);
static void preConnec(char csq[]);
static int  adv_noun_conn(int clbegin, int clend, int ln, char csqcl[], char egs[]);
static void X_connec(int clend, char *pcX);
static int  yaku_conn(int i, int ln, char egs[]);
static void akiSakujo(char egs[]);
static void kaiwaComma(char egs[]);
static void toUpperCase(char egs[]);
static void suiko(char egs[]);
static void betsuyaku_record(char egs[], char egs1[], char egs2[], int k_nokori1, int k_nokori2);

int  siage(char egs[])  /**********  訳文の最終的な処理  ************/
begin                   /* global variables: jps[], wnb, ct, cj[][] */
   register int i;
   unsigned int lneg; 
   int aki, j2, ketsugou_nokori;
   char umw[JSentLen], preced[5], *ptp, *ptq, *ptr;
   char c0, cj0;

   aki = 0;
   ketsugou_nokori = 1;
   for (i = wnb - 1; i >= 0; i--) {
   _  ptq = strchr(cj[i],'>');
   _  if (ptq) {
   _  _  *umw = '\0';                /* '>' を含む熟語の処理 */
   _  _  for (j2 = i + 1; j2 <= wnb - 1; j2++) {
   _  _  _  cj0 = cj[j2][0];
   _  _  _  if (cj0 == '0' || cj0 == '?' || cj0 == '!' || cj0 == '|') {
   _  _  _  _  if ((j2 < wnb - 1) && isalpha(cj[j2 + 1][1]))
   _  _  _  _     cj[j2 + 1][1] = toupper(cj[j2 + 1][1]);
   _  _  _  _  break;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  ptr = cj[j2]; /* '>' に埋め込む訳語達を umw[] に結合して行く。*/
   _  _  _  _  strcat(umw,ptr + 1);
   _  _  _  _  *ptr = '\0';
   _  _  _  }
   _  _  }
   _  _  aki = 1;
   _  _  ptreplace(ptq,1,umw);
   _  _  break;
   _  }
   }
   if (aki == 1)
      akitsume();
   if (wnb == 0)
      ketsugou_nokori = 0;
   else {
   _  c0 = cj[1][0];
   _  if (c0 == '0' || c0 == '?' || c0 == '!' || c0 == '\0' || (cj[0][0] == '|' && c0 == 'X'))
   _     ketsugou_nokori = 0;
   _  if (cj[0][0] == '1' && c0 == '|' && cj[2][0] == 'X' && (cj[3][0] == '|' || cj[4][0] == '|'))
   _     ketsugou_nokori = 0;
   }
   yakugoConnec(egs);   /* 訳語（英単語）を結合する */
   ptq = strstr(egs," .");
   if (ptq && ((*(ptq + 2) == ' ') || (! *(ptq + 2)))) {
   _  if (*(ptq + 2) && isalpha(*(ptq + 3)))
   _     *(ptq + 3) = toupper(*(ptq + 3));
   _  ptcut(ptq,1);
   }
   akiSakujo(egs);      /* 余分な空白や原型情報を削除する。 */
   suiko(egs);          /* 推こうプロセス */
   ptr = jps;
   if (strstr(jps,"：") || strstr(jps,"「")) {
   _  lneg = strlen(egs);
   _  ptp = strstr(egs,". ");
   _  while (ptp && ((ptp - 1) != strstr(ptp - 1, ".. yes"))) { /* ２番目の条件を加えた。2004.06.06 */
   _  _  *preced = '\0';
   _  _  if ((lneg > 5) && (egs + 3 < ptp))
   _  _     ptcpy(preced,ptp - 3,ptp);
   _  _  if ( (! *preced) || ((! strstr(preced,"Mr")) && (! strstr(preced,"Mrs")) && 
   (! strstr(preced,"D.C")) && (! strstr(preced,".m")) && (! strstr(preced,"P.E"))) ) {  /* a.m., p.m. 2004.06.13 */
   _  _  _  ptr = strstr(ptr,"。"); /* 上で Washington, D.C. にも対応した。 2004.02.01 */
   _  _  _  if (ptr) {              /* P.E. にも対応した。 2004.07.17 */
   _  _  _  _  ptp += 2;
   _  _  _  _  if (isalpha(*ptp))
   _  _  _  _     *ptp = toupper(*ptp);
   _  _  _  _  ptr += 2;
   _  _  _  }
   _  _  _  else
   _  _  _     break;
   _  _  }
   _  _  else
   _  _     ++ptp;
   _  _  ptp = strstr(ptp,". ");
   _  }
   }
   ptq = strstr(egs," , ");
   if (ptq)
      ptcut(ptq,1);
   ptq = strstr(egs," @");
   while (ptq) {
   _  ptcut(ptq,2);
   _  ptq = strstr(ptq," @");
   }
   return(ketsugou_nokori);
end

static void yakugoConnec(char egs[])      /* 訳語（英単語）を結合する */
begin      /* global variables:  wnb, cj[][] */
   register int i;
   int  ln, clbegin, clend, clend2, clend3, clend4;
   char cj0, csq[WordNumb], csqcl[WordNumb], *pc3, *pcX, *ptd;
   
   egs[0] = '\0';
   ln = 0;
   for (i = 0; i <= wnb; i++)
      csq[i] = cj[i][0];
   csq[wnb + 1] = '\0';
   preConnec(csq); /* 訳語を結合する前の、前置詞と接続詞の前処理 */
   clbegin = 0;
   do {
   _  clend = ninstrc(clbegin + 1,csq,'0');
   _  clend2 = ninstrc(clbegin + 1,csq,'|');
   _  clend3 = ninstrc(clbegin + 1,csq,'!');
   _  clend4 = ninstrc(clbegin + 1,csq,'?');
   _  if ((! clend) || (clend2 && (clend2 < clend)))
   _     clend = clend2;
   _  if ((! clend) || (clend3 && (clend3 < clend)))
   _     clend = clend3;
   _  if ((! clend) || (clend4 && (clend4 < clend)))
   _     clend = clend4;
   _  if (! clend)
   _     clend = wnb;
   _  else
   _     clend--;
   _  ptcpy(csqcl,csq + clbegin,csq + clend + 1);
   _  ln = adv_noun_conn(clbegin, clend, ln, csqcl, egs);
                    /* 副詞および（代）名詞の結合 */
   _  str_rchr(csqcl,'X',pcX,ptd);
   _  if (! pcX) {
   _  _  str_rchr(csqcl,'3',pcX,ptd);
   _  _  ;  /* macro "str_rchr" taisaku */
   _  }
   _  else {
   _  _  str_rchr(pcX,'3',pc3,ptd); /* 'X'（節）または '3'（動詞句）の訳語は */
   _  _  if (pc3)                                      /* 末尾に移動させる。*/
   _  _     pcX = pc3;
   _  }
   _  if (pcX)
   _     X_connec(clend,pcX); /* 'X' （節）の結合 */
   _  for (i = clbegin; i <= clend; i++) {
   _  _  cj0 = cj[i][0];
   _  _  if ( cj[i + 1][0] == 'X' && (cj0 == '?' || cj0 == '!') && (*(cj[i] + 4) != ' ') )
   _  _     ptinsert(cj[i] + 3,"  ");
   _  _  if (cj[i][1])
   _  _     ln = yaku_conn(i, ln, egs); /* egs[] に i 番目の訳語を結合する。 */
   _  }
   _  clbegin = clend + 1;
   } while (clend < wnb);
   for (i = 0; i <= WordNumb - 1; i++)
      cz[i][0] = '\0'; /* 属性変数をゼロで初期化しておく。 */
end



static void preConnec(char csq[]) /* 訳語を結合する前の、前置詞と接続詞の前処理 */
begin   /* global variables: cj[][], cz[][]  */
   int i, j;
   
   for (i = 1; i <= wnb - 2; i++) {
   _  if (strchr("0?!|",csq[i]) && (cj[i][1] != ',') && (cj[i][1] != '-') && (cj[i + 2][0] != '4')) {
   _  _  if ((cj[i + 2][0] != '7') && (! strchr(cz[i + 2],'i')))
   _  _     cj[i + 1][1] = toupper(cj[i + 1][1]);
   _  }
   }
   j = 1;
   i = ninstrc(j,csq,'7');
   while (i) {
   _  if ((csq[i - 2] == '1') || (csq[i - 2] == '2') || ((csq[i - 2] == '3') && strchr(cz[i - 2],'G'))) {
   _  _  strcat(cj[i - 1]," ");
   _  _  strcat(cj[i - 1],cj[i - 2] + 1);
   _  _  cj[i - 1][0] = '6';
   _  _  cj[i - 2][0] = '\0';
   _  _  cj[i - 2][1] = '\0';
   _  }
   _  j = i + 2;
   _  i = ninstrc(j,csq,'7');
   }
   j = 1;
   i = ninstrc(j,csq,'9');
   while (i) {
   _  if ((i > 1) && ((csq[i] == '1') || (csq[i] == '2')) && ((csq[i - 2] == '3') || (csq[i - 2] == 'X')) && (! strchr(csq + i,'3'))) {
   _  _  ptinsert(cj[i] + 1,cj[i - 1] + 1);
   _  _  cj[i - 1][1] = '\0';
   _  }
   _  j = i + 1;
   _  i = ninstrc(j,csq,'9');
   }
end

static int  adv_noun_conn(int clbegin, int clend, int ln, char csqcl[], char egs[])
                    /* 副詞および（代）名詞の結合 */
begin    /* global variables:  cj[][] */
   int i, j;
   char cj0;

   if (*csqcl == '0') {
   _  i = clbegin;
   _  ln = yaku_conn(i, ln, egs); /* 訳文 egs[] に i 番目の訳語を結合する。*/
   _  ptcut(csqcl,1);
   _  clbegin++;
   }
   j = 0;
   i = ninstrc(j,csqcl,'6');
   while (i) {
   _  j = i + 1;
   _  i += (clbegin - 1);
   _  ln = yaku_conn(i, ln, egs); /* 訳文 egs[] に i 番目の訳語を結合する。*/
   _  i = ninstrc(j,csqcl,'6');
   }
   for (i = clbegin; i <= clend; i++) {
   _  cj0 = cj[i][0];
   _  if (strchr("12589",cj0) && ((! i) || (cj[i - 1][0] != '7')))
   _     ln = yaku_conn(i, ln, egs); /* egs[] に i 番目の訳語を結合する。 */
   }
   return(ln);
end

static void X_connec(int clend, char *pcX) /* 'X' （節）の結合 */
begin            /* global variable: cj[][]    */
   int  j;
   char cj0;
   
   j = clend + 1 - strlen(pcX);
   if ((j < clend) && isdigit(cj[j + 1][0])) {
   _  cj0 = cj[clend][0];
   _  if ((cj0 == '0') || (cj0 == '?') || (cj0 == '!') || (cj0 == '|')) {
   _  _  if ((strcmp(cj[clend],"0-") == 0) || (strcmp(cj[clend],"0−") == 0))
   _  _     ptinsert(cj[clend] + 1," ");
   _  _  ptinsert(cj[clend] + 1,cj[j] + 1);
   _  }
   _  else {
   _  _  strcat(cj[clend],cj[j] + 1);
   _  }
   _  cj[j][1] = '\0';
   }
end

static int yaku_conn(int i, int ln, char egs[])
                                /* 訳文 egs[] に i 番目の訳語を結合する。 */
begin                           /* global variables:  cj[][], egs[]    */
   char * ptcj, *ptq, *ptsp, *ptr;
   
   if (i)
      ptcj = cj[i] + 1;
   else {
   _  if (strlen(cj[0]) > 3)
   _     ptcj = cj[0] + 3;
   _  else
   _     ptcj = cj[0] + 1;
   }
   ptq = strchr(ptcj,'(');
   while (ptq) {   /* 動詞の原型情報を削除する。 */
   _  ptsp = strchr(ptq + 1,' ');
   _  ptr = strchr(ptq + 1,')');
   _  if (ptr) {
   _  _  if ((! ptsp) || (ptr < ptsp))
   _  _     ptptcut(ptq,ptr);
   _  }
   _  ptq = strchr(ptq + 1,'(');
   }
   if (ln + strlen(cj[i]) >= YakuLen) {
   _  if (! strstr(egs,".... 翻訳文が長く")) {
   _  _  if (ln + 36 <= YakuLen) {
   _  _  _  ptcpy(egs + ln,cj[i] + 1,cj[i] + YakuLen - ln - 35);
   _  _  _  strcat(egs,".... 翻訳文が長くなり過ぎます！！ ");
   _  _  }
   _  _  else
   _  _     strcpy(egs + YakuLen - 37,".... 翻訳文が長くなり過ぎます！！ ");
   _  _  beeping(10);
   _  _  ln = strlen(egs);
   _  }
   }
   else {
   _  if (ln && cj[i][1] && ((! strchr(cz[i - 1],'Y')) || (! strchr(cz[i],'Y')))) {
   _  _  strcat(egs," ");
   _  _  ln++;
   _  }
   _  strcat(egs,cj[i] + 1);
   _  ln += strlen(cj[i] + 1);
   }
   cj[i][1] = '\0';
   return(ln);
end

static void akiSakujo(char egs[])     /* 余分な空白や原型情報を削除する。 */
begin
   int  ln;
   char *ptq, *ptr, *ptsp, betsuyaku[JSentLen];

   ptq = strstr(egs,"  ");
   while (ptq) {
   _  ptcut(ptq,1);
   _  ptq = strstr(ptq,"  ");
   }
   while (*egs == ' ')
      ptcut(egs,1);
   ptq = strchr(egs + 2,'(');
   while (ptq) {   /* 動詞の原型情報を削除する。 */
   _  ptsp = strchr(ptq + 1,' ');
   _  ptr = strchr(ptq + 1,')');
   _  if (ptr) {
   _  _  if ((! ptsp) || (ptr < ptsp))
   _  _     ptptcut(ptq,ptr);
   _  }
   _  else {
   _  _  color_red;
   _  _  printf("不正レコード   egs = %s \n",egs);
   _  _  beeping(10);
   _  _  exit(1);
   _  }
   _  ptq = strchr(ptq + 1,'(');
   }
   if (*egs == '(') {
   _  while(*(egs + 1) == ' ')
   _     ptcut(egs + 1,1);
   }
   ptq = strstr(egs," .");
   while (ptq) {
   _  ptcut(ptq,1);
   _  ptq = strstr(ptq," .");
   }
   ptq = strstr(egs," ?");
   while (ptq) {
   _  ptcut(ptq,1);
   _  ptq = strstr(ptq," ?");
   }
   ptq = strstr(egs," !");
   while (ptq) {
   _  ptcut(ptq,1);
   _  ptq = strstr(ptq," !");
   }
   ptq = strstr(egs," , ");
   while (ptq) {
   _  ptcut(ptq,1);
   _  ptq = strstr(ptq," , ");
   }
   ptq = strstr(egs,"（");
   if (ptq)
      ptr = strstr(ptq + 1,"）");
   while (ptq && ptr) {
   _  ptcpy(betsuyaku,ptq + 2,ptr);
   _  if (! strchr(betsuyaku,',')) {
   _  _  ln = strlen(betsuyaku);
   _  _  if ((ptq - ln) == strstr(ptq - ln,betsuyaku)) {
   _  _  _  ptptcut(ptq,ptr + 1);
   _  _  }
   _  }
   _  ++ptq;
   _  ptq = strstr(ptq,"（");
   _  if (ptq)
   _     ptr = strstr(ptq + 1,"）");
   }
   ptr = strstr(egs," （");
   while (ptr) {
   _  ptcut(ptr,1);
   _  ptr = strstr(ptr + 2," （");
   }
   ln = strlen(egs);
   while(*(egs + ln - 1) == ' ') {
   _  --ln;
   _  *(egs + ln) = '\0';
   }
   if ((*(egs + ln - 2) == ' ') && (! isdigit(*(egs + ln - 1))))
      ptcut(egs + ln - 2,1);
   ln = strlen(egs);
   if ((egs + ln - 3) == strstr(egs + ln - 3," \"."))
      strcpy(egs + ln - 3,".\"");
   ptq = strstr(egs,"?.");
   while (ptq) {
   _  ptcut(ptq + 1,1);
   _  ptq = strstr(ptq,"?.");
   }
   ptq = strstr(egs," \' ");
   while (ptq) {
   _  ptr = strstr(ptq + 3," \', ");
   _  if (! ptr)
   _     ptr = strstr(ptq + 3," \' and ");
   _  if (! ptr)
   _     ptr = strstr(ptq + 3," \'.");
   _  if (! ptr)
   _     ptr = strstr(ptq + 3," \'?");
   _  if (! ptr)
   _     ptr = strstr(ptq + 3," \' ");
   _  if (ptr) {
   _  _  ptcut(ptr,1);
   _  _  ptcut(ptq + 2,1);
   _  _  ptq = strstr(ptr + 1," \' ");
   _  }
   _  else {
   _  _  ptr = strstr(ptq + 3,"’");
   _  _  if (ptr) {
   _  _  _  ptreplace(ptr,2,"\'");
   _  _  _  ptq = strstr(ptr + 1," \' ");
   _  _  }
   _  _  else {
   _  _  _  ptr = strstr(ptq + 3,"\'"); /* 肝心のこの場合が抜けていた。（バグ訂正）*/
   _  _  _  if (ptr)                    /* 2004.01.01 */
   _  _  _     ptq = strstr(ptr + 1," \' ");
   _  _  _  else {
   _  _  _  _  printf("\n\n 一重引用符エラー！！　\n   ptq = %s, egs = %s,*** \n\n",ptq,egs);
   _  _  _  _  exit(1);
   _  _  _  }
   _  _  }
   _  }
   }
   kaiwaComma(egs); /* カンマと引用符が続く場合の処理 */
   toUpperCase(egs); /* 各文の先頭を大文字にする。*/
   ptq = strstr(egs,"known as the ' ");
   if(ptq) /* 引用符の直後の余分な空白を削除する。 2005.04.03 */
      ptcut(ptq + 14,1);
   ptq = strstr(egs,"  ");
   while (ptq) {
   _  ptcut(ptq,1);
   _  ptq = strstr(ptq,"  ");
   }
   ptq = strstr(egs," : ");
   while (ptq) {
   _  ptcut(ptq,1);
   _  ptq = strstr(ptq," : ");
   }
   ptq = strstr(egs," ； ");
   while (ptq) {       /* セミコロンの直前の空白を削除する。*/
   _  ptreplace(ptq,3,";");    /* 2001.05.29 追加した。*/
   _  ptq = strstr(ptq," ； ");
   }
   ptq = strstr(egs,"( ");
   if (ptq)
      ptcut(ptq + 1,1);
   ptq = strstr(egs," )");
   if (ptq)
      ptcut(ptq,1);
end

static void kaiwaComma(char egs[]) /* カンマと引用符が続く場合の処理 */
begin
   char *ptq, *ptq2, *ptq3, *ptq4;
   
   ptq = strstr(egs,", \" ");
   while (ptq) {
   _  ptq4 = ptq + 4;
   _  ptq2 = strchr(ptq4,'\"');
   _  if (ptq2) {
   _  _  ptq3 = strchr(ptq2 + 1,'\"');
   _  _  if (! ptq3) {
   _  _  _  if ((ptq < egs + 15) || (ptq == strstr(ptq - 15,", \" "))) {  
   _  _  _  _  if (isalpha(*ptq4)) {      /* 2001.01.27 上の条件を加えた。*/
   _  _  _  _  _  *ptq4 = toupper(*ptq4);
   _  _  _  _  _  ptcut(ptq + 3,1);
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  else
   _     ptcut(ptq + 1,1);
   _  ptq = strstr(ptq + 1,", \" ");
   }
   ptq = strstr(egs," said, \" ");
   if (ptq && ('a' <= *(ptq + 9)) && (*(ptq + 9) <= 'z'))
      ptcut(ptq + 8,1);  /* 2001.01.27  追加した。*/
end


static void toUpperCase(char egs[]) /* 各文の先頭を大文字にする。*/
begin
   char *ptcol, *ptq, *ptr;

   if (isalpha(*egs))
      *egs = toupper(*egs);
   if ((*egs == '(') && isalpha(*(egs + 1)))
      *(egs + 1) = toupper(*(egs + 1));
   ptcol = strstr(egs," : ");
   ptq = strchr(egs + 1,' ');
   if (ptcol && ptq) {
   _  if (ptcol == ptq) {
   _  _  if (isalpha(*(ptcol + 3))) {
   _  _  _  *(ptcol + 3) = toupper(*(ptcol + 3));
   _  _  _  ptcut(ptcol,1);
   _  _  }
   _  }
   _  else {
   _  _  ptr = strchr(ptq + 1,' ');
   _  _  if (ptr && (ptcol == ptr)) {
   _  _  _  if (isalpha(*(ptcol + 3))) {
   _  _  _  _  *(ptcol + 3) = toupper(*(ptcol + 3));
   _  _  _  _  ptcut(ptcol,1);
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (*(ptcol + 3) == '(') {
   _  _  _  _  _  ptr = strchr(ptcol + 4,')');
   _  _  _  _  _  if ((*(ptr + 1) == ' ') && isalpha(*(ptr + 2))) {
   _  _  _  _  _  _  *(ptr + 2) = toupper(*(ptr + 2));
   _  _  _  _  _  _  ptcut(ptcol,1);
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   else
      if (ptcol)
	     ptcut(ptcol,1);
   if ((*egs == '\"') || (*egs == '\'')) {
   _  while (*(egs + 1) == ' ')
   _     ptcut(egs + 1,1);
   _  *(egs + 1) = toupper(*(egs + 1));
   }
   ptq = strstr(egs,"? ");
   ptr = strstr(egs,"! ");
   if ((! ptq) || (ptr && (ptr < ptq)))
      ptq = ptr;
   while (ptq) {
   _  ptq += 2;
   _  if (isalpha(*ptq))
   _     *ptq = toupper(*ptq);
   _  ptr = strstr(ptq,"? ");
   _  ptq = strstr(ptq,"! ");
   _  if ((! ptq) || (ptr && (ptr < ptq)))
   _     ptq = ptr;
   }
   ptq = strstr(egs,"ion. this ");
   if (ptq)
      *(ptq + 5) = toupper(*(ptq + 5));
end

void suiko(char egs[])  /* 推敲プロセス */
begin                   /* global variable: DRV  */
   int ln, shuushi_fu;
   char Suikofile[15], sko[128], mae[53], ato[53], umwd[SentLen], *ma1, *ma2, *at1, *at2;
   char *ptm, *pm1, *pm2, *pts, *egsq;
   FILE *suikpt;


/*   Suikofile[0] = DRV;
   Suikofile[1] = '\0';
   strcat(Suikofile,":suiko.jte");      UNIXでは使わない */

   strcpy(Suikofile,"suiko.jte");        /* かわりに追加 */

   suikpt = fopen(Suikofile,"r");
   mae[0] = '\0';
   ato[0] = '\0';
   while (fgets(sko,125,suikpt)) {
   _  if (! strstr(sko,"*****")) {
   _  _  ptm = strchr(sko,';');
   _  _  ptcpy(mae,sko,ptm);
   _  _  strcpy(ato,ptm + 1);
   _  _  pts = strchr(mae,'#');
   _  _  if (pts) {  /* 置換すべき文字列が '#' を含む場合 */
   _  _  _  ma1 = mae;
   _  _  _  ma2 = pts + 1;
   _  _  _  *(pts) = '\0';
   _  _  _  egsq = egs;
   _  _  _  pm1 = strstr(egsq,ma1);
   _  _  _  while (pm1) {
   _  _  _  _  ln = strlen(ma1);
   _  _  _  _  pm2 = strstr(pm1 + ln + 1,ma2);
   _  _  _  _  if (pm2) {
   _  _  _  _  _  ptcpy(umwd,pm1 + ln,pm2);
   _  _  _  _  _  if (strchr(umwd,'\"') || strchr(umwd,'?') || strchr(umwd,'!'))
		/* 「#」の部分が「.」「"」「?」「!」を含んではいけない。 */
   _  _  _  _  _     shuushi_fu = 1;
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (strstr(umwd,". ") && (! strstr(umwd,"Mr. ")) &&  (! strstr(umwd,"Mrs. ")))
   _  _  _  _  _  _     shuushi_fu = 1;
   _  _  _  _  _  _  else
   _  _  _  _  _  _     shuushi_fu = 0;
   _  _  _  _  _  }
   _  _  _  _  _  if (! shuushi_fu) {
   _  _  _  _  _  _  ato[strlen(ato) - 8] = '\0';
   _  _  _  _  _  _  pts = strchr(ato,'#');
   _  _  _  _  _  _  at1 = ato;
   _  _  _  _  _  _  if (pts) {
   _  _  _  _  _  _  _  at2 = pts + 1;
   _  _  _  _  _  _  _  *pts = '\0';
   _  _  _  _  _  _  }
   _  _  _  _  _  _  else
   _  _  _  _  _  _     at2 = pts;
   _  _  _  _  _  _  if (at2)
   _  _  _  _  _  _     ptreplace(pm2,strlen(ma2),at2);
   _  _  _  _  _  _  else
   _  _  _  _  _  _     ptcut(pm2,strlen(ma2));
   _  _  _  _  _  _  if (strcmp(ma1,at1) != 0)
   _  _  _  _  _  _     ptreplace(pm1,strlen(ma1),at1);
   _  _  _  _  _  }
   _  _  _  _  _  egsq = pm1 + 2;
   _  _  _  _  }
   _  _  _  _  else
   _  _  _  _     break;
   _  _  _  _  pm1 = strstr(egsq,ma1);
   _  _  _  }
   _  _  }
   _  _  else {            /* 置換すべき文字列が '#' を含まない場合 */
   _  _  _  ptm = strstr(egs,mae);
   _  _  _  if (ptm)  {
   _  _  _  _  ato[strlen(ato) - 8] = '\0';
   _  _  _  _  ln = strlen(mae);
   _  _  _  _  ptreplace(ptm,ln,ato);
   _  _  _  }
   _  _  _  ptm = strstr(egs,mae);
   _  _  _  while (ptm) {
   _  _  _  _  ptreplace(ptm,ln,ato);
   _  _  _  _  ptm = strstr(ptm,mae);
   _  _  _  }
   _  _  }
   _  }
   }
   fclose(suikpt);
end


void yakuDisp(char egs[], char egs1[], char egs2[], char *hzn, int ketsugou_nokori, int k_nokori1, int k_nokori2)
           /*  訳文のスクリーン表示  */
begin    /* global variable: jps[], cj[][], SERRNB, *yakbun, dbgfl_pt, Dbg2 */
   int i, nokori_q;
   char Ap[80], egsq[JSentLen];

   *egsq = '\0';
   if (*egs2 && (! *egs1)) {
   _  k_nokori1 = k_nokori2;
   _  strcpy(egs1,egs2);
   _  *egs2 = '\0';
   }
   if (*egs1 && ((! k_nokori1) || (ketsugou_nokori))) {
   _  nokori_q = ketsugou_nokori;
   _  strcpy(egsq,egs);
   _  ketsugou_nokori = k_nokori1;
   _  strcpy(egs,egs1);
   _  *egs1 = '\0';
   }
   if (*egs2) {
   _  if (*egsq) {
   _  _  if (((! k_nokori1) && ((! k_nokori2) || (nokori_q))) || ((k_nokori1) && (k_nokori2))) {
   _  _  _  k_nokori1 = k_nokori2;
   _  _  _  strcpy(egs1,egs2);
   _  _  _  *egs2 = '\0';
   _  _  }
   _  _  else {
   _  _  _  if ((k_nokori2) && (! nokori_q)) {
   _  _  _  _  k_nokori1 = nokori_q;
   _  _  _  _  strcpy(egs1,egsq);
   _  _  _  _  *egsq = '\0';
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if ((! k_nokori2) && ketsugou_nokori) {
   _  _  _  _  _  k_nokori1 = ketsugou_nokori;
   _  _  _  _  _  strcpy(egs1,egs);
   _  _  _  _  _  ketsugou_nokori = k_nokori2;
   _  _  _  _  _  strcpy(egs,egs2);
   _  _  _  _  _  k_nokori2 = nokori_q;
   _  _  _  _  _  strcpy(egs2,egsq);
   _  _  _  _  _  *egsq = '\0';
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  else {
   _  _  if (! k_nokori2) {
   _  _  _  nokori_q = k_nokori2;
   _  _  _  strcpy(egsq,egs2);
   _  _  _  k_nokori2 = k_nokori1;
   _  _  _  strcpy(egs2,egs1);
    _  _  _  k_nokori1 = ketsugou_nokori;
   _  _  _  strcpy(egs1,egs);
    _  _  _  ketsugou_nokori = nokori_q;
   _  _  _  strcpy(egs,egsq);
   _  _  _  *egsq = '\0';
   _  _  }
   _  }
   }
   if (*egsq) {
   _  if (! egs) {
   _  _  ketsugou_nokori = nokori_q;
   _  _  strcpy(egs,egsq);
   _  }
   _  else {
   _  _  if (! *egs1) {
   _  _  _  k_nokori1 = nokori_q;
   _  _  _  strcpy(egs1,egsq);
    _  _  }
   _  _  else {
   _  _  _  k_nokori2 = nokori_q;
   _  _  _  strcpy(egs2,egsq);
   _  _  }
   _  }
   }
   /* 以上の部分は、別訳が有る場合の訳文達を適当な順序にならべかえる。*/
                                                        /* 2005.01.27 */
   printf(" \n\n------------------------------------------------------------------------------\n");
   printf("   ［");  color_yellow;  printf("日本語文");  color_white;  printf("］   ");
   color_yellow;  puts(jps);  color_white;
   printf("------------------------------------------------------------------------------\n");
   printf("   ［翻訳文］  ");
   puts(egs);
   printf("------------------------------------------------------------------------------\n");
   *Ap = '\0';
   if (ketsugou_nokori) {
   _  strcpy(Ap,"（正しい構文解析が出来ませんでした。この訳は間違っているかもしれません。）");
   _  color_red;
   _  puts(Ap);
   _  color_white;
   }
   if ( *egs1 && (strcmp(egs,egs1) == 0) )
      *egs1 = '\0';             /* 2005.01.27  補足追加 */
   if ((! *egs1) && *egs2) {
   _  strcpy(egs1,egs2);
   _  *egs2 = '\0';
   }
   if (*egs1 && strcmp(egs,egs1)) {
   _  printf("   ［別訳文］  ");
   _  if (*egs1 == ' ')
   _     ptcut(egs1,1);  /* 2003.06.22 追加した。*/
   _  puts(egs1);
   _  printf("------------------------------------------------------------------------------\n");
   _  if (k_nokori1){
   _  _  strcpy(Ap,"      （正しい構文解析が出来ませんでした。この訳は間違っているかもしれません。）");
   _  _  color_red;
   _  _  puts(Ap);
   _  _  color_white;
   _  }
   }
   if (*egs2 && strcmp(egs1,egs2)) {
   _  printf("  ［第３訳文］  ");
   _  if (*egs2 == ' ')
   _     ptcut(egs2,1);  /* 2005.01.27 追加した。*/
   _  puts(egs2);
   _  printf("------------------------------------------------------------------------------\n");
   _  if (k_nokori2){
   _  _  strcpy(Ap,"     （正しい構文解析が出来ませんでした。この訳は間違っているかもしれません。）");
   _  _  color_red;
   _  _  puts(Ap);
   _  _  color_white;
   _  }
   }
   if ((*hzn == 'Y') || (*hzn == 'y')) {
   _  fputs(jps,yakbn);
   _  fputs("\n",yakbn);
   _  fputs(egs,yakbn);
   _  if (ketsugou_nokori) {
   _  _  fputs("\n",yakbn);
   _  _  fputs(Ap,yakbn);
   _  }
   _  if (SERRNB >= 0) {
   _  _  fputs("\n",yakbn);
   _  _  fprintf(yakbn,"「%s 」の辞書引きのところで誤って # の熟語を採用してしまい、バックトラックをしてやり直しました。",aj[SERRNB][0]);
   _  _  SERRNB = -5;
   _  }
   _  betsuyaku_record(egs,egs1,egs2,k_nokori1,k_nokori2);
   }
   if (Dbg2 == 'Y') {
   _  fprintf(dbgfl_pt,"\n\n");
   _  fprintf(dbgfl_pt,"\n 原文;  %s",jps);
   _  fprintf(dbgfl_pt,"\n 訳文;  %s",egs);
   _  if (ketsugou_nokori) {
   _  _  fprintf(dbgfl_pt,"\n");
   _  _  fprintf(dbgfl_pt,Ap);
   _  }
   _  if (*egs1) {
   _  _  fprintf(dbgfl_pt,"\n 別訳文;  %s",egs1);
   _  }
   _  if (*egs2) {
   _  _  fprintf(dbgfl_pt,"\n 第３訳文;  %s",egs2);
   _  }
   }
   *egs1 = '\0';
   *egs2 = '\0';
   for (i = 0; i <= WordNumb - 1; i++)
      cj[i][0] = '\0';
end

static void betsuyaku_record(char egs[], char egs1[], char egs2[], int k_nokori1, int k_nokori2)
begin
   char Ap[80];

   if (k_nokori1 || k_nokori2)
      strcpy(Ap,"（正しい構文解析が出来ませんでした。この訳は間違っているかもしれません。）");
   else
      *Ap = '\0';
   if (*egs1 && strcmp(egs,egs1)) {
   _  fputs("\n［別訳文］\n",yakbn);
   _  fputs(egs1,yakbn);
   _  if (k_nokori1) {
   _  _  fputs("\n",yakbn);
   _  _  fputs(Ap,yakbn);
   _  }
   }
   if (*egs2 && strcmp(egs1,egs2)) {
   _  fputs("\n［第３訳文］\n",yakbn);
   _  fputs(egs2,yakbn);
   _  if (k_nokori2) {
   _  _  fputs("\n",yakbn);
   _  _  fputs(Ap,yakbn);
   _  }
   }
   fputs("\n\n",yakbn);
end


char nextSent(char kf, char *NT, char *ZB)  /* 次の日本語文の準備。 */
begin     /* global variable: jps[] */
   char dums[WordLen];

   if (*NT == 'Q') {
   _  kf = 'Q';
   _  *NT = '\0';
   _  *dums = '\0';
   _  while ((*NT != 'N') && (*NT != 'n') && (*NT != 'Y') && (*NT != 'y')) {
   _  _  puts("翻訳を続けますか？　　[Y/N]　");
   _  _  gets(dums);
   _  _  if (! *dums)
   _  _     gets(dums);
   _  _  *NT = *dums;
   _  }
   }
   else {
   _  if ((kf == 'K') || (kf == 'k')) {
   _  _  *NT = 'Y';
   _  _  jps[0] = '\0';
   _  _  while (*jps == '\0') {
   _  _  _  printf("\n 次の日本語文を入力して下さい。    ");
   _  _  _  if (*ZB == 'Y') {
   _  _  _  _  color_green;
   _  _  _  _  printf("前の文の情報を受け継ぐモードです。\n");
   _  _  _  _  printf("文脈が切れる時は「!」(と RTN) を入力して下さい。\n");
   _  _  _  _  color_white;
   _  _  _  }
   _  _  _  else {
   _  _  _  _  color_dark_blue;
   _  _  _  _  printf("前の文の情報を受け継がないモードです。\n");
   _  _  _  _  printf("文脈を受けるモードに変更する時は「!」(と RTN) を入力して下さい。\n");
   _  _  _  _  color_white;
   _  _  _  }
   _  _  _  puts("なお、翻訳を終了する時は「!END」(と RTN) を入力して下さい。\n");
   _  _  _  gets(jps);
   _  _  _  if (*jps == '\0')
   _  _  _     gets(jps);
   _  _  _  if (*jps == '!') {
   _  _  _  _  if (strcmp(jps,"!END") == 0) {
   _  _  _  _  _  *NT = 'N';
   _  _  _  _  _  break;
   _  _  _  _  }
   _  _  _  _  if (strcmp(jps,"!") == 0) {
   _  _  _  _  _  if (*ZB == 'Y') {
   _  _  _  _  _  _  *ZB = 'N';
   _  _  _  _  _  _  puts("\n\n 前文情報を削除します。次の文を入力して下さい。\n");
   _  _  _  _  _  }
   _  _  _  _  _  else {
   _  _  _  _  _  _  *ZB = 'Y';
   _  _  _  _  _  _  puts("\n\n 前文情報を保存します。次の文を入力して下さい。\n");
   _  _  _  _  _  }
   _  _  _  _  _  gets(jps);
   _  _  _  _  _  if (*jps == '\0')
   _  _  _  _  _     gets(jps);
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(kf);
end
