Add cost calculation

This commit is contained in:
Nishi 2026-06-24 11:39:52 +09:00
commit 54d3831094
14 changed files with 136 additions and 16 deletions

View file

@ -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);

View file

@ -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

View file

@ -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;

View file

@ -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
View 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;
}

View file

@ -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)) {

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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;

View file

@ -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) {