#include <string.h>   /* ********  honyakuf.c  **********   */
#include "macro.h"    /* pause,isVowel,ptcpy,cutoff,insertc,inserts,left */
#include <stdio.h>   /* replace,right,mid,instr, ninstr,instrc,ninstrc,swap */
/* #include <process.h> */     /*     for MS-C && TURBO C++ */
/*     #include <stdlib.h>   ;  for Lattice C */
#include "jehonfnc.h" /* val, zentoint,nzentohan,nhantozen,numbtozen,beeping */

/*************   翻訳プログラム用関数ファイル　　********* */

#define  QWJTOE


int pause(int n) /* n に比例する時間だけポーズを取る。 */
begin
   int t,s = 0;
   for (t = 0; t <= n; t++) {
   _  s += t%3;
   }
   return(s);
end

int isVowel(char c)
               /* 文字 c が母音字(aeiouAEIOU)なら 1, それ以外なら 0 を返す */
begin
   int j = 0;

   if ((c == 'a') || (c == 'e') || (c == 'i') || (c == 'o') || (c == 'u'))
      j = 1;
   else
      if ((c == 'A') || (c == 'E') || (c == 'I') || (c == 'O') || (c == 'U'))
         j = 1;
   return(j);
end


void ptcpy(char c[], char *pt1, char *pt2)
       /* ポインター位置 pt1 から pt2 の直前までを文字列 c[] にコピーする。 */
begin
   char *pt;

   pt = pt1;
   while(pt != pt2) {
   _  *c = *pt;
   _  if (! *pt)
   _     break;
   _  ++c;
   _  ++pt;
   }
   *c = '\0';
end

void wdcpy(char *st1, char *st2)
 /* 文字列 st2 の先頭から空白またはヌルコードの直前までを st1 にコピーする。*/
begin

   while (*st2 && (*st2 != ' '))
      *st1++ = *st2++;
   *st1 = '\0';
end

void cutoff(char *a, int x, int i)
 /*  文字列 a[] の x+1 番目（ a[x] ）からｉ文字（ a[x+i-1] まで）を削除する。*/
 /*  x+i が a[] の長さを越えるときは、単に a[x] 以降を削除する。*/
begin

   int ln;
   char *b;

   ln = strlen(a);
   if (x < ln) {
   _  b = a + x + i;
   _  *(a + x) = '\0';
   _  if (ln > x + i)
   _     strcat(a,b);
   }
end

void ptcut(char *pt, int i)
 /*  文字列 pt が指す位置から i 文字を削除する。*/
begin
   register char *pta, *ptq;
   int ln;

   ln = strlen(pt);
   if (i >= ln)
      *pt = '\0';
   else {
   _  pta = pt;
   _  ptq = pt + i;
   _  do {
   _  _   *(pta++) = *(ptq++);
   _  }  while (*ptq);
   _  *pta = '\0';
   }
end

void ptptcut(char *pt1, char *pt2)
 /*  pt1 が指す位置から pt2 までを削除する。*/
begin
   char *pta = pt1, *ptz = pt2;

   do {
   _   *(pta++) = *(++ptz);
   }  while (*ptz);
end


void insertc(char a[], int i, char c, int ln) 
   /* 文字列 a[] の (i + 1) 番目の位置 a[i] に文字 'c' を挿入する。*/
   /* ln = strlen(a); */
begin
   int j;

   if (i < ln)
      for (j = ln; j > i; j--)
         a[j] = a[j - 1];
   a[i] = c;
   a[ln + 1] = '\0';
end

void inserts(char a[], int i, char s[], int ln)
 /* 文字列 a[] の (i+1) 番目の位置 a[i] に文字列 s[] を挿入する */
begin                  /* ln = strlen(a) */
   int j, lns;

   lns = strlen(s);
   for (j = ln - 1; j >= i; j--)
               a[j + lns] = a[j];
   for (j = 0; j <= lns - 1; j++)
               a[i + j] = s[j];
   a[ln + lns] = '\0';
end

void ptinsert(char *pt, char *str)  /* pt の位置に文字列 *str を挿入する。 */
begin
   int ln;
   char dums[280];

   ln = strlen(pt);
   if (ln > 279) {
   _  printf("\n 文字列 '%s' は長過ぎます。 \n",pt);
   _  printf(" '%s' を切り捨てて下さい。 \n",pt + 278);
   _  exit(1);
   } 
   strcpy(dums,pt);
   strcpy(pt,str);
   strcat(pt,dums);
end

void ptconsinsert(char *pt, char const *str)  /* pt の位置に定数文字列 *str を挿入する。 */
begin
   int ln;
   char dums[280];

   ln = strlen(pt);
   if (ln > 279) {
   _  printf("\n 文字列 '%s' は長過ぎます。 \n",pt);
   _  printf(" '%s' を切り捨てて下さい。 \n",pt + 278);
   _  exit(1);
   } 
   strcpy(dums,pt);
   strcpy(pt,str);
   strcat(pt,dums);
end


void left(char a[], char c[], unsigned int i)
    /* 文字列 c[] の先頭から i 番目迄を、文字列 a[] にコピーする。*/
begin
      unsigned int x;

   if (i > strlen(c))
      i = strlen(c);
   if (i > 0) {
   _  for (x = 0; x <= i - 1; x++)
   _      a[x] = c[x];
   }
   a[i] = '\0';
end

void replaces(char *a, int k, int ln2, char *c)
 /* 文字列 a[] の k+1 番目 (a[k]) から ln2 個 (a[k+ln2-1]まで) を，文字列 c[] で置き換える。 */
begin
   int ln;
   char *bpt, dumc[256];

   ln = strlen(c);
   if (ln > 255) {
   _  *(c + 254) = '\0';
   _  printf("\n string '%s' is too long! \n",c);
   _  exit(1);
   } 
   bpt = a + k + ln2;
   strcpy(dumc,c);
   if (ln + strlen(bpt) > 255) {
   _  printf("\n string '%s' + '%s' are too long! \n",c,bpt);
   _  exit(1);
   } 
   strcat(dumc,bpt);
   *(a + k) = '\0';
   strcat(a,dumc);
end

void ptreplace(char *pt, int ln, char c[])
   /* pt が指す位置から続く ln 個を，文字列 c[] で置き換える。 */
begin
   int ln2;
   char *pt2, dums[256];

   pt2 = pt + ln;
   ln2 = strlen(pt2);
   if (ln2 > 255) {
   _  *(pt2 + 254) = '\0';
   _  printf("\n string '%s' is too long! \n",pt2);
   _  exit(1);
   }
   strcpy(dums,pt2);
   *pt = '\0';
   sprintf(pt,"%s%s",c,dums);
end

void ptcons_replace(char *pt, int ln, char const c[])
   /* pt が指す位置から続く ln 個を，teisuu文字列 c[] で置き換える。 */
begin
   int ln2;
   char *pt2 = pt + ln, dums[256];

   ln2 = strlen(pt2);
   if (ln2 > 255) {
   _  *(pt2 + 254) = '\0';
   _  printf("\n string '%s' is too long! \n",pt2);
   _  exit(1);
   }
   strcpy(dums,pt2);
   *pt = '\0';
   sprintf(pt,"%s%s",c,dums);
end


void right(char *c, char *b, int i)
         /* 文字列 c[] の末尾 i 文字を文字列 b[] にコピーする。*/
begin
   int d;
   char *pt;

   if (i >= 0) {
   _  d = strlen(c) - i;
   _  if (d >= 0)
   _     pt = c + d;
   _  else
   _     pt = c;
   _  strcpy(b,pt);
   }
   else
      *b = '\0';
end

void mid(char a[], int i, int j, char b[])
    /*  文字列 a[] の i 番目(a[i-1])から j 文字を文字列 b[] にコピーする。*/
begin
   char c[256];

   left(c,a,i + j - 1);
   right(c,b,j);
end

int instr(char *a, char *b)
     /* 文字列 a[] の中に、文字列 b[] が最初に出現する位置を整数値で返す。*/
begin
   int j = 1;
   char *pt;

   pt = strstr(a,b);
   if (pt) {
   _  while (a != pt--)
   _     j++;
   _  return(j);
   }
   else return(0);
end

int ninstr(int n, char *a, char *b)
   /* 文字列 a[] の n 番目(a[n-1])以降で、文字列 b[] が最初に出現する位置を整数値で返す。*/
begin
   int inst;
   char *pta;
   
   pta = a + n - 1;
   inst = instr(pta,b);
   if (inst)
      return(n + inst - 1);
   else
      return(0);
end

int instrc(char *a, char b)
   /* 文字列 a[] の中で、文字 b が最初に出現する位置を整数値で返す。*/
begin
   int j = 1;
   char *pt;

   pt = strchr(a,b);
   if (pt) {
   _  while (a != pt--)
   _     j++;
   _  return(j);
   }
   else return(0);
end

int ninstrc(int n, char *a, char b)
   /* 文字列 a[] の n 番目(a[n-1])以降で、文字 b が最初に出現する位置を整数値で返す。*/
begin
   int inst;
   char *pta;
   
   pta = a + n - 1;
   inst = instrc(pta,b);
   if (inst)
      return(n + inst - 1);
   else
      return(0);
end

void swap(char a[], char b[]) /* 文字列 a[] と b[] の内容を交換する。 */
begin
   char c[256];
   
   strcpy(c,a);
   strcpy(a,b);
   strcpy(b,c);
end


int val(char nstr[])   /* 半角の数字列 nstr を、それの表す数値に直して返す。 */
begin
   int ln, i, keta = 1, n = 0, sg = 1;

   if (*nstr == '-') {
   _  sg = -1;
   _  ptcut(nstr,1);
   }
   ln = strlen(nstr);
   for (i = ln - 1; i >= 0; i--) {
   _  n += (keta * (nstr[i] - '0'));
   _  keta *= 10;
   }
   n *= sg;
   return(n);
end

int zentoint(char zenkaku[])
       /* 全角の数字列 zenkaku[] を、それの表す数値にして返す。 */
begin
   int i, j, ln, numb = 0, keta = 1;
   char zenkakuSuuji[10][3] = {"０","１","２","３","４","５","６","７","８","９"};

   ln = strlen(zenkaku) / 2 - 1;
   for (i = ln; i >= 0; i--) {
   _  for (j = 0; j <= 9; j++) {
   _  _  if ( (zenkaku + i * 2) == strstr(zenkaku + i * 2,zenkakuSuuji[j]) ) {
   _  _  _  numb += j * keta;
   _  _  _  keta *= 10;
   _  _  _  break;
   _  _  }
   _  }
   }
   return(numb);
end

void nzentohan(char zenkaku[], char hankaku[])
         /* 全角数字列 zenkaku[] を半角数字列[] hankaku に変換する。 */
begin
   int i, j, ln;
   char ch, *pt;
   char zenkakuKanSuuji[11][3] = {"十","一","二","三","四","五","六","七","八","九","、"};
   char zenkakuSuuji[11][3] = {"０","１","２","３","４","５","６","７","８","９","，"};

   if ( strchr("0123456789",*zenkaku) && strchr("0123456789,",*(zenkaku + 1)) ) {
   _  strcpy(hankaku,zenkaku);
   _  goto END; 
   }  /* 既に半角になっている場合、何もしない。 2005.01.31 */
   for (i=0; i <= 10; i++) { /* 全角漢数字に対応した。2004/09/05 */
   _  pt = zenkaku + 2*i;
   _  if (! *pt)
     _     break;
   _  for (j=0; j <= 10; j++) {
   _  _  if (pt == strstr(pt,zenkakuKanSuuji[j]))
   _  _     ptreplace(pt,2,zenkakuSuuji[j]);
   _  }
   }
   hankaku[0] = '\0';
   ln = strlen(zenkaku) / 2 - 1;
   for (i = 0; i <= ln; i++) {
   _  pt = zenkaku + 2*i;
   _  for (j=0; j <= 10; j++) {
   _  _  if (pt == strstr(pt,zenkakuSuuji[j])) {
   _  _  _  if (j <= 9)
   _  _  _     ch = '0' + j;
   _  _  _  else
   _  _  _     ch = ',';
   _  _  _  break;
   _  _  }
   _  }
   _  hankaku[i] = ch;
   }
   hankaku[++ln] = '\0';
  END:;
end

void nhantozen(char hankaku[], char zenkaku[])
     /* 半角数字列 hankaku[] を全角数字列 zenkaku[] に変換する。 */
begin
   int i, ln;

   ln = strlen(hankaku) - 1;
   for (i = 0; i <= ln; i++) { /* 数字の桁を区切るカンマも全角に直す。*/
   _  if (hankaku[i] == ',') {
   _  _  zenkaku[2 * i] = '\0';
   _  _  strcat(zenkaku,"，");
   _  }
   _  else {
   _  _  zenkaku[2 * i] = -126;   /* 文字は signed integer で表している。*/
   _  _  if (hankaku[1] < 97)     /* Shit JIS コードの下位ビットを与える。*/
   _  _     zenkaku[2 * i + 1] = hankaku[i] + 31;
   _  _  else
   _  _     zenkaku[2 * i + 1] = hankaku[i] - 225;
   _  }
   }
   zenkaku[2 * i] = '\0';
end

void numbtozen(unsigned int numb, char zenkaku[])
    /* 正の整数 numb を、全角数字列 zenkaku[] に変換する。 */
begin
   unsigned int i, dig, ln, t;
   char invdigits[9];
   char zenkakuSuuji[10][3] = {"０","１","２","３","４","５","６","７","８","９"};

   for (i = 0;;i++) {
   _  dig = numb % 10;
   _  invdigits[i] = dig + '0';
   _  numb -= dig;
   _  if (numb == 0)
   _     break;
   _  else
   _     numb /= 10;
   }
   ln = i;
   invdigits[ln + 1] = '\0';
   for (i = 0; i <= ln; i++) {
   _  t = (unsigned int)(invdigits[ln - i] - '0');
   _  strcat(zenkaku + 2*i, zenkakuSuuji[t]);
   }
end

void numbtohan(int numb, char hankaku[])
    /* 正の整数 numb を、半角数字列 hankaku[] に変換する。 */
begin
   int i, dig, ln;
   char invdigits[9];

   for (i = 0;;i++) {
   _  dig = numb % 10;
   _  invdigits[i] = dig + '0';
   _  numb -= dig;
   _  if (numb == 0)
   _     break;
   _  else
   _     numb /= 10;
   }
   ln = i;
   invdigits[ln + 1] = '\0';
   for (i = 0; i <= ln; i++)
   _  hankaku[i] = invdigits[ln - i];
   hankaku[ln + 1] = '\0';
end

void beeping(unsigned int n)  /* ブザーを n 回鳴らす。*/
begin

 /*  printf("\n Entered beeping(). \n");   DBG */

#if defined(QWJTOE)
    printf("\n BEEP !!!!!!!!!!! \n");
#else
    unsigned int i;
    for (i = 1; i <= n; i++)
       printf("\a");
#endif
end

