#include <stdio.h>      /* **********  jedcfunc.c  ***************  */
#include <string.h>     /* dicptDta, ptcal, bunkatsu0, bunkatsu1, bunkatsu2 */
#include <ctype.h>
#include <process.h>    /*   for MS-C && TURBO C++ */
/*   #include <stdlib.h>         for Lattice C        */

#define  QWJTOE  /*  Windows版 DOSプログラムのコンパイルでも必要。*/
/* #define  BITS_32 */
#define BITS_16  /*  Quick Win 版では、こちらが必要。 */
#define  Win98

#include "macro.h"


void dicptDta(char DRV);
void dicptWrite(char DRV);
int ptcal(char *jwd, unsigned int *code);
int  bunkatsu(int ppt, char jpwd[]);


int  dic[660];
FILE *dicpt;

void dicptDta(char DRV)   /* 辞書ポインタデータの読み込み */
begin                    /*  global variables:  dic[]   */
   register int i;
   char Dicptfile[25];
#ifndef QWJTOE
   char nlq[3];
#endif

   Dicptfile[0] = DRV;
   Dicptfile[1] = '\0';
   strcat(Dicptfile,":jedicpt.jte");
   if ((dicpt = fopen(Dicptfile,"r")) == 0) {
      printf("can't open 「jedicpt.jte」\n");
      exit(1);
   }
   for (i = 0; i <= 657; i++) {
   _  if ( (i == 189) || (i == 379)  ) {
   _  _  fscanf(dicpt,"%-3d",dic + i);
#ifndef QWJTOE
   _  _  fscanf(dicpt,"%1S",nlq);
#endif
   _  }
   _  else
   _     fscanf(dicpt,"%4d",dic + i);
   }
end

void dicptWrite(char DRV)   /* 辞書ポインタデータの書き込み */
begin                    /*  global variables:  dic[]   */
   register int i;
   char Dicptfile[15];

   Dicptfile[0] = DRV;
   Dicptfile[1] = '\0';
   strcat(Dicptfile,":jedicpt.jte");
   if ((dicpt = fopen(Dicptfile,"w")) == 0) {
      printf("can't open 「jedicpt.jte」\n");
      exit(1);
   }
   for (i = 0; i <= 657; i++) {
   _  if ((i == 189) || (i == 379))
   _     fprintf(dicpt,"%-3d\n",dic[i]);
   _  else
   _     fprintf(dicpt,"%4d",dic[i]);
   }
   fclose(dicpt);
end

int ptcal(char *jpwd, unsigned int *code)  /* 辞書を引くポインターを計算する。 */
begin                 /* global variable: dic[] */
   int  ppt;
   unsigned int *ptr;

   ppt = 5; /* バグ回避用に、とりあえず初期化するのか？ */
   ptr = (unsigned int *) jpwd;
#if defined(BITS_32)
   *code = ((((*ptr) <<16) >> 28) | (((*ptr) << 24) >> 20));
#endif
#if defined(BITS_16)
   *code = (((*ptr) >> 12) | (((*ptr) << 8) >> 4));
#endif
   if (*code < 0x814)   /* jpwd[] = "R氏" に対処した。2002.09.11 */
      ppt = -5;
   else {
   _  *code -= 0x814;
   _  if ( (*code > 1519) && (*code < 1687) )
   _     *code -= 1029; /* S-Jis code の跳びが見つかった！ 2004.06.19 */
  _  if (*code > 657) {
   _  _  if ( ('A' <= *jpwd) && (*jpwd <= 'z') ) {
   _  _  _  if (((19 < *(jpwd + 1)) && (*(jpwd + 1) < 127)) && ((*(jpwd + 2) <= 0) || ((19 < *(jpwd + 2)) && (*(jpwd + 2) < 127)) || (*(jpwd + 2) == ' ')))
   _  _  _     ppt = - 5;  /* isalpha() を 19 < ... < 127 に広げた。2001.04.09 */
   _  _  _  else {
   _  _  _  _  if ((*(jpwd + 1) == '-') || ((jpwd + 1) == strstr(jpwd + 1,"？")) || ((jpwd + 1) == strstr(jpwd + 1,"「")))
   _  _  _  _     ppt = -5;
   _  _  _  _  else {
   _  _  _  _  _  if ((jpwd + 1) == strstr(jpwd + 1,"。")) {
   _  _  _  _  _  *(jpwd + 1) = '\0';
   _  _  _  _  _  ppt = -5;
   _  _  _  _  _  }
   _  _  _  _  }
   _  _  _  }
   _  _  }
   _  _  else {
   _  _  _  printf("\n ポインターエラー　*code = %d   jpwd = %s   \n\n",*code,jpwd);
   _  _  _  printf("日本文を修正して、入力をやり直して下さい！！");
   _  _  _  if (*code < 2754)
   _  _  _     printf("第２水準の漢字で使用できるのは、....瑤凜熙(0xEAA4) までです。\n\n");
   _  _  _  printf("日本文を修正して、入力をやり直して下さい！！");
   _  _  _  exit(1);
   _  _  }
   _  }
   }
   if (ppt >= 0) {
   _  ppt = dic[*code];
   _  ppt = bunkatsu(ppt,jpwd);  /*　大量単語のページを分割する。 */
   }
   return(ppt);
end

int  bunkatsu(int ppt, char jpwd[])
begin                  /* 大量単語のページを分割する。 */

   switch (ppt) {
     case 5:
       if (strcmp(jpwd,"お") >= 0) {
       _  if (strcmp(jpwd,"おんん") <= 0)
       _     ppt += 5;
       _  else
       _     ppt += 6;
       }
       else {
       _  if (strcmp(jpwd,"う") >= 0)
       _     ppt += 4;
       _  else {
       _  _  if (strcmp(jpwd,"い") >= 0) {
       _  _  _  if (strcmp(jpwd,"いち") <= 0)
       _  _  _     ppt += 2;
       _  _  _  else
       _  _  _     ppt += 3;
       _  _  }
       _  _  else {
       _  _  _  if (strcmp(jpwd,"あは") >= 0)
       _  _  _     ++ppt;
       _  _  }
       _  }
       }
       break;
     case 6:
       ppt += 6;  /* case 5,  での増ページ分を加算する。*/
       if (strcmp(jpwd,"す") >= 0)
	      ppt++;
	   if (strcmp(jpwd,"た") >= 0)
	      ppt++;
       break;
     case 7:
       ppt += 8;
       if (strcmp(jpwd,"な") >= 0)
		  ppt++;
       break;
     case 11:    /* ppt の値は分割増頁補正以前の値 */
       ppt += 9;  /* case 5,6,7  での増ページ分を加算する。*/
       if (strcmp(jpwd,"イ") >= 0) {
       _  if (strcmp(jpwd,"エ") >= 0) {
       _  _  if (strcmp(jpwd,"カ") >= 0)
       _  _     ppt += 3;
       _  _  else
       _  _     ppt += 2;
       _  }
       _  else
       _     ++ppt;
       }
       break;
     case 21:
       ppt += 12;  /* case 5,6,7,11  での増ページ分を加算する。*/
       if (strcmp(jpwd,"一") >= 0)
		  ppt++;
       break;
     default:
       if (ppt <= 250) {
       _  if (ppt > 21)
       _     ppt += 1;
       _  if (ppt > 11) /* 上のケースを含み、加算する。*/
       _     ppt += 3;
       _  if (ppt > 7)  /* 上のケースを含み、加算する。*/
       _     ppt += 1;
       _  if (ppt > 6)  /* 上のケースを含み、加算する。*/
       _     ppt += 2;
       _  if (ppt > 5)  /* 上のケースを含み、加算する。*/
       _     ppt += 6;
       }
   }
   return(ppt);
end
