diff --git a/include/sj4core/sj_kanakan.h b/include/sj4core/sj_kanakan.h index e45e62d..67df97d 100644 --- a/include/sj4core/sj_kanakan.h +++ b/include/sj4core/sj_kanakan.h @@ -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); diff --git a/include/sj4core/sj_rename.h b/include/sj4core/sj_rename.h index d9b1068..f3bb9b9 100644 --- a/include/sj4core/sj_rename.h +++ b/include/sj4core/sj_rename.h @@ -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 diff --git a/include/sj4core/sj_struct.h b/include/sj4core/sj_struct.h index 4c66a1d..0d50525 100644 --- a/include/sj4core/sj_struct.h +++ b/include/sj4core/sj_struct.h @@ -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; diff --git a/lib/sj4core/cvtkanji.c b/lib/sj4core/cvtkanji.c index 74e5c74..d142d76 100644 --- a/lib/sj4core/cvtkanji.c +++ b/lib/sj4core/cvtkanji.c @@ -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; diff --git a/lib/sj4core/getcost.c b/lib/sj4core/getcost.c new file mode 100644 index 0000000..f889ad8 --- /dev/null +++ b/lib/sj4core/getcost.c @@ -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; +} diff --git a/lib/sj4core/getrank.c b/lib/sj4core/getrank.c index 14a6c2c..78e896e 100644 --- a/lib/sj4core/getrank.c +++ b/lib/sj4core/getrank.c @@ -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)) { diff --git a/lib/sj4core/mkkouho.c b/lib/sj4core/mkkouho.c index a392eaa..726b33b 100644 --- a/lib/sj4core/mkkouho.c +++ b/lib/sj4core/mkkouho.c @@ -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; diff --git a/lib/sj4core/ph_khtbl.c b/lib/sj4core/ph_khtbl.c index 549730f..94d8ced 100644 --- a/lib/sj4core/ph_khtbl.c +++ b/lib/sj4core/ph_khtbl.c @@ -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; diff --git a/lib/sj4core/priority.c b/lib/sj4core/priority.c index 5a5158f..b242304 100644 --- a/lib/sj4core/priority.c +++ b/lib/sj4core/priority.c @@ -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; } diff --git a/lib/sj4core/selclrec.c b/lib/sj4core/selclrec.c index 8d058ec..a57f546 100644 --- a/lib/sj4core/selclrec.c +++ b/lib/sj4core/selclrec.c @@ -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; diff --git a/lib/sj4core/setjrec.c b/lib/sj4core/setjrec.c index e681294..4be9176 100644 --- a/lib/sj4core/setjrec.c +++ b/lib/sj4core/setjrec.c @@ -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); } diff --git a/lib/sj4core/setkouho.c b/lib/sj4core/setkouho.c index 4b6c6f1..124bdfd 100644 --- a/lib/sj4core/setkouho.c +++ b/lib/sj4core/setkouho.c @@ -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); diff --git a/lib/sj4core/srchnum.c b/lib/sj4core/srchnum.c index c09be83..7fe4cd0 100644 --- a/lib/sj4core/srchnum.c +++ b/lib/sj4core/srchnum.c @@ -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; diff --git a/lib/sj4core/wakachi.c b/lib/sj4core/wakachi.c index 0df0d34..4f9fa15 100644 --- a/lib/sj4core/wakachi.c +++ b/lib/sj4core/wakachi.c @@ -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) {