replace: u_char -> unsigned char u_short -> unsigned short u_int -> unsigned int u_long (not used) include <sys/types.h> is kept. dicttool.h: fix include guard DICTTOLL -> DICTTOOL addelcmn.c:unsigned int addel_arg() deldic.c:unsigned int deldic() change u_short err -> unsigned int err (used for return value) Signed-off-by: SASANO Takayoshi <uaa@uaa.org.uk>
645 lines
10 KiB
C
645 lines
10 KiB
C
/*
|
|
* Copyright (c) 1991-1994 Sony Corporation
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
* IN NO EVENT SHALL SONY CORPORATION BE LIABLE FOR ANY CLAIM,
|
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
|
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* Except as contained in this notice, the name of Sony Corporation
|
|
* shall not be used in advertising or otherwise to promote the sale, use
|
|
* or other dealings in this Software without prior written authorization
|
|
* from Sony Corporation.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* $SonyRCSfile: makelist.c,v $
|
|
* $SonyRevision: 1.1 $
|
|
* $SonyDate: 1994/06/03 08:00:39 $
|
|
*
|
|
* $Id$
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include "sj_struct.h"
|
|
#include "dicttool.h"
|
|
|
|
#ifndef SS2
|
|
#define SS2 0x8e
|
|
#endif
|
|
|
|
extern DouonRec *douon_ptr;
|
|
extern int douon_num;
|
|
extern int yomi_len;
|
|
extern int hinsi_num;
|
|
extern int kanji_len;
|
|
extern HindoRec *hindo[];
|
|
extern int hindo_num;
|
|
extern HindoRec *askknj[];
|
|
extern int askknj_num;
|
|
extern HindoRec *assyuku;
|
|
|
|
static DouonRec *drectmp = NULL;
|
|
|
|
|
|
|
|
static void
|
|
clearklist(KanjiRec* krec)
|
|
{
|
|
KanjiRec *p;
|
|
|
|
|
|
while (krec) {
|
|
|
|
Free(krec -> kptr);
|
|
Free(krec -> aptr);
|
|
|
|
|
|
p = krec;
|
|
krec = krec -> knext;
|
|
|
|
|
|
Free(p);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
clearhlist(HinsiRec* hrec)
|
|
{
|
|
HinsiRec *p;
|
|
|
|
|
|
while (hrec) {
|
|
|
|
clearklist(hrec -> krec);
|
|
|
|
|
|
p = hrec;
|
|
hrec = hrec -> hnext;
|
|
|
|
|
|
Free(p);
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
clear_list(void)
|
|
{
|
|
DouonRec *p;
|
|
DouonRec *drec = douon_ptr;
|
|
|
|
|
|
while (drec) {
|
|
|
|
Free(drec -> yptr);
|
|
|
|
|
|
clearhlist(drec -> hrec);
|
|
|
|
|
|
p = drec;
|
|
drec = drec -> dnext;
|
|
|
|
|
|
Free(p);
|
|
}
|
|
|
|
douon_ptr = NULL;
|
|
}
|
|
|
|
|
|
|
|
static unsigned char*
|
|
makekanji(int *yomi, int* kanji, int* atr, int* len)
|
|
{
|
|
int kana[MaxYomiLength + 1];
|
|
unsigned char ktmp[MaxKanjiLength * 3 + MaxAtrNumber * 2 + 1];
|
|
int i;
|
|
int pos = 0;
|
|
int *p;
|
|
unsigned char *q;
|
|
|
|
|
|
for (p = yomi, i = 0 ; *p ; )
|
|
kana[i++] = h2kcode(*p++);
|
|
kana[i] = 0;
|
|
|
|
while (*atr) {
|
|
i = *atr;
|
|
atr++;
|
|
#ifndef NO_ATR
|
|
ktmp[pos++] = (AiAttribute | ((i >> 8) & 0xff));
|
|
ktmp[pos++] = (i & 0xff);
|
|
#endif
|
|
}
|
|
|
|
|
|
if ((i = top_strcmp(yomi, kanji))!=0) {
|
|
kanji += i;
|
|
ktmp[pos++] = (ZenHiraAssyuku | (i - 1));
|
|
}
|
|
|
|
else if ((i = top_strcmp(kana, kanji))!=0) {
|
|
kanji += i;
|
|
ktmp[pos++] = (ZenKataAssyuku | (i - 1));
|
|
}
|
|
|
|
|
|
while (*kanji) {
|
|
|
|
if ((i = last_strcmp(yomi, kanji))!=0) {
|
|
kanji += i;
|
|
ktmp[pos++] = (ZenHiraAssyuku | (i - 1));
|
|
}
|
|
|
|
else if ((i = last_strcmp(kana, kanji))!=0) {
|
|
kanji += i;
|
|
ktmp[pos++] = (ZenKataAssyuku | (i - 1));
|
|
}
|
|
|
|
else if (((*kanji >> 8) & 0xff) == SS2 || *kanji < 0x100) {
|
|
ktmp[pos] = LeadingHankaku;
|
|
ktmp[pos + 1] = (*kanji & 0xff);
|
|
kanji++;
|
|
pos += 2;
|
|
}
|
|
|
|
else {
|
|
if (*kanji < 0x10000) {
|
|
ktmp[pos] = ((*kanji >> 8) & NormalKanjiMask);
|
|
ktmp[pos + 1] = (*kanji & NormalKanjiMask);
|
|
kanji++;
|
|
pos += 2;
|
|
} else if (*kanji < 0x1000000) {
|
|
ktmp[pos] = ((*kanji >> 8) & NormalKanjiMask);
|
|
ktmp[pos + 1] = (*kanji & 0xff);
|
|
kanji++;
|
|
pos += 2;
|
|
} else {
|
|
fprintf(stderr, "Error: 4 byte code is found\n");
|
|
exit(0);
|
|
}
|
|
}
|
|
}
|
|
*len = pos;
|
|
|
|
|
|
q = (unsigned char *)Malloc(pos);
|
|
if (!q) {
|
|
fprintf(stderr, "\245\341\245\342\245\352\244\254\311\324\302\255\244\267\244\336\244\267\244\277");
|
|
exit(1);
|
|
}
|
|
memcpy(q, ktmp, pos);
|
|
|
|
return q;
|
|
}
|
|
|
|
|
|
|
|
static unsigned char*
|
|
makeyomi(int* yomi)
|
|
{
|
|
unsigned char tmp[MaxYomiLength + 1];
|
|
int i;
|
|
int j;
|
|
int *y = yomi;
|
|
unsigned char *p;
|
|
|
|
|
|
for (i = 0 ; *y ; ) {
|
|
j = cnvyomi(*y++);
|
|
if (j == 0) {
|
|
fprintf(stderr, "\311\324\300\265\244\312\312\270\273\372\244\254\306\311\244\337\244\313\273\310\244\357\244\354\244\306\244\244\244\336\244\271\n");
|
|
output_int(stderr, yomi); fputc('\n', stderr);
|
|
exit(1);
|
|
}
|
|
tmp[i++] = j;
|
|
}
|
|
tmp[i++] = 0;
|
|
|
|
|
|
p = (unsigned char *)Malloc(i);
|
|
if (!p) {
|
|
fprintf(stderr, "\245\341\245\342\245\352\244\254\311\324\302\255\244\267\244\336\244\267\244\277");
|
|
exit(1);
|
|
}
|
|
memcpy(p, tmp, i);
|
|
|
|
return p;
|
|
}
|
|
|
|
|
|
|
|
static KanjiRec*
|
|
make_krec(unsigned char* kcode, int klen)
|
|
{
|
|
KanjiRec *krec;
|
|
|
|
|
|
krec = (KanjiRec *)Malloc(sizeof(KanjiRec));
|
|
if (!krec) {
|
|
fprintf(stderr, "\245\341\245\342\245\352\244\254\311\324\302\255\244\267\244\336\244\267\244\277");
|
|
exit(1);
|
|
}
|
|
|
|
|
|
krec -> klen = klen;
|
|
krec -> kptr = kcode;
|
|
krec -> alen = 0;
|
|
krec -> aptr = NULL;
|
|
krec -> knext = NULL;
|
|
|
|
return krec;
|
|
}
|
|
|
|
|
|
|
|
static HinsiRec*
|
|
make_hrec(int hinsi)
|
|
{
|
|
HinsiRec *hrec;
|
|
|
|
|
|
hrec = (HinsiRec *)Malloc(sizeof(HinsiRec));
|
|
if (!hrec) {
|
|
fprintf(stderr, "\245\341\245\342\245\352\244\254\311\324\302\255\244\267\244\336\244\267\244\277");
|
|
exit(1);
|
|
}
|
|
|
|
|
|
hrec -> hinsi = hinsi;
|
|
hrec -> krec = NULL;
|
|
hrec -> hnext = NULL;
|
|
|
|
return hrec;
|
|
}
|
|
|
|
|
|
|
|
static DouonRec*
|
|
make_drec(unsigned char* ycode)
|
|
{
|
|
DouonRec *drec;
|
|
|
|
|
|
drec = (DouonRec *)Malloc(sizeof(DouonRec));
|
|
if (!drec) {
|
|
fprintf(stderr, "\245\341\245\342\245\352\244\254\311\324\302\255\244\267\244\336\244\267\244\277");
|
|
exit(1);
|
|
}
|
|
|
|
|
|
drec -> yptr = ycode;
|
|
drec -> hrec_num = 0;
|
|
drec -> hrec = NULL;
|
|
drec -> dnext = NULL;
|
|
|
|
return drec;
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
diff_ylen(DouonRec *drec)
|
|
{
|
|
DouonRec *dptr;
|
|
DouonRec *dprev;
|
|
unsigned char *p1;
|
|
unsigned char *p2;
|
|
int ylen = 0;
|
|
|
|
|
|
dptr = douon_ptr; dprev = NULL;
|
|
while (dptr) {
|
|
dprev = dptr;
|
|
dptr = dptr -> dnext;
|
|
}
|
|
|
|
if (dprev) {
|
|
|
|
p1 = dprev -> yptr; p2 = drec -> yptr;
|
|
while (*p1 && (*p1 == *p2)) { p1++; p2++; }
|
|
|
|
|
|
if (*p1 == *p2) {
|
|
fprintf(stderr, "\305\371\244\267\244\244\306\311\244\337\244\316\306\261\262\273\270\354\245\326\245\355\245\303\245\257\244\254\244\242\244\353\n");
|
|
output_yomi(stderr, dprev -> yptr); fputc('\n', stderr);
|
|
exit(1);
|
|
}
|
|
|
|
else if (*p1 > *p2) {
|
|
fprintf(stderr, "\306\311\244\337\244\316\275\347\275\370\244\254\244\252\244\253\244\267\244\244\n");
|
|
output_yomi(stderr, dprev->yptr); fputc('\n', stderr);
|
|
output_yomi(stderr, drec->yptr); fputc('\n', stderr);
|
|
exit(1);
|
|
}
|
|
|
|
|
|
while (*p2++) ylen++;
|
|
}
|
|
|
|
return ylen;
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
douon_knj(DouonRec* drec)
|
|
{
|
|
int i;
|
|
int len = 0;
|
|
unsigned char *p;
|
|
unsigned char *knjofscvt();
|
|
HinsiRec *hrec;
|
|
KanjiRec *krec;
|
|
|
|
|
|
for (hrec = drec -> hrec ; hrec ; hrec = hrec -> hnext) {
|
|
|
|
for (krec = hrec -> krec ; krec ; krec = krec -> knext) {
|
|
|
|
p = knjofscvt(krec -> kptr, krec -> klen, &i);
|
|
|
|
|
|
len += i + 1;
|
|
|
|
|
|
knjhnd_set(p, i);
|
|
|
|
|
|
krec -> alen = i;
|
|
krec -> aptr = p;
|
|
|
|
|
|
set_ofsrec(krec -> kptr, krec -> klen, 0);
|
|
}
|
|
}
|
|
|
|
|
|
return len;
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
make_d_list(DouonRec* drec)
|
|
{
|
|
DouonRec *dptr, *dprev;
|
|
HinsiRec *hptr;
|
|
KanjiRec *kptr;
|
|
int ylen;
|
|
int klen;
|
|
int hnum;
|
|
int len;
|
|
int i;
|
|
|
|
start:
|
|
|
|
if (douon_ptr == NULL) {
|
|
douon_num = 0;
|
|
yomi_len = 0;
|
|
hinsi_num = 0;
|
|
kanji_len = 0;
|
|
assyuku = NULL;
|
|
}
|
|
|
|
|
|
klen = douon_knj(drec);
|
|
|
|
|
|
ylen = diff_ylen(drec);
|
|
|
|
|
|
hnum = drec -> hrec_num;
|
|
|
|
|
|
i = 1 +
|
|
MaxKnjAskNumber +
|
|
|
|
douon_num * DouonBlkSizeNumber + DouonBlkSizeNumber +
|
|
yomi_len + ylen +
|
|
hinsi_num + hnum +
|
|
hinsi_num + hnum +
|
|
kanji_len + klen;
|
|
|
|
|
|
len = (i <= MainSegmentLength) ? 0 : decide_knjask();
|
|
|
|
|
|
if ((i - len) <= MainSegmentLength) {
|
|
|
|
if (douon_ptr) {
|
|
|
|
dptr = douon_ptr; dprev = NULL;
|
|
while (dptr) {
|
|
dprev = dptr;
|
|
dptr = dptr -> dnext;
|
|
}
|
|
|
|
|
|
dprev -> dnext = drec;
|
|
}
|
|
|
|
else {
|
|
|
|
douon_ptr = drec;
|
|
}
|
|
drec -> dnext = NULL;
|
|
|
|
|
|
drec -> dlen = ylen;
|
|
|
|
|
|
douon_num += 1;
|
|
|
|
|
|
yomi_len += ylen;
|
|
|
|
|
|
hinsi_num += hnum;
|
|
|
|
|
|
kanji_len += klen;
|
|
|
|
return;
|
|
}
|
|
|
|
else if (douon_ptr == NULL) {
|
|
fprintf(stderr, "\243\261\306\261\262\273\270\354\245\326\245\355\245\303\245\257\244\254\302\347\244\255\244\271\244\256\244\336\244\271\n");
|
|
exit(1);
|
|
}
|
|
|
|
|
|
for (hptr = drec -> hrec ; hptr ; hptr = hptr -> hnext) {
|
|
for (kptr = hptr -> krec ; kptr ; kptr = kptr -> knext) {
|
|
|
|
|
|
knjhnd_reset(kptr -> aptr, kptr -> alen);
|
|
|
|
|
|
Free(kptr -> aptr);
|
|
kptr -> aptr = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
len = decide_knjask();
|
|
|
|
|
|
makeseg();
|
|
|
|
|
|
clear_list();
|
|
|
|
|
|
clear_hindo();
|
|
|
|
|
|
clear_ofsrec();
|
|
|
|
|
|
askknj_num = 0;
|
|
|
|
|
|
clear_assyuku();
|
|
|
|
goto start;
|
|
}
|
|
|
|
|
|
void
|
|
flush_douon(void)
|
|
{
|
|
if (drectmp) {
|
|
|
|
make_d_list(drectmp);
|
|
|
|
drectmp = NULL;
|
|
}
|
|
|
|
if (douon_ptr) {
|
|
|
|
decide_knjask();
|
|
|
|
|
|
makeseg();
|
|
|
|
|
|
clear_list();
|
|
|
|
|
|
clear_hindo();
|
|
|
|
|
|
clear_ofsrec();
|
|
|
|
|
|
askknj_num = 0;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
makelist(int* yomi, int* kanji, int hinsi, int* atr)
|
|
{
|
|
unsigned char *ycode;
|
|
unsigned char *kcode;
|
|
int klen;
|
|
HinsiRec *hrec;
|
|
KanjiRec *krec, *kprev;
|
|
|
|
|
|
ycode = makeyomi(yomi);
|
|
|
|
|
|
kcode = makekanji(yomi, kanji, atr, &klen);
|
|
|
|
|
|
if (drectmp && strcmp(ycode, drectmp -> yptr)) {
|
|
|
|
make_d_list(drectmp);
|
|
|
|
drectmp = NULL;
|
|
}
|
|
|
|
|
|
if (!drectmp) {
|
|
|
|
drectmp = make_drec(ycode);
|
|
|
|
|
|
hrec = make_hrec(hinsi);
|
|
drectmp -> hrec = hrec;
|
|
drectmp -> hrec_num = 1;
|
|
|
|
|
|
krec = make_krec(kcode, klen);
|
|
hrec -> krec = krec;
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
for (hrec = drectmp -> hrec ; hrec -> hnext ; hrec = hrec -> hnext)
|
|
if (hrec -> hinsi == hinsi) break;
|
|
|
|
|
|
if (hrec -> hinsi == hinsi) {
|
|
|
|
for (krec=hrec->krec ; krec ; krec=krec->knext) {
|
|
|
|
if ((krec -> klen == klen) &&
|
|
!memcmp(krec -> kptr, kcode, klen)) {
|
|
fprintf(stderr, "\306\261\260\354\244\316\275\317\270\354\244\254\302\270\272\337\244\267\244\277\n");
|
|
fprintf(stderr, "\t\306\311\244\337:");
|
|
output_int(stderr, yomi);
|
|
fprintf(stderr, "\n");
|
|
fprintf(stderr, "\t\264\301\273\372:");
|
|
output_int(stderr, kanji);
|
|
fprintf(stderr, "\n");
|
|
|
|
|
|
Free(kcode);
|
|
|
|
return;
|
|
}
|
|
kprev = krec;
|
|
}
|
|
|
|
|
|
kprev -> knext = make_krec(kcode, klen);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
hrec -> hnext = make_hrec(hinsi);
|
|
hrec = hrec -> hnext;
|
|
drectmp -> hrec_num += 1;
|
|
|
|
|
|
krec = make_krec(kcode, klen);
|
|
hrec -> krec = krec;
|
|
}
|