Add cost calculation
This commit is contained in:
parent
c066168831
commit
54d3831094
14 changed files with 136 additions and 16 deletions
|
|
@ -122,6 +122,9 @@ RECURS void srchfzk(SJ4_CONTEXT JREC*, u_char*, TypeCnct, int);
|
|||
/* fzkyomi.c */
|
||||
extern u_char* fzkadr[];
|
||||
|
||||
/* getcost.c */
|
||||
int getcost(SJ4_CONTEXT u_char*);
|
||||
|
||||
/* getkanji.c */
|
||||
u_char* getkan_none(u_char*, u_char*, u_char*, int, int);
|
||||
u_char* getkan_hira(u_char*, u_char*, u_char*, int, int);
|
||||
|
|
|
|||
|
|
@ -104,6 +104,8 @@
|
|||
#define fzkcnct Jfzkcnct
|
||||
#define srchfzk Jsrchfzk
|
||||
|
||||
#define getcost Jgetcost
|
||||
|
||||
#define getkan_none Jgetkan_none
|
||||
#define getkan_hira Jgetkan_hira
|
||||
#define getkan_kata Jgetkan_kata
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ typedef struct jiritu {
|
|||
TypeDicOfs jofsst;
|
||||
TypeDicOfs jofsed;
|
||||
u_short flags;
|
||||
TypeClass class;
|
||||
TypeClass jclass;
|
||||
TypeDicID dicid;
|
||||
u_char jlen;
|
||||
TypeGram hinsi;
|
||||
|
|
@ -75,6 +75,7 @@ typedef struct kouho {
|
|||
TypeDicOfs offs;
|
||||
TypeStyNum styno;
|
||||
u_char rank;
|
||||
u_short cost; /* new in SJ4 */
|
||||
#if __STDC__
|
||||
unsigned sttfg : 1;
|
||||
unsigned sttkj : 1;
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ void cvtkouho(SJ4_CONTEXT KHREC* krec) {
|
|||
|
||||
clrec = krec->clrec;
|
||||
|
||||
switch(clrec->jnode->class) {
|
||||
switch(clrec->jnode->jclass) {
|
||||
case C_DICT:
|
||||
cvtdict(SJ4_CONTEXT_PASS krec, clrec, FALSE);
|
||||
break;
|
||||
|
|
|
|||
97
lib/sj4core/getcost.c
Normal file
97
lib/sj4core/getcost.c
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
#include "sj_kanakan.h"
|
||||
|
||||
static void getcost_atrb(SJ4_CONTEXT u_char* p, int* len) {
|
||||
*len = 2;
|
||||
}
|
||||
|
||||
static int getcost_ofs(SJ4_CONTEXT u_char* p, int* len) {
|
||||
*len = 0;
|
||||
return getcost(SJ4_CONTEXT_PASS dicbuf + ((*p & KANJICODEMASK) << 8) + *(p + 1));
|
||||
}
|
||||
|
||||
static int getcost_knj(SJ4_CONTEXT u_char* p, int* len) {
|
||||
*len = 1;
|
||||
return getcost(SJ4_CONTEXT_PASS askknj[*p & KNJASSYUKUMASK]);
|
||||
}
|
||||
|
||||
static void getcost_hask(SJ4_CONTEXT u_char* p, int* len) {
|
||||
*len = 1;
|
||||
}
|
||||
|
||||
static void getcost_kask(SJ4_CONTEXT u_char* p, int* len) {
|
||||
*len = 1;
|
||||
}
|
||||
|
||||
static void getcost_norm(SJ4_CONTEXT u_char* p, int* len) {
|
||||
*len = codesize(*p);
|
||||
}
|
||||
|
||||
static void getcost_hira(SJ4_CONTEXT u_char* p, int* len) {
|
||||
u_char ch;
|
||||
|
||||
*len = codesize(*p);
|
||||
ch = *(p + 1);
|
||||
|
||||
switch(*p) {
|
||||
case 0x24:
|
||||
if(ch >= 0x21 && ch <= 0x73) return;
|
||||
return;
|
||||
|
||||
case 0x25:
|
||||
if(ch >= 0x21 && ch <= 0x76) return;
|
||||
return;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int getcost(SJ4_CONTEXT u_char* p) {
|
||||
char flg = TRUE;
|
||||
int i;
|
||||
int result;
|
||||
|
||||
do {
|
||||
if(p[codesize(*p)] == KANJISTREND) flg = FALSE;
|
||||
switch(*p & KANJIMODEMASK) {
|
||||
case ZENHIRAASSYUKU:
|
||||
getcost_hask(SJ4_CONTEXT_PASS p, &i);
|
||||
break;
|
||||
|
||||
case ZENKATAASSYUKU:
|
||||
getcost_kask(SJ4_CONTEXT_PASS p, &i);
|
||||
break;
|
||||
|
||||
case OFFSETASSYUKU:
|
||||
result = getcost_ofs(SJ4_CONTEXT_PASS p, &i);
|
||||
break;
|
||||
|
||||
case AIATTRIBUTE:
|
||||
getcost_atrb(SJ4_CONTEXT_PASS p, &i);
|
||||
break;
|
||||
|
||||
case LEADINGHANKAKU:
|
||||
getcost_norm(SJ4_CONTEXT_PASS p, &i);
|
||||
break;
|
||||
|
||||
case KANJIASSYUKU:
|
||||
result = getcost_knj(SJ4_CONTEXT_PASS p, &i);
|
||||
break;
|
||||
|
||||
case KANAKANCOST:
|
||||
result = ((*p & 0xf) << 8) | *(p + 1);
|
||||
result++;
|
||||
i = 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
getcost_hira(SJ4_CONTEXT_PASS p, &i);
|
||||
}
|
||||
|
||||
if(result) return result - 1;
|
||||
|
||||
p += i;
|
||||
} while(flg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -121,6 +121,16 @@ setnspr(SJ4_CONTEXT KHREC* kptr, STDYIN* sptr) {
|
|||
if(sptr->nmflg && (nrank > keepnm)) nrank = keepnm;
|
||||
}
|
||||
|
||||
static int sort_kouhotbl(const void* a, const void* b){
|
||||
const KHREC* akh = a;
|
||||
const KHREC* bkh = b;
|
||||
|
||||
if(akh->cost < bkh->cost) return -1;
|
||||
if(akh->cost > bkh->cost) return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
regetrank(SJ4_CONTEXT2) {
|
||||
KHREC* kptr;
|
||||
|
|
@ -138,6 +148,8 @@ regetrank(SJ4_CONTEXT2) {
|
|||
nkhcount = tmp = 0;
|
||||
}
|
||||
|
||||
qsort(kouhotbl, khcount, sizeof(*kouhotbl), sort_kouhotbl);
|
||||
|
||||
for(count = khcount, kptr = kouhotbl; count--; kptr++) {
|
||||
|
||||
if(!(kptr->rank)) {
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ getkhtbl(SJ4_CONTEXT CLREC* clrec) {
|
|||
|
||||
jrec = clrec->jnode;
|
||||
|
||||
switch(jrec->class) {
|
||||
switch(jrec->jclass) {
|
||||
case C_DICT:
|
||||
cl_kanji(SJ4_CONTEXT_PASS jrec, clrec);
|
||||
break;
|
||||
|
|
@ -323,7 +323,7 @@ diffknj(SJ4_CONTEXT JREC* jrec, u_char* ptr, int num) {
|
|||
|
||||
if(jptr->hinsi == TANKANJI) continue;
|
||||
|
||||
if(jptr->class != jrec->class) continue;
|
||||
if(jptr->jclass != jrec->jclass) continue;
|
||||
|
||||
if(jptr->dicid != jrec->dicid) continue;
|
||||
|
||||
|
|
@ -362,7 +362,7 @@ int sel_sjmode(JREC* jrec) {
|
|||
u_short* p;
|
||||
u_short* q;
|
||||
|
||||
switch(jrec->class) {
|
||||
switch(jrec->jclass) {
|
||||
case C_N_ARABIA:
|
||||
case C_N_ARACMA:
|
||||
case C_N_KAZU:
|
||||
|
|
@ -373,7 +373,7 @@ int sel_sjmode(JREC* jrec) {
|
|||
case C_N_KAZULONG:
|
||||
case C_N_KAZULCMA:
|
||||
case C_N_SUUJILONG:
|
||||
p = q = Selsjadrs(jrec->class - C_N_ARABIA);
|
||||
p = q = Selsjadrs(jrec->jclass - C_N_ARABIA);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
@ -418,7 +418,7 @@ cl_numcmn(SJ4_CONTEXT JREC* jrec, CLREC* clrec) {
|
|||
setkouho(SJ4_CONTEXT_PASS clrec, (TypeDicOfs)1, i);
|
||||
}
|
||||
} else {
|
||||
tbl = Selsjadrs(jrec->class - C_N_ARABIA);
|
||||
tbl = Selsjadrs(jrec->jclass - C_N_ARABIA);
|
||||
while((j = *tbl++) != SELNUMTERM) {
|
||||
if(!chrck_numtbl(jrec->flags, j)) continue;
|
||||
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ int ph_khtbl(SJ4_CONTEXT CLREC* clrec) {
|
|||
JREC* jrec;
|
||||
int flg = FALSE;
|
||||
|
||||
switch((jrec = clrec->jnode)->class) {
|
||||
switch((jrec = clrec->jnode)->jclass) {
|
||||
case C_DICT:
|
||||
ph_setsty(SJ4_CONTEXT_PASS clrec);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ int priority(SJ4_CONTEXT CLREC* clrec) {
|
|||
|
||||
if(clrec->cllen == clrec->cl2len) return 0xff;
|
||||
|
||||
if(clrec->jnode->class == C_BUNSETU) {
|
||||
if(clrec->jnode->jclass == C_BUNSETU) {
|
||||
prty = Termtbl[clrec->right] & GETPRI;
|
||||
return (0xf0 + prty);
|
||||
}
|
||||
|
|
@ -221,7 +221,7 @@ finish:
|
|||
|
||||
if(cl2rec->jnode->hinsi == SUUSI) prty -= 3;
|
||||
|
||||
if(cl2rec->jnode->class == C_DICT &&
|
||||
if(cl2rec->jnode->jclass == C_DICT &&
|
||||
cl2rec->jnode->jlen == 1 && (cl2rec->kubun != K_DOUSHI)) {
|
||||
prty -= 2;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ void selclrec(SJ4_CONTEXT2) {
|
|||
|
||||
while(rec) {
|
||||
if(len > (unsigned int)rec->cllen) return;
|
||||
if(rec->jnode->class == C_BUNSETU) break;
|
||||
if(rec->jnode->jclass == C_BUNSETU) break;
|
||||
rec = rec->clsort;
|
||||
}
|
||||
if(!rec) return;
|
||||
|
|
|
|||
|
|
@ -242,7 +242,7 @@ void setjrec(SJ4_CONTEXT u_char* tagp, int mode) {
|
|||
rec->jseg = prevseg;
|
||||
rec->jofsst = ptr - dicbuf;
|
||||
rec->jofsed = tmp - dicbuf;
|
||||
rec->class = C_DICT;
|
||||
rec->jclass = C_DICT;
|
||||
rec->dicid = curdict->dicid;
|
||||
rec->hinsi = gram;
|
||||
rec->sttofs = headcode;
|
||||
|
|
@ -323,6 +323,6 @@ void setcrec(SJ4_CONTEXT u_char* tagp) {
|
|||
if(!(rec = argjrec(SJ4_CONTEXT_PASS(int) ClYomiLen(tagp), (JREC*)NULL))) return;
|
||||
|
||||
rec->jofsst = tagp - CLSTUDYDICT;
|
||||
rec->class = C_BUNSETU;
|
||||
rec->jclass = C_BUNSETU;
|
||||
rec->hinsi = ClGramCode(tagp);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@ void setkouho(SJ4_CONTEXT CLREC* clrec, TypeDicOfs offs, int mode) {
|
|||
kptr->clrec = clrec;
|
||||
kptr->offs = offs;
|
||||
kptr->rank = 0;
|
||||
kptr->cost = getcost(SJ4_CONTEXT_PASS dicbuf + offs);
|
||||
|
||||
kptr->styno = 0;
|
||||
kptr->mode = (u_char)mode;
|
||||
|
||||
|
|
@ -97,6 +99,8 @@ void setkouho(SJ4_CONTEXT CLREC* clrec, TypeDicOfs offs, int mode) {
|
|||
|
||||
kptr->clrec = clrec;
|
||||
kptr->offs = offs;
|
||||
kptr->cost = getcost(SJ4_CONTEXT_PASS dicbuf + offs);
|
||||
|
||||
kptr->rank = 0;
|
||||
kptr->styno = 0;
|
||||
kptr->mode = (u_char)mode;
|
||||
|
|
@ -134,6 +138,7 @@ void ph_setkouho(SJ4_CONTEXT CLREC* clrec, TypeDicOfs offs, STDYIN* sptr) {
|
|||
kouhotbl[0].clrec = clrec;
|
||||
kouhotbl[0].offs = offs;
|
||||
kouhotbl[0].rank = 0;
|
||||
kouhotbl[0].cost = getcost(SJ4_CONTEXT_PASS dicbuf + offs);
|
||||
|
||||
kouhotbl[0].mode = sel_sjmode(jrec = clrec->jnode);
|
||||
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ setnrec_sub(SJ4_CONTEXT u_char* p, u_short flag, int stb) {
|
|||
}
|
||||
|
||||
if((rec = argjrec(SJ4_CONTEXT_PASS len1, (JREC*)NULL))) {
|
||||
rec->class = suuji_class;
|
||||
rec->jclass = suuji_class;
|
||||
rec->hinsi = SUUSI;
|
||||
rec->sttofs = headcode;
|
||||
rec->stbofs = (u_char)stb;
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ void wakachi(SJ4_CONTEXT2) {
|
|||
|
||||
if(!(jrec = argjrec(SJ4_CONTEXT_PASS i, (JREC*)NULL))) return;
|
||||
|
||||
jrec->class = C_WAKACHI;
|
||||
jrec->jclass = C_WAKACHI;
|
||||
jrec->hinsi = D_MEISI_1;
|
||||
|
||||
if(Chrtbl[*(next - 1)] & TAI_KGU)
|
||||
|
|
@ -78,7 +78,7 @@ void wakachi(SJ4_CONTEXT2) {
|
|||
else {
|
||||
|
||||
if(!(jrec = argjrec(SJ4_CONTEXT_PASS 0, (JREC*)NULL))) return;
|
||||
jrec->class = C_WAKACHI;
|
||||
jrec->jclass = C_WAKACHI;
|
||||
jrec->hinsi = MEISI_6;
|
||||
|
||||
while((int)jrec->jlen < maxlen) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue