several optimization

This commit is contained in:
Nishi 2026-09-23 13:24:26 +09:00
commit c52b21c9ee
12 changed files with 214 additions and 111 deletions

View file

@ -32,21 +32,9 @@
#include "sj_typedef.h"
#include "sj_dict.h"
#define NO_CODESIZE_INLINE
#include "sj_kanakan.h"
int codesize(u_char code) {
switch(code & KANJIMODEMASK) {
case ZENHIRAASSYUKU:
case ZENKATAASSYUKU:
case KANJIASSYUKU:
case KANJISTREND:
return 1;
case LEADINGHANKAKU:
case OFFSETASSYUKU:
case AIATTRIBUTE:
case KANAKANCOST:
return 2;
default:
return 2;
}
return codesize_inline(code);
}

View file

@ -60,6 +60,8 @@ void get_askknj(SJ4_CONTEXT2) {
p++;
askknj_k[i++] = r;
}
askbase = dicbuf;
}
int seldict(SJ4_CONTEXT TypeDicID id) {

View file

@ -33,18 +33,11 @@
#include "sj_const.h"
#include "sj_dict.h"
#define NO_EUC_CODESIZE_INLINE
#include "sj_kanakan.h"
int euc_codesize(u_char c) {
if((c & KANJIMODEMASK) == 0x90) {
return 1;
} else if(isknj1(c)) {
return 2;
} else if(c == SS3) {
return 3;
} else {
return 1;
}
return euc_codesize_inline(c);
}
int hzstrlen(u_char* ptr, int len) {

View file

@ -85,6 +85,8 @@ dic_mu(SJ4_CONTEXT int mode) {
for(dp = dictlist; dp; dp = dp->next) {
curdict = dp->dict;
(*curdict->getofs)(SJ4_CONTEXT_PASS curdict);
(*curdict->getidx)(SJ4_CONTEXT_PASS curdict);
dicinl = 1;
dicsaml = 0;
prevseg = -1;

View file

@ -35,14 +35,20 @@
#include "sj_kanakan.h"
static void getkhtbl(SJ4_CONTEXT CLREC*), cl_kanji(SJ4_CONTEXT JREC*, CLREC*);
static int diffknj(SJ4_CONTEXT JREC*, u_char*, int);
static void getkhtbl(SJ4_CONTEXT CLREC*, u_char (*)[MAXWDKANJILEN], int*);
static void cl_kanji(SJ4_CONTEXT JREC*, CLREC*, u_char (*)[MAXWDKANJILEN], int*);
static int diffknj(SJ4_CONTEXT JREC*, u_char*, int, u_char (*)[MAXWDKANJILEN], int*);
static void cl_numcmn(SJ4_CONTEXT JREC*, CLREC*);
static u_char* makekan(SJ4_CONTEXT u_char*, u_char*, int);
void mkkouho(SJ4_CONTEXT2) {
CLREC* clrec;
int keeplen;
u_char kcache[64][MAXWDKANJILEN];
int kvalid[64];
int i;
for(i = 0; i < 64; i++) kvalid[i] = -1;
khcount = nkhcount = 0;
@ -51,20 +57,20 @@ void mkkouho(SJ4_CONTEXT2) {
clrec = clt1st;
do {
getkhtbl(SJ4_CONTEXT_PASS clrec);
getkhtbl(SJ4_CONTEXT_PASS clrec, kcache, kvalid);
clrec = clrec->clsort;
} while(clrec && (keeplen == clrec->cllen));
}
static void
getkhtbl(SJ4_CONTEXT CLREC* clrec) {
getkhtbl(SJ4_CONTEXT CLREC* clrec, u_char kcache[][MAXWDKANJILEN], int* kvalid) {
JREC* jrec;
jrec = clrec->jnode;
switch(jrec->jclass) {
case C_DICT:
cl_kanji(SJ4_CONTEXT_PASS jrec, clrec);
cl_kanji(SJ4_CONTEXT_PASS jrec, clrec, kcache, kvalid);
break;
case C_N_ARABIA:
case C_N_ARACMA:
@ -88,7 +94,7 @@ getkhtbl(SJ4_CONTEXT CLREC* clrec) {
}
static void
cl_kanji(SJ4_CONTEXT JREC* jrec, CLREC* clrec) {
cl_kanji(SJ4_CONTEXT JREC* jrec, CLREC* clrec, u_char kcache[][MAXWDKANJILEN], int* kvalid) {
u_char* ptr;
int kcount = khcount;
@ -99,7 +105,7 @@ cl_kanji(SJ4_CONTEXT JREC* jrec, CLREC* clrec) {
get_askknj(SJ4_CONTEXT_PASS2);
while(*ptr != HINSIBLKTERM) {
if(diffknj(SJ4_CONTEXT_PASS jrec, ptr, kcount)) {
if(diffknj(SJ4_CONTEXT_PASS jrec, ptr, kcount, kcache, kvalid)) {
setkouho(SJ4_CONTEXT_PASS clrec, (TypeDicOfs)(ptr - dicbuf), 0);
}
ptr = skipkstr(ptr);
@ -233,7 +239,7 @@ makekan(SJ4_CONTEXT u_char* s, u_char* d, int flg) {
default:
d = makekan_norm(SJ4_CONTEXT_PASS s, d, FALSE);
}
s += codesize(*s);
s += csize;
}
return d;
@ -300,12 +306,11 @@ sameknj(u_char* p, u_char plen, u_char* q, u_char qlen) {
#undef QEND
static int
diffknj(SJ4_CONTEXT JREC* jrec, u_char* ptr, int num) {
diffknj(SJ4_CONTEXT JREC* jrec, u_char* ptr, int num, u_char kcache[][MAXWDKANJILEN], int* kvalid) {
KHREC* kptr;
JREC* jptr;
int i;
u_char kbuf1[MAXWDKANJILEN];
u_char kbuf2[MAXWDKANJILEN];
if(jrec->hinsi == TANKANJI) return TRUE;
@ -327,10 +332,17 @@ diffknj(SJ4_CONTEXT JREC* jrec, u_char* ptr, int num) {
if(jptr->stbofs != jrec->stbofs) continue;
makekan(SJ4_CONTEXT_PASS dicbuf + kptr->offs, kbuf2, TRUE);
{
int slot = i & (64 - 1);
if(sameknj(kbuf1, jrec->jlen, kbuf2, jptr->jlen))
return FALSE;
if(kvalid[slot] != i) {
makekan(SJ4_CONTEXT_PASS dicbuf + kptr->offs, kcache[slot], TRUE);
kvalid[slot] = i;
}
if(sameknj(kbuf1, jrec->jlen, kcache[slot], jptr->jlen))
return FALSE;
}
}
return TRUE;