Mercurial > freewnn
diff Wnn/jutil/ujisf.c @ 0:bbc77ca4def5
initial import
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 13 Dec 2007 04:30:14 +0900 |
parents | |
children | 6ab41ec6f895 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wnn/jutil/ujisf.c Thu Dec 13 04:30:14 2007 +0900 @@ -0,0 +1,1041 @@ +/* + * $Id: ujisf.c,v 1.7 2002/07/14 04:26:57 hiroo Exp $ + */ + +/* + * FreeWnn is a network-extensible Kana-to-Kanji conversion system. + * This file is part of FreeWnn. + * + * Copyright Kyoto University Research Institute for Mathematical Sciences + * 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright OMRON Corporation. 1987, 1988, 1989, 1990, 1991, 1992, 1999 + * Copyright ASTEC, Inc. 1987, 1988, 1989, 1990, 1991, 1992 + * Copyright FreeWnn Project 1999, 2000, 2002 + * + * Maintainer: FreeWnn Project <freewnn@tomo.gr.jp> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Ujis format <--> internal data. + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#if STDC_HEADERS +# include <stdlib.h> +# include <string.h> +#else +# if HAVE_MALLOC_H +# include <malloc.h> +# endif +# if HAVE_STRINGS_H +# include <strings.h> +# endif +#endif /* STDC_HEADERS */ + +#include "commonhd.h" +#include "jslib.h" +#include "jh.h" +#include "jdata.h" +#include "wnn_os.h" +#include "wnn_string.h" + +#ifdef CHINESE +#include "cplib.h" +int pzy_flag = CWNN_PINYIN; /* Pinyin or Zhuyin */ +static void sisheng_num (), read_kanji_str_w (); +#endif + +#ifndef min +#define min(a, b) ((a > b)? b:a) +#define max(a, b) ((a < b)? b:a) +#endif + +extern unsigned char kanjiaddr (); +extern void Print_entry (); +extern int wnn_find_hinsi_by_name (); +#ifdef CHINESE +extern void cwnn_zy_str_analysis (), cwnn_py_str_analysis (); +#endif +int sort_func (), Sorted (), w_stradd (); +static void Kanjistradd (), bunpou_num (), read_kanji_str (), toesc (); +void exit1 (); + +extern struct JT jt; + +/* extern variables */ + +struct je **jeary; +int wnnerror; + +#define WNN_HINSI_LEN 4096 + +w_char file_comment[WNN_COMMENT_LEN]; +w_char hinsi_list[WNN_HINSI_LEN]; + + + +/* static variables */ +static UCHAR *heap, *hp, *heapend; +static w_char *yomi_heap, *yhp, *yheapend; +static struct je *je_heap, *jehp, *jeheapend; +static FILE *ifpter; +static int maxline; + +/* extern functions of this file are + ujis_header(); + read_ujis(reversep, to_esc, which_dict); + reverse_yomi(); + sort(); + uniq_je(func); + output_ujis(opter, serial_out, esc_exp); + */ + +int lc; + +static char stack[LINE_SIZE] = { 0 }; + +int +get_line (c) + register char *c; +{ + if (stack[0]) + { + strcpy (c, stack); + stack[0] = 0; + } + else + { + if (fgets (c, LINE_SIZE, ifpter) == NULL) + { + return (EOF); + } + } + return (0); +} + +void +unget_line (c) + char *c; +{ + strcpy (stack, c); +} + + +char * +get_string (str, buf) + register char *str; + char *buf; +{ + register char *c = buf; + for (; *c == '\t' || *c == ' '; c++); + if (*c == '\0' || *c == '\n') + { + *str = 0; + return (NULL); + } + for (; *c != '\t' && *c != ' ' && *c != '\n' && *c != '\0'; c++) + { + *str++ = *c; + } + *str = 0; + return (c); +} + +void +bad_line (bf) + char *bf; +{ + static int badl = 0; + + fprintf (stderr, "Bad line \"%s\"\n", bf); + fprintf (stderr, "Bad line omitted\n"); + if (++badl > BADLMAX) + { + fprintf (stderr, "Too many bad lines.\n"); + exit1 (); + } +} + +void +error_no_heap () +{ + fprintf (stderr, "Heap area is exhausted.\n"); + exit1 (); +} + +static int +get_one_line (buffer, jep, rev, to_esc, which_dict) + char *buffer; + register struct je **jep; + int rev; + int to_esc; + int which_dict; +{ + register char *c = buffer; + static char tmp[LINE_SIZE]; + static char ckanji[LINE_SIZE]; + static char cyomi[LINE_SIZE]; + static w_char yomi[LINE_SIZE]; + static w_char kanji[LINE_SIZE]; + static w_char comm[LINE_SIZE]; +#ifdef CHINESE + static w_char un_sisheng_yincod_str[LINE_SIZE]; + static w_char yincod_str[LINE_SIZE]; + static char csisheng[LINE_SIZE]; + static w_char wtmp[LINE_SIZE]; +#endif + char *c1; + + if (jehp == jeheapend) + { + if ((jehp = je_heap = (struct je *) malloc ((HEAPINC * sizeof (struct je)))) == NULL) + { + fprintf (stderr, "Malloc Failed\n"); + return (-1); + } + jeheapend = je_heap + HEAPINC; + } + *jep = jehp; + jehp++; + + if (rev == REVERSE) + { + if ((c = get_string (ckanji, c)) == NULL) + return (1); + } + else + { + if ((c = get_string (cyomi, c)) == NULL) + return (1); + } + if (rev == REVERSE) + { + if ((c = get_string (cyomi, c)) == NULL) + return (-1); + } + else + { + if ((c = get_string (ckanji, c)) == NULL) + return (-1); + } +#ifdef CHINESE +/* here ,should seperate pinyin to two part */ +/* one is usually pinyin string like Zhong.Guo. */ +/* the is sisheng string like 23 */ + + if (which_dict == CWNN_REV_DICT || which_dict == BWNN_REV_DICT) + { + if (pzy_flag == CWNN_ZHUYIN) + cwnn_zy_str_analysis (cyomi, csisheng, un_sisheng_yincod_str, yincod_str); + else + cwnn_py_str_analysis (cyomi, csisheng, un_sisheng_yincod_str, yincod_str); + + sisheng_num (csisheng, &((*jep)->ss)); + read_kanji_str_w (wtmp, un_sisheng_yincod_str); + wnn_Strcpy (yomi, wtmp); + } + else + { + read_kanji_str (tmp, cyomi); + wnn_Sstrcpy (yomi, tmp); + } +#else + read_kanji_str (tmp, cyomi); + wnn_Sstrcpy (yomi, tmp); +#endif + if (wnn_Strlen (yomi) >= LENGTHYOMI) + { + fprintf (stderr, "YOMI is longer in line %d.\n", lc); + return (-1); + } + w_stradd (yomi, &((*jep)->yomi)); + + read_kanji_str (tmp, ckanji); + wnn_Sstrcpy (kanji, tmp); + if (wnn_Strlen (kanji) >= LENGTHYOMI) + { + fprintf (stderr, "KANJI is longer in line %d.\n", lc); + return (-1); + } + w_stradd (kanji, &((*jep)->kan)); + + if ((c = get_string (tmp, c)) == NULL) + return (-1); + bunpou_num (tmp, &((*jep)->hinsi)); + + if ((c = get_string (tmp, c)) == NULL) + return (-1); + if (tmp[0] == '-') + { + (*jep)->hindo = -1; /* Real hindo == -1 means Not to use it */ + } + else + { + sscanf (tmp, "%d", &((*jep)->hindo)); + } + + if ((get_string (tmp, c)) == NULL) + { + c1 = NULL; + (*jep)->comm = NULL; + comm[0] = 0; + } + else + { +/* left entries are all considered as comment */ + for (; *c == '\t' || *c == ' '; c++); + if (c[strlen (c) - 1] == '\n') + c[strlen (c) - 1] = '\0'; + c1 = c; + wnn_Sstrcpy (comm, c1); + if (wnn_Strlen (comm) >= LENGTHYOMI) + { + fprintf (stderr, "COMMENT is longer in line %d.\n", lc); + return (-1); + } + w_stradd (comm, &((*jep)->comm)); + } + + if (to_esc) + { + toesc (ckanji, cyomi); + } +/* + if(strchr(ckanji, DIC_COMMENT_CHAR) || + strchr(ckanji, DIC_YOMI_CHAR)){ + fprintf(stderr, "Bad character in kanji\n"); + return(-1); + } + if(which_dict){ + if(strchr(cyomi, DIC_COMMENT_CHAR) || + strchr(cyomi, DIC_YOMI_CHAR)){ + fprintf(stderr, "Bad character in yomi\n"); + return(-1); + } + } +*/ + Kanjistradd (kanji, +#ifdef CHINESE + ((which_dict == CWNN_REV_DICT || which_dict == BWNN_REV_DICT) ? yincod_str : ((which_dict == WNN_REV_DICT) ? yomi : NULL)), +#else + (which_dict) ? yomi : NULL, +#endif + comm, &(*jep)->kanji); + return (0); +} + +static void +Kanjistradd (k, y, c, cp) + register UCHAR **cp; + w_char *k, *y, *c; +{ + int len; + if (hp + LENGTHKANJI >= heapend) + { + if ((hp = heap = (UCHAR *) malloc ((HEAPINC * HEAP_PER_LINE))) == NULL) + { + fprintf (stderr, "Malloc Failed\n"); + exit (1); + } + heapend = heap + (HEAPINC * HEAP_PER_LINE); + } + *cp = hp; + if ((len = kanjiaddr (hp, k, y, c)) >= LENGTHKANJI) + { + fprintf (stderr, "KANJI is longer in line %d.\n", lc); + exit (1); + } + hp += len; +} + +int +w_stradd (str, cp) + register w_char **cp; + register w_char *str; +{ + register int len = wnn_Strlen (str); + + if (yhp + len + 1 >= yheapend) + { + if ((yhp = yomi_heap = (w_char *) malloc ((HEAPINC * sizeof (w_char)))) == NULL) + { + fprintf (stderr, "Malloc Failed\n"); + return (-1); + } + yheapend = yomi_heap + HEAPINC; + } + *cp = yhp; + wnn_Strcpy (yhp, str); + yhp += len + 1; + return (0); +} + +void +#ifdef CHINESE +ujis_header (which_dict) + int *which_dict; +#else +ujis_header () +#endif +{ + char buffer[LINE_SIZE]; + char *c = buffer; + char str[LINE_SIZE]; + + jt.total = 0; + file_comment[0] = 0; + hinsi_list[0] = 0; + + for (;;) + { + if (get_line (buffer) == EOF) + { + goto EOF_HEAD; + } + c = buffer; + if ((c = get_string (str, c)) == NULL) + continue; + if (strcmp (str, COMMENT) == 0) + { +/* for(;;){ + if(get_line(buffer) == EOF){ + goto EOF_EHAD; + } + if(buffer[0] == '\\'){ + unget_line(buffer); + break; + } + if(wnn_Strlen(file_comment) + strlen(buffer) + >= WNN_COMMENT_LEN){ + fprintf(stderr, "Too Long Comment.\n"); + exit1(); + } + wnn_Sstrcpy(file_comment + wnn_Strlen(file_comment), buffer); + } +*/ + get_string (str, c); +/* + if(str[strlen(str) - 1] == '\n'){ + c[strlen(str) - 1] = '\0'; + } +*/ + wnn_Sstrcpy (file_comment, str); +#ifdef CHINESE + } + else if (strcmp (str, PINYIN) == 0) + { + *which_dict = CWNN_REV_DICT; + pzy_flag = CWNN_PINYIN; + } + else if (strcmp (str, ZHUYIN) == 0) + { + *which_dict = CWNN_REV_DICT; + pzy_flag = CWNN_ZHUYIN; + } + else if (strcmp (str, BIXING) == 0) + { + *which_dict = BWNN_REV_DICT; +#endif + } + else if (strcmp (str, HINSI) == 0 +#ifdef CHINESE + || strcmp (str, CHINSI) == 0 +#endif + ) + { + for (;;) + { + if (get_line (buffer) == EOF) + { + goto EOF_HEAD; + } + if (buffer[0] == '\\' || buffer[0] == '\n') + { + unget_line (buffer); + break; + } + wnn_Sstrcpy (hinsi_list + wnn_Strlen (hinsi_list), buffer); + } + } + else if (strcmp (str, TOTAL) == 0) + { + get_string (str, c); + jt.total = atoi (str); + } + else if (strcmp (str, DIC_NO) == 0) + { /* for word_reg.c */ + get_string (str, c); + jt.total = atoi (str); + } + else + { + unget_line (buffer); + break; + } + } +EOF_HEAD: + jt.maxcomment = wnn_Strlen (file_comment); + jt.maxhinsi_list = wnn_Strlen (hinsi_list) + 1; +} + +void +read_ujis (rev, to_esc, which_dict) + int rev; + int to_esc; + int which_dict; +{ + char buffer[LINE_SIZE]; + register int tmp; + + for (lc = 0; get_line (buffer) != EOF;) + { + if ((tmp = get_one_line (buffer, jeary + lc, rev, to_esc, which_dict)) == -1) + { + bad_line (buffer); + } + else if (tmp == 0) + { /* succeed */ + lc++; + if (lc > maxline) + { + error_no_heap (); + } + } + } + jt.maxserial = lc; /* i starts with 1 in order to leave 0 unused */ +#ifdef CHINESE + jt.syurui = which_dict; +#endif +} + +void +reverse_yomi () +{ + register int i; + w_char ytmp[LINE_SIZE]; + + for (i = 0; i < jt.maxserial; i++) + { + if (jeary[i]->yomi != 0) + { /* 削除されてないものだけ */ + wnn_Sreverse (ytmp, jeary[i]->yomi); + wnn_Strcpy (jeary[i]->yomi, ytmp); + wnn_Sreverse (ytmp, jeary[i]->kan); + wnn_Strcpy (jeary[i]->kan, ytmp); + } + + } +} + +extern char *wnn_get_hinsi_name (); + +void +print_je (jep, opter, serial_out, esc_exp) + register FILE *opter; + register struct je *jep; + int serial_out; + int esc_exp; +{ +/* if (jep->yomi != 0) { */ + if (jep->hinsi != SAKUJO_HINSI) + { + Print_entry (jep->yomi, jep->kan, jep->comm, jep->hindo, 0, jep->hinsi, serial_out ? jep->serial : -1, opter, esc_exp); + } +} + +#ifdef nodef +kprint (fp, kpter) + register FILE *fp; + register w_char *kpter; +{ + char out_str[LENGTHKANJI]; + register int out_len; + char tmp[LENGTHKANJI]; + + wnn_sStrcpy (tmp, kpter); + out_len = make_kanji_str (out_str, tmp); + fprintf (fp, "%s", out_str); + if (out_len < 8) + putc ('\t', fp); + if (out_len < 16) + putc ('\t', fp); + putc ('\t', fp); +} +#endif + +void +output_ujis (opter, serial_out, esc_exp) + register FILE *opter; + int serial_out; + int esc_exp; +{ + register struct je **jep; + char buffer[WNN_COMMENT_LEN + WNN_HINSI_LEN]; + register int i; + + wnn_sStrcpy (buffer, file_comment); + fprintf (opter, "%s\t%s\n", COMMENT, buffer); + fprintf (opter, "%s\t%d\n", TOTAL, jt.total); + wnn_sStrcpy (buffer, hinsi_list); +#ifdef CHINESE + fprintf (opter, "%s\n", CHINSI); + if (jt.syurui == CWNN_REV_DICT) + { + if (pzy_flag == CWNN_PINYIN) + { + fprintf (opter, "%s\n", PINYIN); + } + else + { + fprintf (opter, "%s\n", ZHUYIN); + } + } + else if (jt.syurui == BWNN_REV_DICT) + { + fprintf (opter, "%s\n", BIXING); + } +#else + fprintf (opter, "%s\n", HINSI); +#endif + fprintf (opter, "%s", buffer); + fprintf (opter, "\n"); + for (jep = jeary, i = 0; i < jt.maxserial; i++, jep++) + { + print_je (*jep, opter, serial_out, esc_exp); + } +} + +int +init_heap (hpb, yhpb, l, rl, ipf) + int hpb, yhpb, l, rl; + FILE *ipf; +{ + jehp = je_heap = (struct je *) malloc ((rl * sizeof (struct je))); + hp = heap = (UCHAR *) malloc (hpb); + yhp = yomi_heap = (w_char *) malloc ((yhpb * sizeof (w_char))); + if ((jeary = (struct je **) calloc (l, sizeof (struct je *))) == NULL) + { + fprintf (stderr, "Malloc Failed\n"); + return (-1); + } + ifpter = ipf; + maxline = l; + heapend = heap + hpb; + yheapend = yomi_heap + yhpb; + jeheapend = je_heap + rl; + return (0); +} + +void +init_jeary () +{ + int k; + for (k = 0; k < jt.maxserial; k++) + { + jeary[k] = je_heap + k; + } +} + +/* test program + main() + { + yhp = yomi_heap = (w_char *)malloc(100000); + jeary = (struct je *)malloc(100000); + + ifpter = stdin; + ujis_header(); + read_ujis(); + + sort(); + uniq_je(func); + output_ujis(stdout, 0, 1); + } + */ + +void +exit1 () +{ + exit (1); +} + +/* must be updated later */ + +static void +bunpou_num (a, p) + register char *a; + register int *p; +{ + int tmp; + if ((tmp = wnn_find_hinsi_by_name (a)) == -1) + { + if (sscanf (a, "%d", p) == 0) + { + fprintf (stderr, "Bad hinsi name \"%s\".\n", a); + exit1 (); + } + } + else + { + *p = tmp; + } +#ifdef nodef + sscanf (a, "%d", p); +#endif +} + +#ifdef CHINESE +static void +sisheng_num (a, p) + register char *a; + register int *p; +{ + sscanf (a, "%d", p); +} +#endif + +int +sort_func_je (a, b) + char *a, *b; +{ + return (sort_func (a, b, D_YOMI)); +} + +int +sort_func_je_kanji (a, b) + char *a, *b; +{ + return (sort_func (a, b, D_KANJI)); +} + +int +sort_func (a, b, which) + register char *a, *b; + int which; +{ + register int tmp; + register struct je *pa, *pb; + pa = *((struct je **) a); + pb = *((struct je **) b); + if (pa->hinsi == SAKUJO_HINSI) + { + if (pb->hinsi == SAKUJO_HINSI) + return (0); + return (-1); + } + if (pb->hinsi == SAKUJO_HINSI) + return (1); + + if (which == D_YOMI) + { + + if (!(pa->yomi) || !(pb->yomi)) + return (0); + tmp = wnn_Strcmp (pa->yomi, pb->yomi); + if (tmp) + return (tmp); + + if (pa->hinsi != pb->hinsi) + { + return ((int) (pa->hinsi) - (int) (pb->hinsi)); + } + +#ifdef CHINESE + if (jt.syurui == CWNN_REV_DICT) + { + if (pa->ss != pb->ss) + { + return ((int) (pa->ss) - (int) (pb->ss)); + } + } +#endif + if (!(pa->kan) || !(pb->kan)) + return (0); + tmp = wnn_Strcmp (pa->kan, pb->kan); + if (tmp) + return (tmp); + } + else + { + if (!(pa->kan) || !(pb->kan)) + return (0); + tmp = wnn_Strcmp (pa->kan, pb->kan); + if (tmp) + return (tmp); + + if (pa->hinsi != pb->hinsi) + { + return ((int) (pa->hinsi) - (int) (pb->hinsi)); + } +#ifdef CHINESE + if (jt.syurui == CWNN_REV_DICT) + { + if (pa->ss != pb->ss) + { + return ((int) (pa->ss) - (int) (pb->ss)); + } + } +#endif + if (!(pa->yomi) || !(pb->yomi)) + return (0); + tmp = wnn_Strcmp (pa->yomi, pb->yomi); + if (tmp) + return (tmp); + } + return (0); +} + +void +sort () +{ + qsort ((char *) jeary, jt.maxserial, sizeof (struct je *), sort_func_je); +} + +void +sort_if_not_sorted () +{ + if (!Sorted ((char *) jeary, jt.maxserial, sizeof (struct je *), sort_func_je)) + { + sort (); + } +} + +void +sort_kanji () +{ + qsort ((char *) jeary, jt.maxserial, sizeof (struct je *), sort_func_je_kanji); +} + +void +uniq_je (func) + int (*func) (); +{ + int k; + struct je **prev, **jep; + + if (jt.maxserial == 0) + return; + prev = &jeary[0]; + for (k = 1; k < jt.maxserial; k++) + { + jep = &jeary[k]; + if (func ((char *) jep, (char *) prev) == 0) + { + w_char tmp[LENGTHYOMI]; + char tmp1[LENGTHYOMI]; + char tmp2[LENGTHKANJI]; +#ifdef CHINESE + char tmp3[LENGTHKANJI]; + if (jt.syurui == BWNN_REV_DICT || jt.syurui == CWNN_REV_DICT) + { + wnn_Strcpy (tmp, (*jep)->yomi); + wnn_sStrcpy (tmp1, tmp); + wnn_Strcpy (tmp, (*jep)->kan); + wnn_sStrcpy (tmp2, tmp); + sprintf (tmp3, "%d", (*jep)->ss); + } + else + { +#endif + wnn_Sreverse (tmp, (*jep)->yomi); + wnn_sStrcpy (tmp1, tmp); + wnn_Sreverse (tmp, (*jep)->kan); + wnn_sStrcpy (tmp2, tmp); +#ifdef CHINESE + } + if (jt.syurui == CWNN_REV_DICT) + fprintf (stderr, "Entries with same yomi(%s), kanji(%s), hinsi(%s),sisheng(%s) are merged.\n", tmp1, tmp2, wnn_get_hinsi_name ((*jep)->hinsi), tmp3); + else +#endif + fprintf (stderr, "Entries with same yomi(%s), kanji(%s), hinsi(%s) are merged.\n", tmp1, tmp2, wnn_get_hinsi_name ((*jep)->hinsi)); + } + else + { + prev++; + if (prev != jep) + { + *prev = *jep; + } + } + } + prev++; + jt.maxserial = prev - &jeary[0]; +} + +#ifdef nodef +make_kanji_str (o, c) + register UCHAR *o, *c; +{ + register UCHAR *o0 = o; + + for (; *c; c++) + { + if (*c == '\\') + { + *o++ = '\\'; + *o++ = '\\'; + } + else if (*c > 0x20) + { + *o++ = *c; + } + else + { + sprintf (o, "\\0%o", *c); + for (; *o; o++); + } + } + *o = 0; + return (o - o0); +} +#endif + +static void +read_kanji_str (c, o) + register char *c, *o; +{ + for (; *o; c++) + { + if (*o == '\\') + { + if (*++o == '0') + { + o += 1; + if (*o >= '0' && *o <= '7') + { + *c = (*o++ - '0'); + } + else + continue; + if (*o >= '0' && *o <= '7') + { + *c *= 8; + *c |= (*o++ - '0'); + } + else + continue; + } + else + { + *c = *o++; + } + } + else + { + *c = *o++; + } + } + *c = 0; +} + +#ifdef CHINESE +static void +read_kanji_str_w (c, o) + register w_char *c, *o; +{ + for (; *o; c++) + { + if (*o == (w_char) '\\') + { + if (*++o == (w_char) '0') + { + o += 1; + if (*o >= (w_char) '0' && *o <= (w_char) '7') + { + *c = (*o++ - (w_char) '0'); + } + else + continue; + if (*o >= (w_char) '0' && *o <= (w_char) '7') + { + *c *= 8; + *c |= (*o++ - (w_char) '0'); + } + else + continue; + } + else + { + *c = *o++; + } + } + else + { + *c = *o++; + } + } + *c = 0; +} +#endif + +int +Sorted (st, lc, size, sort_fun) + register char *st; + register int lc; + int size; + int (*sort_fun) (); +{ + char *dst = st + size; + for (lc--; lc > 0; lc--, st = dst, dst += size) + { + if (sort_fun (st, dst) > 0) + { + return (0); + } + } + return (1); +} + +int +is_katakana (k, y) + register char *k, *y; +{ + for (; *k && *y;) + { + if (*y == (char) 0xa1 && *k == (char) 0xa1 && *(y + 1) == (char) 0xbc && *(y + 1) == (char) 0xbc) + { /*"ー" */ + y += 2; + k += 2; + continue; + } + if (*y++ != (char) 0xa4 || *k++ != (char) 0xa5) + return (0); + /* be careful, char comparison. */ + if (*y++ != *k++) + { + return (0); + } + } + return (!(*k | *y)); +} + +static void +toesc (ckanji, cyomi) + char *ckanji, *cyomi; +{ + if (strcmp (ckanji, cyomi) == 0) + { + strcpy (ckanji, DIC_HIRAGANA); + } + else if (is_katakana (ckanji, cyomi)) + { + strcpy (ckanji, DIC_KATAKANA); + } +}