Implement regetrank that might work

This commit is contained in:
Nishi 2026-06-24 12:27:46 +09:00
commit 871a152b12
5 changed files with 32 additions and 14 deletions

View file

@ -43,15 +43,15 @@ typedef struct jiritu {
TypeDicOfs jofsst; TypeDicOfs jofsst;
TypeDicOfs jofsed; TypeDicOfs jofsed;
u_short flags; u_short flags;
TypeClass jclass; TypeClass jclass;
TypeDicID dicid; TypeDicID dicid;
u_char jlen; u_char jlen;
TypeGram hinsi; TypeGram hinsi;
u_char sttofs; u_char sttofs;
u_char stbofs; u_char stbofs;
u_char count; u_char count;
u_char numlen; u_char numlen;
u_short cost; /* new in SJ4 */ u_short cost; /* new in SJ4 */
} JREC; } JREC;
typedef struct bunsetu { typedef struct bunsetu {

View file

@ -138,6 +138,7 @@ regetrank(SJ4_CONTEXT2) {
nkhcount = tmp = 0; nkhcount = tmp = 0;
} }
#if 0
for(count = khcount, kptr = kouhotbl; count--; kptr++) { for(count = khcount, kptr = kouhotbl; count--; kptr++) {
if(!(kptr->rank)) { if(!(kptr->rank)) {
@ -150,4 +151,21 @@ regetrank(SJ4_CONTEXT2) {
else if((short)kptr->rank >= nrank) else if((short)kptr->rank >= nrank)
kptr->rank += (u_char)nkhcount; kptr->rank += (u_char)nkhcount;
} }
#else
while(1) {
KHREC* best = NULL;
for(count = khcount, kptr = kouhotbl; count--; kptr++) {
if(kptr->rank != 0) continue;
if(best == NULL || kptr->cost < best->cost) {
best = kptr;
}
}
if(best == NULL) break;
best->rank = trank++;
}
#endif
} }

View file

@ -242,7 +242,7 @@ void setjrec(SJ4_CONTEXT u_char* tagp, int mode) {
rec->jseg = prevseg; rec->jseg = prevseg;
rec->jofsst = ptr - dicbuf; rec->jofsst = ptr - dicbuf;
rec->jofsed = tmp - dicbuf; rec->jofsed = tmp - dicbuf;
rec->jclass = C_DICT; rec->jclass = C_DICT;
rec->dicid = curdict->dicid; rec->dicid = curdict->dicid;
rec->hinsi = gram; rec->hinsi = gram;
rec->sttofs = headcode; 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; if(!(rec = argjrec(SJ4_CONTEXT_PASS(int) ClYomiLen(tagp), (JREC*)NULL))) return;
rec->jofsst = tagp - CLSTUDYDICT; rec->jofsst = tagp - CLSTUDYDICT;
rec->jclass = C_BUNSETU; rec->jclass = C_BUNSETU;
rec->hinsi = ClGramCode(tagp); rec->hinsi = ClGramCode(tagp);
} }

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))) { if((rec = argjrec(SJ4_CONTEXT_PASS len1, (JREC*)NULL))) {
rec->jclass = suuji_class; rec->jclass = suuji_class;
rec->hinsi = SUUSI; rec->hinsi = SUUSI;
rec->sttofs = headcode; rec->sttofs = headcode;
rec->stbofs = (u_char)stb; rec->stbofs = (u_char)stb;

View file

@ -69,7 +69,7 @@ void wakachi(SJ4_CONTEXT2) {
if(!(jrec = argjrec(SJ4_CONTEXT_PASS i, (JREC*)NULL))) return; if(!(jrec = argjrec(SJ4_CONTEXT_PASS i, (JREC*)NULL))) return;
jrec->jclass = C_WAKACHI; jrec->jclass = C_WAKACHI;
jrec->hinsi = D_MEISI_1; jrec->hinsi = D_MEISI_1;
if(Chrtbl[*(next - 1)] & TAI_KGU) if(Chrtbl[*(next - 1)] & TAI_KGU)
srchfzk(SJ4_CONTEXT_PASS jrec, next, R_DAIMEISI, 0); srchfzk(SJ4_CONTEXT_PASS jrec, next, R_DAIMEISI, 0);
@ -79,7 +79,7 @@ void wakachi(SJ4_CONTEXT2) {
if(!(jrec = argjrec(SJ4_CONTEXT_PASS 0, (JREC*)NULL))) return; if(!(jrec = argjrec(SJ4_CONTEXT_PASS 0, (JREC*)NULL))) return;
jrec->jclass = C_WAKACHI; jrec->jclass = C_WAKACHI;
jrec->hinsi = MEISI_6; jrec->hinsi = MEISI_6;
while((int)jrec->jlen < maxlen) { while((int)jrec->jlen < maxlen) {