#include <stdio.h>   /*  *****  bunpf.c  ****  */
#include <string.h>  /* sopresv, washa_prs, zkpresv, sojShorten, dblCpy */
#include <ctype.h>   /* vrpresv, vrShorten, vr_update, minus, add, SOVadd */
/* #include <process.h> */   /*                    for MS-C && TURBO C++  */
/*   #include <stdlib.h>                     for  Lattice C */

#include "macro.h"

#include "jehonfnc.h"

static int  dblCpy(char bj[], char bjq[], char bz[], char bzq[], char cz3[]);
static void zkpresv(char bj[], char bz[], char bzq[], char cz3[], int i,
                                                                     int l3);
static unsigned int sojShorten(char bjq[], unsigned int ln);
static void vrShorten(char vrq[]);
static void vr_update(char vrq[], int i);
static int  SOVadd(char st1[], int i);

#include "honyavar.h"



void sopresv(char bj[], char bz[], int i) /* 主語または目的語の保存 */
begin /* global variables: wc, cz[], md[], sjnew[],sznew[], ojnew[],oznew[] */
   int l3, daburi;
   unsigned int lnq;
   char cz3[SentZokuLen], bzq[SentZokuLen], mdq[SentLen], *ptpar, *pt_of;

   daburi = 0;
   strcpy(mdq,md[i] + 1);
   if (mdq == strstr(mdq,"the "))
      ptcut(mdq,4);         /* 語頭の the と文末の of the ... を無視する。*/
   pt_of = strstr(mdq," of the ");   /* 2002.09.06 */
   if (pt_of)
      *pt_of = '\0';
   lnq = strlen(mdq);
   if ((*sjnew && (mdq == strstr(mdq,sjnew))) || (*ojnew && (mdq == strstr(mdq,ojnew))))
      /* 保存しようとしている訳語の先頭に最新主語または最新目的語が含まれている場合 */
      daburi = 1;
   if ( (*sj && (strlen(sj) < lnq) && (strcmp(mdq + lnq - strlen(sj),sj) == 0)) || (*oj && (strlen(oj) < lnq) && (strcmp(mdq + lnq - strlen(oj),oj) == 0)) )
      /* 保存しようとしている訳語の末尾に前の文の主語または目的語が含まれている場合 */
      daburi = 1;             /* 2002.09.08 追加した。*/
   if (strcmp(bj,mdq) == 0)
      daburi = 1;
   if (! daburi) {
   _  strcpy(cz3,cz[wc + i]);
   _  l3 = strlen(cz3) - 1;
   _  zkpresv(bj,bz,bzq,cz3,i,l3); /* 主語または目的語の属性を保存する。 */
   _  lnq = sojShorten(mdq,lnq);
	   /* 以下の操作では、主語と目的語で、ダブリが無いようにしている。 */
   _  daburi = dblCpy(bj,mdq,bz,bzq,cz3);
   }
  if ((! daburi) && (strcmp(bj,mdq) || (strchr(bz,'x') && (! strchr(cz3,'x'))) || ((! strchr(bz,'x')) && strchr(cz3,'x')))) {
   _  if (bj == sj) {
   _  _  if (*sj && *sjnew) {
   _  _  _  strcpy(sj2,sj);
   _  _  _  strcpy(sz2,bzq);
   _  _  }
   _  _  if (*sjnew) {
   _  _  _  strcpy(sj,sjnew);
   _  _  _  strcpy(sz,sznew);
   _  _  }
   _  _  strcpy(sznew,cz3);
   _  _  if (lnq < WordLen)
   _  _     strcpy(sjnew,mdq);
   _  _  else
   _  _     strcpy(sjnew,mdq + lnq - WordLen + 3);
   _  }
   _  else
   _     if (bj == oj) {
   _     _  if (*oj && *ojnew) {
   _     _  _  strcpy(oj2,oj);
   _     _  _  strcpy(oz2,bzq);
   _     _  }
   _     _  if (*ojnew) {
   _     _  _  strcpy(oj,ojnew);
   _     _  _  strcpy(oz,oznew);
   _     _  }
   _     _  strcpy(oznew,cz3);
   _     _  if (lnq < WordLen)
   _     _     strcpy(ojnew,mdq);
   _     _  else
   _     _     strcpy(ojnew,mdq + lnq - JWordLen + 3);
   _     }
   _     ptpar = strstr(ojnew,"(s)");
   _     if (ptpar && (! *(ptpar + 3)))
   _        *ptpar = '\0';
   }
end

void washa_prs(int i) /* 会話者の保存 */
begin
    /* global variables: wc, cz[], md[], washa[], washa2[], washa3[], wasz[], wasz2[], wasz3[] */
   int  daburi;
   char waszq[30], wasq[SentLen];

   daburi = 0;
   if (i < 0) {
   _  beeping(3);
   _  color_yellow;
   _  printf("\n washa_prs(); 引き数 i < 0 !! \n");
   _  color_white;
   _  exit(1);
   }
   if (*washa && (strcmp(md[i] + 1,washa) == 0))
      daburi = 1;
   else {
   _  if (*washa2 && (strcmp(md[i] + 1,washa2) == 0))
   _     daburi = 1;
   _  else {
   _  _  if (*washa3 && (strcmp(md[i] + 1,washa3) == 0))
   _  _     daburi = 1;
   _  }
   }
   if (! daburi) {
   _  strcpy(waszq,cz[wc + i]);
   _  strcpy(wasq,md[i] + 1);
   _  if (*wasq) {
   _  _  if (*washa2) {
   _  _  _  strcpy(washa3,washa2);
   _  _  _  strcpy(wasz3,wasz2);
   _  _  }
   _  _  if (*washa) {
   _  _  _  strcpy(washa2,washa);
   _  _  _  strcpy(wasz2,wasz);
   _  _  }
   _  _  strcpy(washa,wasq);
   _  _  strcpy(wasz,waszq);
   _  }
   }
end

static void zkpresv(char bj[], char bz[], char bzq[], char cz3[], int i, int l3)                              /* 主語または目的語の属性を保存する。 */
begin           /* global variables: wc. cz[][] */
   register int t, j;
   int lz;
   char ctck[30], josu[5], *ptz;
   
   if (*bj == '1')    /*  １つ前の文の情報が保存されている場合 */
     strcpy(ctck,bz);
   else                 /*  前の文の情報が保存されていない場合 */
      *ctck = '\0';
   lz = strlen(ctck) - 2;
   if (lz < 0)
      lz = 0;
   if (lz && (lz + l3 > 20)) {
   _  j = 0;      /* 新旧の属性の合計が20文字を越えるときは、ダブリを除く。 */
   _  *bzq = *ctck;
   _  bzq[1] = '\0';
   _  ptz = ctck;
   _  while(*ptz) {
   _  _  if ((*(ptz - 1) == 'y') && *(ptz + 1) && (! isalpha(*(ptz + 1)))) {
   _  _  _  ptcpy(josu,ptz,ptz + 2); /* 助数詞だけは全角文字なので、*/
   _  _  _  if (! strstr(bzq,josu))                /* 別途処理する。*/
   _  _  _     strcat(bzq,josu);
   _  _  _  ptz += 2;
   _  _  }
   _  _  else {
   _  _  _  if (! strchr(bzq,*ptz)) {
   _  _  _  _  bzq[++j] = *ptz;
   _  _  _  _  bzq[j + 1] = '\0';
   _  _  _  }
   _  _  _  ptz++;
   _  _  }
   _  }                      /* bzq[] にダブリを除いた旧属性をコピーする。 */
   _  bzq[++j] = 'b';
   _  bzq[++j] = '\0';
   _  j = 0;
   _  *ctck = *cz3;
   _  for (t = 1; t <= 29; t++)
   _     ctck[t] = '\0';
   _  for (t = 0; t <= l3; t++) {
   _  _  if (cz3[t] == '|') {
   _  _  _  strcat(ctck,cz3 + t);
   _  _  _  break;
   _  _  }
   _  _  if (! strchr(ctck,cz3[t]))
   _  _     ctck[++j] = cz3[t]; /* ctck[] にダブリを除いた新属性をコピーする。 */
   _  }
   _  strcpy(cz3, ctck);
   _  strcpy(cz[wc + i], ctck);
   _  if ((strlen(bzq) > 28) || (strlen(ctck) > 28)) {
   _  _  color_red;
   _  _  printf("\n\n\n 属性コードの長さが３０文字を越えています！！ \n\n");
   _  _  printf(" このままではプログラムが暴走する可能性があるので、中断します。 \n");
   _  _  color_white;
   _  _  printf("cj[%d] = %s  cz[%d] = %s  bzq = %s  ctck = %s \n 辞書ユーティリティで、劾当する単語の属性をへらしてください。",wc + i,cj[wc + i],wc + i,cz[wc + i],bzq,ctck);
   _  _  exit(1);
   _  }
   }
   else
      strcpy(bzq,ctck);      /* 前の文の属性を bzq[] にコピーする。 */
end


  static unsigned int sojShorten(char bjq[], unsigned int ln)
begin
   char *ptj, *ptz;

   if (ln > 40) {
   _  ptj = strstr(bjq,"（");
   _  if (ptj)
   _     ptz = strstr(ptj + 2,"）");
   _  while (ptj && ptz) {
   _  _  if ((strlen(ptz) >= 4) && strcmp(ptz + 2,"」"))
   _  _     ptptcut(ptj,ptz + 1);   /* 前方にある別訳語の候補は捨てる。 */
   _  _  else
   _  _     break;
   _  _  ptj = strstr(ptj,"（");
   _  _  if (ptj)
   _  _     ptz = strstr(ptj + 2,"）");
   _  }
   _  ptj = strstr(bjq,"（");
   _  if (ptj)
   _     ptz = strstr(ptj + 2,"）");
   _  while (ptj && ptz) {
   _  _  if (ptj >= bjq + 4)        /* 後方にある別訳語の候補は捨てる。 */
   _  _     ptptcut(ptj,ptz + 1);
   _  _  else
   _  _     break;
   _  _  ptj = strstr(ptj,"（");
   _  _  if (ptj)
   _  _     ptz = strstr(ptj + 2,"）");
   _  }
   _  ptj = strstr(bjq + 10," (");
   _  if (ptj)
   _     ptz = strchr(ptj + 2,')');
   _  if (ptj && ptz)
   _     ptptcut(ptj,ptz);
   }
   ptj = strstr(bjq,"」");
   if (ptj && (! strstr(bjq,"「")))
      ptptcut(ptj,ptj + 1);
   ln = strlen(bjq);
   if (ln >= WordLen) {
   _  ptj = strstr(bjq + 7," of ");
   _  if (ptj)
   _     *ptj = '\0';
   }
   ptj = strstr(bjq,"  ");
   while(ptj) {
   _  ptcut(ptj,1);
   _  ptj = strstr(ptj,"  ");
   }
   ln = strlen(bjq);
   return(ln);
end

static int  dblCpy(char bj[], char bjq[], char bz[], char bzq[], char cz3[])
begin /* global variables sj[], sz[], oj[], oz[], sj2[], sz2[], oj2[], oz2[] */
			      /* 主語と目的語で、ダブリが無いようにする。 */
   int  ln, lnq, daburi;

   daburi = 0;
   lnq = strlen(bjq);
   if (lnq >= 4) {
   _  ln = strlen(bj);
   _  if ((ln >= lnq) && strstr(bj + ln - lnq,bjq + 1) && ((strchr(bzq,'x') && strchr(cz3,'x')) || ((! strchr(bzq,'x')) && (! strchr(cz3,'x'))))) {
   _  _  daburi = 1;
   _  _  if (ln > lnq) {
   _  _  _  strcpy(bj,bjq);
   _  _  _  strcpy(bz,cz3);
   _  _  }
   _  }
   _  else {
   _  _  ln = strlen(sj2);
   _  _  if ((ln >= lnq) && strstr(sj2 + ln - lnq,bjq + 1) && ((strchr(sz2,'x') && strchr(cz3,'x')) || ((! strchr(sz2,'x')) && (! strchr(cz3,'x'))))) {
   _  _  _  daburi = 1;
   _  _  _  if (ln > lnq) {
   _  _  _  _  strcpy(sj2,bjq);
   _  _  _  _  strcpy(sz2,cz3);
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  ln = strlen(oj2);
   _  _  _  if ((ln >= lnq) && strstr(oj2 + ln - lnq,bjq + 1) && ((strchr(oz2,'x') && strchr(cz3,'x')) || ((! strchr(oz2,'x')) && (! strchr(cz3,'x'))))) {
   _  _  _  _  daburi = 1;
   _  _  _  _  if (ln > lnq) {
   _  _  _  _  _  strcpy(oj2,bjq);
   _  _  _  _  _  strcpy(oz2,cz3);
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  ln = strlen(sj);
   _  _  _  _  if ((bj == oj) && (ln >= lnq) && strstr(sj + ln - lnq,bjq + 1) && ((strchr(sz,'x') && strchr(cz3,'x')) || ((! strchr(sz,'x')) && (! strchr(cz3,'x'))))) {
   _  _  _  _  _  daburi = 1;
   _  _  _  _  _  if (ln > lnq) {
   _  _  _  _  _  _  strcpy(sj,bjq);
   _  _  _  _  _  _  strcpy(sz,cz3);
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  ln = strlen(oj);
   _  _  _  _  _  if ((bj == sj) && (ln >= lnq) && strstr(oj + ln - lnq,bjq + 1) && ((strchr(oz,'x') && strchr(cz3,'x')) || ((! strchr(oz,'x')) && (! strchr(cz3,'x'))))) {
   _  _  _  _  _  _  daburi = 1;
   _  _  _  _  _  _  if (ln > lnq) {
   _  _  _  _  _  _  _  strcpy(oj,bjq);
   _  _  _  _  _  _  _  strcpy(oz,cz3);
   _  _  _  _  _  _  }
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   }
   return(daburi);
end



void vrpresv(int i)  /* 動詞の訳語と属性を保存する。 */
begin  /* global variables: vrnew[], vznew[], vr[], vz[], vr2[], vz2[], md[][] */
   int ln, lnm, saiyo = 1;
   char vrq[80], dums[80], *pt, *pt2, *ptd, *ptsp, dummd[JSentLen];

   if (*vrnew)             /* vrnew[] は現在翻訳中の英文の動詞情報バッファー */
      strcpy(vrq,vrnew);
   else
      strcpy(vrq,vr);
   if (i < 0) {
   _  beeping(3);
   _  color_yellow;
   _  printf("\n vrpresv(); 引き数 i < 0 !! \n");
   _  color_white;
   _  exit(1);
   }
   ln = strlen(md[i]);
   if (*vrq == '\0') {         /* 前の文の動詞が保存されていない場合 */
   _  if (ln > JWordLen - 2) { /* 動詞の訳語が長過ぎる時は、まず別訳候補から */
   _  _  pt = strstr(md[i],"（");                         /* 削って行く。*/
   _  _  if (pt)
   _  _     ptcpy(vrq,md[i] + 1,pt);
   _  _  else
   _  _     ptcpy(vrq,md[i] + 1,md[i] + JWordLen - 1);
   _  }
   _  else
   _     strcpy(vrq,md[i] + 1);
   }
   else {            /* 既に前の文の動詞が vrq[] に保存されている場合 */
   _  if (ln > 80) { /* 動詞の訳語が長過ぎる時は、まず別訳候補から削る。*/
   _  _  pt = strstr(md[i],"ed ("); /* (動詞) + and + (動詞) の場合は採用しない。*/
   _  _  if (pt) {                  /* 2003.12.21 */
   _  _  _  pt2 = (strstr(pt + 1," and "));
   _  _  _  if (pt2) {
   _  _  _  _  ptsp = strstr(pt2 + 5, " (");
   _  _  _  _  if (ptsp) {
   _  _  _  _  _  saiyo = 0;;
   _  _  _  _  _  goto END;
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  pt = strstr(md[i],"（");
   _  _  if (pt)
   _  _     pt2 = strstr(pt,"）");
   _  _  if (pt && pt2) {
   _  _  _  ptcpy(dummd,md[i] + 1,pt);
   _  _  _  strcat(dummd,pt2 + 1);
   _  _  }
   _  _  else
   _  _     strcpy(dummd,md[i] + ln - 78);
   _  }
   _  else
   _     strcpy(dummd,md[i] + 1);
   _  ln = strlen(vrq);
   _  lnm = strlen(dummd);
   _  strcpy(dums,vrq);
   _  if ((*(vrq + ln - 1) == ')') || (dummd[lnm - 1] == ')')) {
   _  _  genkei(dums);
   _  _  genkei(dummd);
   _  }
   _  else {
   _  _  ptd =dummd;        /* 過去形が複数箇所に含まれている場合にも対応した。 */
   _  _  ptsp = strchr(ptd + 1,' ');            /* 2004.03.11 */
   _  _  while (ptsp) {
   _  _  _  if (*(ptsp + 1) == '(')
   _  _  _     genkei(ptd);
   _  _  _  ptd = ptsp + 1;
   _  _  _  ptsp = strchr(ptd + 1,' ');
   _  _  }
   _  }
   _  if (*dums && strstr(dummd,dums))
			      /* 現在の動詞(md[i])の原型が前文の動詞(vrq) */
   _     saiyo = 0;                 /* の原型を含んでいる時は採用しない。*/
   _  else {
   _  _  if (((! *vr) || (*vr && (! strstr(dummd,vr)))) && (strlen(dummd) < 82)){
   _  _  _  pt = strstr(dummd,", ");
   _  _  _  if (pt) {
   _  _  _  _  if (pt == strstr(pt,", too"))
   _  _  _  _     ptcpy(vrq,dummd,pt);
   _  _  _  _  else
   _  _  _  _     strcpy(vrq,pt + 2);
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (strlen(dummd) < 80) {
   _  _  _  _  _  strcpy(vrq,dummd); /* 前文動詞 vr[] の長さは 80 以内 */
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  sprintf(vrq," .... %s",dummd + strlen(dummd) - 70);
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else
   _  _     saiyo = 0;
   _  }
   }
   if (saiyo) {
   _  vrShorten(vrq);    /* 前文動詞情報 vrq[] を出来るだけ短縮する。*/
   _  vr_update(vrq,i);    /* 前文動詞情報 vr[] の更新 */
   }
  END:;
end

static void vrShorten(char vrq[])
begin
   int  ln;
   char *pt;
   
   pt = strchr(vrq,'>');
   if (pt)
      ptptcut(vrq,pt);
   ln = strlen(vrq);
   if (vrq[ln - 1] == ')')
      genkei(vrq);
end

static void vr_update(char vrq[], int i)
begin
 /* global variables: vrnew[], vznew[], vr[], vz[], vr2[], vz2[], cz[][], wc */

   if (*vrnew) {
   _  if (strchr(vznew,'?') && (! strchr(cz[wc + i],'?'))) {
   _  _  strcpy(vr2,vr); /* 現在翻訳中の英文の動詞に、疑問文属性とそうで */
   _  _  strcpy(vr,vrq);   /* ないものが有る場合は、疑問文でない方を先に */
   _  _  strcpy(vz2,vz);          /* 「前文情報」の方へ push してしまう。*/
   _  _  strcpy(vz,cz[wc + i]);
   _  }
   _  else {
   _  _  strcpy(vr2,vr);
   _  _  strcpy(vr,vrnew);
   _  _  strcpy(vrnew,vrq);
   _  _  strcpy(vz2,vz);
   _  _  strcpy(vz,vznew);
   _  _  strcpy(vznew,cz[wc + i]);
   _  }
   }
   else {    /* 現在翻訳中の英文の動詞情報がまだ収録されていない場合 */
   _  strcpy(vrnew,vrq);
   _  strcpy(vznew,cz[wc + i]);
   }
end


void minus(char *str, char c, int i)
                   /* 訳語や属性から、指定された文字（列）を削除する。 */
begin              /* global variables: wc, lnb, md[][], cz[][] */
   char *pt, *pt1, *pt2, *pts;

   if (strchr("TD",c)) {
   _  if (c == 'T') {                     /* 属性コード欄からの削除 */
   _  _  pt = strstr(cz[wc + i],str);
   _  _  while (pt) {
   _  _  _  ptcut(pt,strlen(str));
   _  _  _  pt = strstr(pt,str);
   _  _  }
   _  }
   _  if (c == 'D') {                 /* 第２属性コード欄からの削除 */
   _  _  pts = strchr(cz[wc + i],'|');
   _  _  pt = strstr(pts + 1,str);
   _  _  while (pt) {
   _  _  _  ptcut(pt,strlen(str));
   _  _  _  pt = strstr(pt,str);
   _  _  }
   _  }
   }
   else {
   _  if (i < 0)
   _     pts = cj[wc + i];
   _  else
   _     pts = md[i];
   _  if (strcmp(str,"（）") == 0) {
                /* 「#-（）」 => 複数の訳語候補の記述を削除するコマンド */
   _  _  pt1 = strstr(pts,"（");
   _  _  if (pt1)
   _  _     pt2 = strstr(pt1 + 2,"）");
   _  _  while (pt1 && pt2) {
   _  _  _  ptptcut(pt1,pt2 + 1);
   _  _  _  pt1 = strstr(pt1,"（");
   _  _  _  if (pt1)
   _  _  _     pt2 = strstr(pt1 + 2,"）");
   _  _  }
   _  }
   _  else {
   _  _  if (strcmp(str,"()") == 0) {
                /* 「#-()」 => 動詞訳語の原型情報を削除するコマンド */
   _  _  _  pt1 = strchr(pts,'(');
   _  _  _  if (pt1)
   _  _  _     pt2 = strchr(pt1 + 1,')');
   _  _  _  while (pt1 && pt2) {
   _  _  _  _  ptptcut(pt1,pt2);
   _  _  _  _  pt1 = strchr(pt1,'(');
   _  _  _  _  if (pt1)
   _  _  _  _     pt2 = strchr(pt1 + 1,')');
   _  _  _  }
   _  _  }
   _  _  else { /* 英語訳語 md[i][] から指定された文字列 str[] を削除する。*/
   _  _  _  pt = strstr(pts,str);
   _  _  _  while (pt) {
   _  _  _  _  ptcut(pt,strlen(str));
   _  _  _  _  pt = strstr(pt,str);
   _  _  _  }
   _  _  }
   _  }
   }
end


void add(char c, int i, char str[])
/* i番目の訳語(c=='J')または属性(c=='T')または第２属性(c=='D')に、指定された文字列str[]を付加する。*/
begin      /* global variables: md[][], wc, cz[][], en[][] */
   int  sov = 0;
   char st1[55], mdq[SentLen], *ptd, *pt_y;

   strcpy(st1,str + 1);
   sov = SOVadd(st1,i); /* SJ$,SJ2$,....,VZ$,VZ2$ 等の付加 */
   if (! sov) {
   _  if ((c == 'J') || (c == 'E')) {
   _  _  if (i >= 0)
   _  _     strcpy(mdq,md[i]);
   _  _  else
   _  _     strcpy(mdq,cj[wc + i]);
   _  }
   _  if ((*st1 == 'J') || ((*st1 == '@') && (*(st1 + 1) == 'J')) || ((*st1 == 'D') && (*(st1 + 1) == 'J')) ) {
   _  _  if (*st1 == '@')
   _  _     ptcut(st1,1);
   _  _  else
   _  _     strcat(mdq," ");  /* 英訳語に他の訳語を附加する。*/
   _  _  if (isdigit(*(st1 + 1)))
   _  _     strcat(mdq,md[*(st1 + 1) - '0'] + 1);
   _  _  else {
   _  _  _  if ((*(st1 + 1) == '-') && isdigit(*(st1 + 2)))
   _  _  _     strcat(mdq,cj[wc - (*(st1 + 2) - '0')] + 1);
   _  _  _  else { /* 「...#+DJn;」(日本語単語の付加)を実装した。2005.01.31 */
   _  _  _  _  if ( (*st1 == 'D') && (*(st1 + 1) == 'J') && isdigit(*(st1 + 2)) )
   _  _  _  _     strcat(mdq,jwn[wc + (*(st1 + 2) - '0')]);
   _  _  _ }
   _  _ } 
   _  }
   _  else {
   _  _  if ((c == 'J') || (c == 'E')) {
   _  _  _  if (*st1 == '@')
   _  _  _     ptcut(st1,1);
   _  _  _  else
   _  _  _     strcat(mdq," ");  /* 英訳語に文字列を附加する。*/
   _  _  _  strcat(mdq,st1);
   _  _  }
   _  _  else {
   _  _  _  ptd = strchr(cz[wc + i],'|');
   _  _  _  if (c == 'T') {    /* 第１属性に文字列 st1[] を附加する。*/
   _  _  _  _  pt_y = strchr(cz[wc + i],'y');
   _  _  _  _  if (ptd) {
   _  _  _  _  _  if (pt_y && (pt_y < ptd))  /* 2002.08.11 追加した。*/
   _  _  _  _  _     ptinsert(pt_y,st1);
   _  _  _  _  _  else
   _  _  _  _  _     ptinsert(ptd,st1);
   _  _  _  _  }
   _  _  _  _  else {
   _  _  _  _  _  if (cz[wc + i][0])
   _  _  _  _  _     strcat(cz[wc + i],st1);
   _  _  _  _  _  else
   _  _  _  _  _     strcpy(cz[wc + i],st1);
   _  _  _  _  _  strcat(cz[wc + i],"|");
   _  _  _  _  }
   _  _  _  }
   _  _  _  else {
   _  _  _  _  if (c == 'D') {
   _  _  _  _  _  if (ptd)
   _  _  _  _  _    strcat(cz[wc + i],st1); /* 第２属性に文字列 st1[] を附加する。*/
   _  _  _  _  _  else {
   _  _  _  _  _  _  if (cz[wc + i][0])
   _  _  _  _  _  _     strcat(cz[wc + i],"|");
   _  _  _  _  _  _  else
   _  _  _  _  _  _     strcpy(cz[wc + i],"|");
   _  _  _  _  _  _  strcat(cz[wc + i],st1);
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  }
   _  if ((*st1 == 'J') || (c == 'J') || (c == 'E')) {
   _  _  if (mdq[1] == ' ')
   _  _     ptcut(mdq + 1,1);
   _  _  if (i >= 0)
   _  _     strcpy(md[i],mdq);
   _  _  else
   _  _     strcpy(cj[wc + i],mdq);
   _  }
   }
   if (md[i][1] == ' ')
      ptcut(md[i] + 1,1);
end

static int  SOVadd(char st1[], int i) /* SJ$,SJ2$,....,VZ$,VZ2$ 等の付加 */
begin  /* global variables: sj[], sz[], oj[], oz[], vr[], vr2[], wc, cz[][], en[][], md[][] */
   int  sov = 0;
   char *pt, *ptd;

   if ((strcmp(st1,"SJ$") == 0) && *sj) {
   _  strcat(md[i]," ");
   _  strcat(md[i],sj);   /* "+SJ$" と指定された時は、sj[] を付加する */
   _  *st1 = '\0';
   _  sov = 1;
   }
   if ((strcmp(st1,"SJ2$") == 0) && *sj2) {
   _  strcat(md[i]," ");
   _  strcat(md[i],sj2);   /* "+SJ2$" と指定された時は、sj2[] を付加する */
   _  *st1 = '\0';
   _  sov = 1;
   }
   else {
   _  if ((strcmp(st1,"OJ$") == 0) && *oj) {
   _  _  strcat(md[i]," ");
   _  _  strcat(md[i],oj);     /* "+OJ$"と指定された時は oj[]を付加する */
   _  _  *st1 = '\0';
   _  _  sov = 1;
   _  }
   _  else {
   _  _  if (strcmp(st1,"OZ$") == 0) { 
                       /* "+OZ$" と指定された時は、oz[] の助数詞を付加する。*/
   _  _  _  str_rchr(oz,'y',pt,ptd);
   _  _  _  if (pt)
   _  _  _     strcpy(st1,pt);
   _  _  _  else {
             /* その場合、oz[] に助数詞が無い時は、sz[] の助数詞で代用する。*/
   _  _  _  _  str_rchr(sz,'y',pt,ptd);
   _  _  _  _  if (pt)
   _  _  _  _     strcpy(st1,pt);
   _  _  _  _  else
   _  _  _  _     *st1 = '\0';
   _  _  _  }
   _  _  _  if (*st1) {
   _  _  _  _  pt = strchr(st1,'?');
   _  _  _  _  while (pt) {
   _  _  _  _  _  ptcut(pt,1);        /* 疑問符 '?' が有れば、削除しておく。*/
   _  _  _  _  _  pt = strchr(pt,'?');
   _  _  _  _  }
   _  _  _  _  strcat(cz[wc + i],st1);
   _  _  _  _  *st1 = '\0';
   _  _  _  _  sov = 1;
   _  _  _  }
   _  _  }
   _  }
   }
   if (*st1) {
   _  if (strcmp(st1,"VR$") == 0) {
   _  _  if ((strcmp(cj[i + wc],"do") == 0) || (strcmp(cj[i + wc],"do not") == 0)) {
   _  _  _  pt = strstr(vr,"do");
   _  _  _  if (! pt)
   _  _  _     pt = strstr(vr,"like");
   _  _  _  if (! pt)
   _  _  _     pt = strstr(vr,"go ");
   _  _  _  if (pt) {
   _  _  _  _  strcat(md[i],pt + 2); /* "Yes, I do.", "No, he doesn't." etc. */
   _  _  _  }
   _  _  _  else {
   _  _  _  _  strcat(md[i]," ");
   _  _  _  _  strcat(md[i],vr);
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  strcat(md[i]," ");
   _  _  _  strcat(md[i],vr);
   _  _  }
   _  _  sov = 1;
   _  }
   _  else {
   _  _  if (strcmp(st1,"VR2$") == 0) {
   _  _  _  strcat(md[i]," ");
   _  _  _  strcat(md[i],vr2);
   _  _  _  sov = 1;
   _  _  }
   _  }
   }
   if ((! sov) && *st1) {
   _  if (strcmp(st1,"washa") == 0) {
   _  _  strcat(md[i]," ");
   _  _  strcat(md[i],washa);
                         /* "+washa" と指定された時は、washa[] を付加する */
   _  _  *st1 = '\0';
   _  _  sov = 1;
   _  }
   _  else {
   _  _  if ((strcmp(st1,"washa2") == 0) && *washa2) {
   _  _  _  strcat(md[i]," ");
   _  _  _  strcat(md[i],washa2);
   _  _  _  *st1 = '\0';
   _  _  _  sov = 1;
   _  _  }
   _  }
   }
   return(sov);
end
