Fix multi-context

This commit is contained in:
Nishi 2026-06-20 00:17:43 +09:00
commit 788eed763a
15 changed files with 163 additions and 125 deletions

View file

@ -151,6 +151,10 @@ int hzstrlen(u_char*, int);
void seg_count(SJ3_CONTEXT DICT*); void seg_count(SJ3_CONTEXT DICT*);
void mkidxtbl(SJ3_CONTEXT DICT*); void mkidxtbl(SJ3_CONTEXT DICT*);
void initwork(SJ3_CONTEXT2); void initwork(SJ3_CONTEXT2);
#ifndef SJ3_GLOBAL
Sj3Context* alloccontext(const char*);
void free_context(Sj3Context*);
#endif
/* istrcmp.c */ /* istrcmp.c */
int istrcmp(u_char*, u_char*, int, int); int istrcmp(u_char*, u_char*, int, int);
@ -178,12 +182,12 @@ JREC* argjrec(SJ3_CONTEXT int, JREC*);
/* mkkouho.c */ /* mkkouho.c */
void mkkouho(SJ3_CONTEXT2); void mkkouho(SJ3_CONTEXT2);
u_char* makekan_none(u_char*, u_char*, int); u_char* makekan_none(SJ3_CONTEXT u_char*, u_char*, int);
u_char* makekan_1byte(u_char*, u_char*, int); u_char* makekan_1byte(SJ3_CONTEXT u_char*, u_char*, int);
u_char* makekan_knj(SJ3_CONTEXT u_char*, u_char*, int); u_char* makekan_knj(SJ3_CONTEXT u_char*, u_char*, int);
u_char* makekan_ofs(SJ3_CONTEXT u_char*, u_char*, int); u_char* makekan_ofs(SJ3_CONTEXT u_char*, u_char*, int);
u_char* makekan_norm(u_char*, u_char*, int); u_char* makekan_norm(SJ3_CONTEXT u_char*, u_char*, int);
u_char* makekan_ascii(u_char*, u_char*, int); u_char* makekan_ascii(SJ3_CONTEXT u_char*, u_char*, int);
int sel_sjmode(JREC*); int sel_sjmode(JREC*);
/* mknumber.c */ /* mknumber.c */
@ -260,12 +264,12 @@ extern u_short* selsjadrs[];
int setconj(SJ3_CONTEXT TypeGram, JREC*, CREC*); int setconj(SJ3_CONTEXT TypeGram, JREC*, CREC*);
/* setjrec.c */ /* setjrec.c */
int setj_atrb(u_char*); int setj_atrb(SJ3_CONTEXT u_char*);
int setj_ofs(SJ3_CONTEXT u_char*); int setj_ofs(SJ3_CONTEXT u_char*);
int setj_knj(SJ3_CONTEXT u_char*); int setj_knj(SJ3_CONTEXT u_char*);
int setj_norm1(u_char*); int setj_norm1(SJ3_CONTEXT u_char*);
int setj_norm2(u_char*); int setj_norm2(SJ3_CONTEXT u_char*);
int setj_norm3(u_char*); /* unused??? */ int setj_norm3(SJ3_CONTEXT u_char*); /* unused??? */
void setjrec(SJ3_CONTEXT u_char*, int); void setjrec(SJ3_CONTEXT u_char*, int);
void setnumrec(SJ3_CONTEXT u_char*, JREC*, TypeGram); void setnumrec(SJ3_CONTEXT u_char*, JREC*, TypeGram);
void setcrec(SJ3_CONTEXT u_char*); void setcrec(SJ3_CONTEXT u_char*);
@ -273,13 +277,13 @@ void setcrec(SJ3_CONTEXT u_char*);
/* setkouho.c */ /* setkouho.c */
void setkouho(SJ3_CONTEXT CLREC*, TypeDicOfs, int); void setkouho(SJ3_CONTEXT CLREC*, TypeDicOfs, int);
void ph_setkouho(SJ3_CONTEXT CLREC*, TypeDicOfs, STDYIN*); void ph_setkouho(SJ3_CONTEXT CLREC*, TypeDicOfs, STDYIN*);
int hiraknj_atrb(u_char*, int*); int hiraknj_atrb(SJ3_CONTEXT u_char*, int*);
int hiraknj_ofs(SJ3_CONTEXT u_char*, int*); int hiraknj_ofs(SJ3_CONTEXT u_char*, int*);
int hiraknj_knj(SJ3_CONTEXT u_char*, int*); int hiraknj_knj(SJ3_CONTEXT u_char*, int*);
int hiraknj_hask(u_char*, int*); int hiraknj_hask(SJ3_CONTEXT u_char*, int*);
int hiraknj_kask(u_char*, int*); int hiraknj_kask(SJ3_CONTEXT u_char*, int*);
int hiraknj_norm(u_char*, int*); int hiraknj_norm(SJ3_CONTEXT u_char*, int*);
int hiraknj_hira(u_char*, int*); int hiraknj_hira(SJ3_CONTEXT u_char*, int*);
/* setubi.c */ /* setubi.c */
u_char* getstb(TypeGram); u_char* getstb(TypeGram);

View file

@ -202,6 +202,8 @@
#define seg_count Jseg_count #define seg_count Jseg_count
#define mkidxtbl Jmkidxtbl #define mkidxtbl Jmkidxtbl
#define initwork Jinitwork #define initwork Jinitwork
#define alloccontext Jalloccontext
#define free_context Jfree_context
#define free_jlst Jfree_jlst #define free_jlst Jfree_jlst
#define free_clst Jfree_clst #define free_clst Jfree_clst

View file

@ -98,7 +98,7 @@ u_int adddic(SJ3_CONTEXT u_char* yomi, u_char* kanji, TypeGram hinsi) {
segnum = srchidx(SJ3_CONTEXT_PASS(TypeDicSeg) DICSEGBASE, cnvlen); segnum = srchidx(SJ3_CONTEXT_PASS(TypeDicSeg) DICSEGBASE, cnvlen);
for(;;) { for(;;) {
(*curdict->getdic)(curdict, segnum); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, segnum);
i = srchkana(SJ3_CONTEXT_PASS & p1, &saml); i = srchkana(SJ3_CONTEXT_PASS & p1, &saml);
dstofs = douofs = p1 - dicbuf; dstofs = douofs = p1 - dicbuf;
hnsofs = knjofs = 0; hnsofs = knjofs = 0;
@ -153,7 +153,7 @@ u_int adddic(SJ3_CONTEXT u_char* yomi, u_char* kanji, TypeGram hinsi) {
if((unsigned int)freidx < getplen(p1) + nlen + 1) if((unsigned int)freidx < getplen(p1) + nlen + 1)
return AD_OVFLWINDEX; return AD_OVFLWINDEX;
if((*curdict->putdic)(curdict, curdict->segunit)) if((*curdict->putdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit))
return AD_OVFLWUSRDIC; return AD_OVFLWUSRDIC;
sprt_seg(SJ3_CONTEXT_PASS segnum, pos); sprt_seg(SJ3_CONTEXT_PASS segnum, pos);
@ -166,15 +166,15 @@ u_int adddic(SJ3_CONTEXT u_char* yomi, u_char* kanji, TypeGram hinsi) {
if((unsigned int)freidx < cnvlen + 1) if((unsigned int)freidx < cnvlen + 1)
return AD_OVFLWINDEX; return AD_OVFLWINDEX;
if((*curdict->putdic)(curdict, curdict->segunit)) if((*curdict->putdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit))
return AD_OVFLWUSRDIC; return AD_OVFLWUSRDIC;
curdict->segunit++; curdict->segunit++;
(*curdict->getdic)(curdict, curdict->segunit - 1); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit - 1);
memset(dicbuf, DICSEGTERM, (int)curdict->seglen); memset(dicbuf, DICSEGTERM, (int)curdict->seglen);
dicbuf[0] = 0; dicbuf[0] = 0;
(*curdict->putdic)(curdict, curdict->segunit - 1); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit - 1);
(*curdict->rszdic)(curdict, curdict->segunit); (*curdict->rszdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit);
mkidxtbl(SJ3_CONTEXT_PASS curdict); mkidxtbl(SJ3_CONTEXT_PASS curdict);
segnum++; segnum++;
@ -183,7 +183,7 @@ u_int adddic(SJ3_CONTEXT u_char* yomi, u_char* kanji, TypeGram hinsi) {
if((unsigned int)freidx < getplen(p1) + nlen + 1) if((unsigned int)freidx < getplen(p1) + nlen + 1)
return AD_OVFLWINDEX; return AD_OVFLWINDEX;
if((*curdict->putdic)(curdict, curdict->segunit)) if((*curdict->putdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit))
return AD_OVFLWUSRDIC; return AD_OVFLWUSRDIC;
sprt_seg(SJ3_CONTEXT_PASS segnum, douofs); sprt_seg(SJ3_CONTEXT_PASS segnum, douofs);
@ -258,7 +258,7 @@ u_int adddic(SJ3_CONTEXT u_char* yomi, u_char* kanji, TypeGram hinsi) {
if(!knjofs) if(!knjofs)
*dstptr++ = HINSIBLKTERM; *dstptr++ = HINSIBLKTERM;
(*curdict->putdic)(curdict, segnum); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, segnum);
if(StudyExist()) { if(StudyExist()) {
size -= nxtask; size -= nxtask;
@ -418,13 +418,13 @@ sprt_seg(SJ3_CONTEXT TypeDicSeg seg, TypeDicOfs ofs) {
STDYIN* stdy; STDYIN* stdy;
for(s = curdict->segunit - 1; s >= seg; s--) { for(s = curdict->segunit - 1; s >= seg; s--) {
(*curdict->getdic)(curdict, s); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, s);
(*curdict->putdic)(curdict, s + 1); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, s + 1);
} }
curdict->segunit++; curdict->segunit++;
(*curdict->rszdic)(curdict, curdict->segunit); (*curdict->rszdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit);
(*curdict->getdic)(curdict, seg + 1); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, seg + 1);
pos = dicbuf + ofs; pos = dicbuf + ofs;
@ -455,7 +455,7 @@ sprt_seg(SJ3_CONTEXT TypeDicSeg seg, TypeDicOfs ofs) {
p += i; p += i;
memset(p, DICSEGTERM, (dicbuf + curdict->seglen - p)); memset(p, DICSEGTERM, (dicbuf + curdict->seglen - p));
(*curdict->putdic)(curdict, seg + 1); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, seg + 1);
if(StudyExist()) { if(StudyExist()) {
dicid = curdict->dicid; dicid = curdict->dicid;
@ -473,9 +473,9 @@ sprt_seg(SJ3_CONTEXT TypeDicSeg seg, TypeDicOfs ofs) {
} }
} }
(*curdict->getdic)(curdict, seg); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, seg);
memset(dicbuf + ofs, DICSEGTERM, (int)(curdict->seglen - ofs)); memset(dicbuf + ofs, DICSEGTERM, (int)(curdict->seglen - ofs));
(*curdict->putdic)(curdict, seg); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, seg);
} }
static void static void
@ -493,7 +493,7 @@ apnd_uidx(SJ3_CONTEXT TypeDicSeg seg, u_char* yomi, int len) {
*p++ = *yomi++; *p++ = *yomi++;
*p = 0; *p = 0;
(*curdict->putidx)(curdict, 0); (*curdict->putidx)(SJ3_CONTEXT_PASS curdict, 0);
mkidxtbl(SJ3_CONTEXT_PASS curdict); mkidxtbl(SJ3_CONTEXT_PASS curdict);
} }

View file

@ -347,7 +347,7 @@ void chg_uidx(SJ3_CONTEXT TypeDicSeg seg, u_char* yomi, int len) {
} }
while(len--) *p++ = *yomi++; while(len--) *p++ = *yomi++;
(*curdict->putidx)(curdict, 0); (*curdict->putidx)(SJ3_CONTEXT_PASS curdict, 0);
mkidxtbl(SJ3_CONTEXT_PASS curdict); mkidxtbl(SJ3_CONTEXT_PASS curdict);
} }

View file

@ -82,7 +82,7 @@ void cvtdict(SJ3_CONTEXT KHREC* krec, CLREC* clrec, int flg) {
if(flg) { if(flg) {
(*Cvtnum_func[krec->mode - 1])(ystart + sttlen, yptr, jrec); (*Cvtnum_func[krec->mode - 1])(SJ3_CONTEXT_PASS ystart + sttlen, yptr, jrec);
yptr += (i = jrec->numlen) * 2; yptr += (i = jrec->numlen) * 2;
jlen -= i; jlen -= i;
@ -108,7 +108,7 @@ void cvtdict(SJ3_CONTEXT KHREC* krec, CLREC* clrec, int flg) {
if(ofs) { if(ofs) {
if(seldict(SJ3_CONTEXT_PASS jrec->dicid)) { if(seldict(SJ3_CONTEXT_PASS jrec->dicid)) {
(*curdict->getdic)(curdict, jrec->jseg); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, jrec->jseg);
get_askknj(SJ3_CONTEXT_PASS2); get_askknj(SJ3_CONTEXT_PASS2);
kanjitmp += kanjitmp +=
getkanji(SJ3_CONTEXT_PASS yptr, jlen, dicbuf + ofs, kanjitmp); getkanji(SJ3_CONTEXT_PASS yptr, jlen, dicbuf + ofs, kanjitmp);

View file

@ -69,7 +69,7 @@ u_int deldic(SJ3_CONTEXT u_char* yomi, u_char* kanji, TypeGram hinsi) {
cnvlen = sstrlen(yptr); cnvlen = sstrlen(yptr);
useg = srchidx(SJ3_CONTEXT_PASS(TypeDicSeg) DICSEGBASE, cnvlen); useg = srchidx(SJ3_CONTEXT_PASS(TypeDicSeg) DICSEGBASE, cnvlen);
(*curdict->getdic)(curdict, useg); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, useg);
if(!(dblknum = srchkana(SJ3_CONTEXT_PASS & p1, &samlen))) return AD_NOMIDASI; if(!(dblknum = srchkana(SJ3_CONTEXT_PASS & p1, &samlen))) return AD_NOMIDASI;
@ -108,7 +108,7 @@ u_int deldic(SJ3_CONTEXT u_char* yomi, u_char* kanji, TypeGram hinsi) {
set_size(p1, (int)(getsize(p1) - size), set_size(p1, (int)(getsize(p1) - size),
(int)getplen(p1), (int)getnlen(p1)); (int)getplen(p1), (int)getnlen(p1));
(*curdict->putdic)(curdict, useg); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, useg);
del_stdy(SJ3_CONTEXT_PASS useg, ofs, size); del_stdy(SJ3_CONTEXT_PASS useg, ofs, size);
@ -154,7 +154,7 @@ del_douon(SJ3_CONTEXT TypeDicSeg seg, u_char* ptr, TypeDicOfs ofs) {
} }
} }
(*curdict->putdic)(curdict, seg); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, seg);
del_stdy(SJ3_CONTEXT_PASS seg, ofs, size); del_stdy(SJ3_CONTEXT_PASS seg, ofs, size);
@ -171,17 +171,17 @@ del_segment(SJ3_CONTEXT TypeDicSeg seg) {
if(curdict->segunit > 1) { if(curdict->segunit > 1) {
for(sg = seg + 1; sg < curdict->segunit; sg++) { for(sg = seg + 1; sg < curdict->segunit; sg++) {
(*curdict->getdic)(curdict, sg); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, sg);
(*curdict->putdic)(curdict, sg - 1); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, sg - 1);
} }
curdict->segunit--; curdict->segunit--;
} else { } else {
memset(dicbuf, DICSEGTERM, (int)curdict->seglen); memset(dicbuf, DICSEGTERM, (int)curdict->seglen);
dicbuf[0] = 0; dicbuf[0] = 0;
(*curdict->putdic)(curdict, DICSEGBASE); (*curdict->putdic)(SJ3_CONTEXT_PASS curdict, DICSEGBASE);
} }
(*curdict->rszdic)(curdict, curdict->segunit); (*curdict->rszdic)(SJ3_CONTEXT_PASS curdict, curdict->segunit);
del_uidx(SJ3_CONTEXT_PASS seg); del_uidx(SJ3_CONTEXT_PASS seg);
@ -227,7 +227,7 @@ del_uidx(SJ3_CONTEXT TypeDicSeg seg) {
len = q - p; len = q - p;
memset(idxbuf + curdict->idxlen - len, 0, len); memset(idxbuf + curdict->idxlen - len, 0, len);
(*curdict->putidx)(curdict, 0); (*curdict->putidx)(SJ3_CONTEXT_PASS curdict, 0);
mkidxtbl(SJ3_CONTEXT_PASS curdict); mkidxtbl(SJ3_CONTEXT_PASS curdict);
} }

View file

@ -82,8 +82,8 @@ int seldict(SJ3_CONTEXT TypeDicID id) {
u_char* u_char*
get_idxptr(SJ3_CONTEXT TypeDicSeg seg) { get_idxptr(SJ3_CONTEXT TypeDicSeg seg) {
(*curdict->getofs)(curdict); (*curdict->getofs)(SJ3_CONTEXT_PASS curdict);
(*curdict->getidx)(curdict); (*curdict->getidx)(SJ3_CONTEXT_PASS curdict);
return idxbuf + idxofs[seg]; return idxbuf + idxofs[seg];
} }

View file

@ -43,7 +43,7 @@ void seg_count(SJ3_CONTEXT DICT* dict) {
TypeDicSeg segcnt = 0; TypeDicSeg segcnt = 0;
if(dict->getidx) { if(dict->getidx) {
(*dict->getidx)(dict); (*dict->getidx)(SJ3_CONTEXT_PASS dict);
p = idxbuf; p = idxbuf;
q = p + dict->idxlen; q = p + dict->idxlen;
@ -64,8 +64,8 @@ void mkidxtbl(SJ3_CONTEXT DICT* dict) {
seg = 0; seg = 0;
(*dict->getidx)(dict); (*dict->getidx)(SJ3_CONTEXT_PASS dict);
(*dict->getofs)(dict); (*dict->getofs)(SJ3_CONTEXT_PASS dict);
idxofs[0] = 0; idxofs[0] = 0;
for(p = idxbuf; p < idxbuf + dict->idxlen && seg < dict->segunit;) { for(p = idxbuf; p < idxbuf + dict->idxlen && seg < dict->segunit;) {
@ -78,3 +78,49 @@ void initwork(SJ3_CONTEXT2) {
jrt1st = jrt2nd = maxjptr = (JREC*)0; jrt1st = jrt2nd = maxjptr = (JREC*)0;
clt1st = clt2nd = maxclptr = (CLREC*)0; clt1st = clt2nd = maxclptr = (CLREC*)0;
} }
#ifndef SJ3_GLOBAL
Sj3Context* alloccontext(const char* dic) {
Sj3Context* ctx = calloc(1, sizeof(*ctx));
DictFile* dict;
DICTL* node;
ctx->work = calloc(1, sizeof(*ctx->work));
ctx->stdy = calloc(1, sizeof(*ctx->stdy));
node = calloc(1, sizeof(*node));
ctx->work->Jdictlist = node;
initwork(ctx);
dict = opendict(ctx, (char*)dic, "");
node->dict = &dict->dict;
node->next = NULL;
seldict(ctx, dict->dict.dicid);
return ctx;
}
void free_context(Sj3Context* ctx) {
DICTL* node;
node = ctx->work->Jdictlist;
while(node != NULL) {
DICTL* next = node->next;
closedict(ctx, (DictFile*)node->dict);
free(node);
node = next;
}
freework(ctx);
free(ctx->stdy);
free(ctx->work);
free(ctx);
}
#endif

View file

@ -99,7 +99,7 @@ cl_kanji(SJ3_CONTEXT JREC* jrec, CLREC* clrec) {
int kcount = khcount; int kcount = khcount;
if(seldict(SJ3_CONTEXT_PASS jrec->dicid)) { if(seldict(SJ3_CONTEXT_PASS jrec->dicid)) {
(*curdict->getdic)(curdict, jrec->jseg); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, jrec->jseg);
ptr = dicbuf + jrec->jofsst + 1; ptr = dicbuf + jrec->jofsst + 1;
get_askknj(SJ3_CONTEXT_PASS2); get_askknj(SJ3_CONTEXT_PASS2);
@ -116,12 +116,12 @@ cl_kanji(SJ3_CONTEXT JREC* jrec, CLREC* clrec) {
} }
u_char* u_char*
makekan_none(u_char* s, u_char* d, int flg) { makekan_none(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
return d; return d;
} }
u_char* u_char*
makekan_1byte(u_char* s, u_char* d, int flg) { makekan_1byte(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
if((*s & KANJIMODEMASK) == ZENHIRAASSYUKU) if((*s & KANJIMODEMASK) == ZENHIRAASSYUKU)
*d++ = 0x10 | (*s & KNJASSYUKUMASK); *d++ = 0x10 | (*s & KNJASSYUKUMASK);
else else
@ -142,7 +142,7 @@ u_char* makekan_ofs(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
} }
u_char* u_char*
makekan_norm(u_char* s, u_char* d, int flg) { makekan_norm(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
u_char c; u_char c;
if(*s != 0) { if(*s != 0) {
@ -159,7 +159,7 @@ makekan_norm(u_char* s, u_char* d, int flg) {
} }
u_char* u_char*
makekan_ascii(u_char* s, u_char* d, int flg) { makekan_ascii(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
u_char c; u_char c;
c = s[1]; c = s[1];
@ -181,11 +181,11 @@ makekan(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
if(s[csize] == KANJISTREND) { if(s[csize] == KANJISTREND) {
switch(*s & KANJIMODEMASK) { switch(*s & KANJIMODEMASK) {
case ZENHIRAASSYUKU: case ZENHIRAASSYUKU:
d = makekan_1byte(s, d, flg); d = makekan_1byte(SJ3_CONTEXT_PASS s, d, flg);
break; break;
case ZENKATAASSYUKU: case ZENKATAASSYUKU:
d = makekan_1byte(s, d, flg); d = makekan_1byte(SJ3_CONTEXT_PASS s, d, flg);
break; break;
case OFFSETASSYUKU: case OFFSETASSYUKU:
@ -193,11 +193,11 @@ makekan(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
break; break;
case AIATTRIBUTE: case AIATTRIBUTE:
d = makekan_none(s, d, flg); d = makekan_none(SJ3_CONTEXT_PASS s, d, flg);
break; break;
case LEADINGHANKAKU: case LEADINGHANKAKU:
d = makekan_ascii(s, d, flg); d = makekan_ascii(SJ3_CONTEXT_PASS s, d, flg);
break; break;
case KANJIASSYUKU: case KANJIASSYUKU:
@ -205,17 +205,17 @@ makekan(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
break; break;
default: default:
d = makekan_norm(s, d, flg); d = makekan_norm(SJ3_CONTEXT_PASS s, d, flg);
} }
break; break;
} else } else
switch(*s & KANJIMODEMASK) { switch(*s & KANJIMODEMASK) {
case ZENHIRAASSYUKU: case ZENHIRAASSYUKU:
d = makekan_1byte(s, d, FALSE); d = makekan_1byte(SJ3_CONTEXT_PASS s, d, FALSE);
break; break;
case ZENKATAASSYUKU: case ZENKATAASSYUKU:
d = makekan_1byte(s, d, FALSE); d = makekan_1byte(SJ3_CONTEXT_PASS s, d, FALSE);
break; break;
case OFFSETASSYUKU: case OFFSETASSYUKU:
@ -223,11 +223,11 @@ makekan(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
break; break;
case AIATTRIBUTE: case AIATTRIBUTE:
d = makekan_none(s, d, FALSE); d = makekan_none(SJ3_CONTEXT_PASS s, d, FALSE);
break; break;
case LEADINGHANKAKU: case LEADINGHANKAKU:
d = makekan_ascii(s, d, FALSE); d = makekan_ascii(SJ3_CONTEXT_PASS s, d, FALSE);
break; break;
case KANJIASSYUKU: case KANJIASSYUKU:
@ -235,7 +235,7 @@ makekan(SJ3_CONTEXT u_char* s, u_char* d, int flg) {
break; break;
default: default:
d = makekan_norm(s, d, FALSE); d = makekan_norm(SJ3_CONTEXT_PASS s, d, FALSE);
} }
s += codesize(*s); s += codesize(*s);
} }
@ -404,7 +404,7 @@ cl_numcmn(SJ3_CONTEXT JREC* jrec, CLREC* clrec) {
i = sel_sjmode(jrec); i = sel_sjmode(jrec);
if(seldict(SJ3_CONTEXT_PASS jrec->dicid)) { if(seldict(SJ3_CONTEXT_PASS jrec->dicid)) {
(*curdict->getdic)(curdict, jrec->jseg); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, jrec->jseg);
p = dicbuf + jrec->jofsst + 1; p = dicbuf + jrec->jofsst + 1;

View file

@ -50,7 +50,7 @@ int getusr(SJ3_CONTEXT u_char* buf) {
peepyomi[0] = peepknj[0] = peepgrm = 0; peepyomi[0] = peepknj[0] = peepgrm = 0;
(*curdict->getdic)(curdict, peepidx = DICSEGBASE); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, peepidx = DICSEGBASE);
get_askknj(SJ3_CONTEXT_PASS2); get_askknj(SJ3_CONTEXT_PASS2);
peepdptr = segtop(); peepdptr = segtop();
@ -74,7 +74,7 @@ int getusr(SJ3_CONTEXT u_char* buf) {
} }
int nextusr(SJ3_CONTEXT u_char* buf) { int nextusr(SJ3_CONTEXT u_char* buf) {
(*curdict->getdic)(curdict, peepidx); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, peepidx);
get_askknj(SJ3_CONTEXT_PASS2); get_askknj(SJ3_CONTEXT_PASS2);
if(next_kanji(SJ3_CONTEXT_PASS2)) { if(next_kanji(SJ3_CONTEXT_PASS2)) {
@ -89,7 +89,7 @@ int nextusr(SJ3_CONTEXT u_char* buf) {
} }
int prevusr(SJ3_CONTEXT u_char* buf) { int prevusr(SJ3_CONTEXT u_char* buf) {
(*curdict->getdic)(curdict, peepidx); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, peepidx);
get_askknj(SJ3_CONTEXT_PASS2); get_askknj(SJ3_CONTEXT_PASS2);
if(prev_kanji(SJ3_CONTEXT_PASS2)) { if(prev_kanji(SJ3_CONTEXT_PASS2)) {
@ -185,7 +185,7 @@ prev_douon(SJ3_CONTEXT2) {
if(peepdptr <= segtop()) { if(peepdptr <= segtop()) {
if(peepidx <= DICSEGBASE) return 0; if(peepidx <= DICSEGBASE) return 0;
(*curdict->getdic)(curdict, --peepidx); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, --peepidx);
get_askknj(SJ3_CONTEXT_PASS2); get_askknj(SJ3_CONTEXT_PASS2);
set_idxyomi(SJ3_CONTEXT_PASS2); set_idxyomi(SJ3_CONTEXT_PASS2);
@ -272,7 +272,7 @@ next_douon(SJ3_CONTEXT2) {
if(segend(p1)) { if(segend(p1)) {
if(peepidx + 1 < curdict->segunit) { if(peepidx + 1 < curdict->segunit) {
(*curdict->getdic)(curdict, ++peepidx); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, ++peepidx);
get_askknj(SJ3_CONTEXT_PASS2); get_askknj(SJ3_CONTEXT_PASS2);
peepdptr = segtop(); peepdptr = segtop();

View file

@ -50,7 +50,7 @@ ph_setsty(SJ3_CONTEXT CLREC* clrec) {
return; return;
} }
(*curdict->getdic)(curdict, jrec->jseg); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, jrec->jseg);
ptr = dicbuf + jrec->jofsst + 1; ptr = dicbuf + jrec->jofsst + 1;
for(; *ptr != HINSIBLKTERM; ptr = skipkstr(ptr)) { for(; *ptr != HINSIBLKTERM; ptr = skipkstr(ptr)) {

View file

@ -39,7 +39,7 @@
#include "sj_kanakan.h" #include "sj_kanakan.h"
int setj_atrb(u_char* p) { int setj_atrb(SJ3_CONTEXT u_char* p) {
return 2; return 2;
} }
@ -52,11 +52,11 @@ int setj_ofs(SJ3_CONTEXT u_char* p) {
if(p[codesize(*p)] == KANJISTREND) contf = FALSE; if(p[codesize(*p)] == KANJISTREND) contf = FALSE;
switch(*p & KANJIMODEMASK) { switch(*p & KANJIMODEMASK) {
case ZENHIRAASSYUKU: case ZENHIRAASSYUKU:
p += setj_norm1(p); p += setj_norm1(SJ3_CONTEXT_PASS p);
break; break;
case ZENKATAASSYUKU: case ZENKATAASSYUKU:
p += setj_norm1(p); p += setj_norm1(SJ3_CONTEXT_PASS p);
break; break;
case OFFSETASSYUKU: case OFFSETASSYUKU:
@ -64,11 +64,11 @@ int setj_ofs(SJ3_CONTEXT u_char* p) {
break; break;
case AIATTRIBUTE: case AIATTRIBUTE:
p += setj_atrb(p); p += setj_atrb(SJ3_CONTEXT_PASS p);
break; break;
case LEADINGHANKAKU: case LEADINGHANKAKU:
p += setj_norm2(p); p += setj_norm2(SJ3_CONTEXT_PASS p);
break; break;
case KANJIASSYUKU: case KANJIASSYUKU:
@ -80,7 +80,7 @@ int setj_ofs(SJ3_CONTEXT u_char* p) {
break; break;
default: default:
p += setj_norm2(p); p += setj_norm2(SJ3_CONTEXT_PASS p);
} }
} while(contf); } while(contf);
@ -96,11 +96,11 @@ int setj_knj(SJ3_CONTEXT u_char* p) {
if(p[codesize(*p)] == KANJISTREND) contf = FALSE; if(p[codesize(*p)] == KANJISTREND) contf = FALSE;
switch(*p & KANJIMODEMASK) { switch(*p & KANJIMODEMASK) {
case ZENHIRAASSYUKU: case ZENHIRAASSYUKU:
p += setj_norm1(p); p += setj_norm1(SJ3_CONTEXT_PASS p);
break; break;
case ZENKATAASSYUKU: case ZENKATAASSYUKU:
p += setj_norm1(p); p += setj_norm1(SJ3_CONTEXT_PASS p);
break; break;
case OFFSETASSYUKU: case OFFSETASSYUKU:
@ -108,11 +108,11 @@ int setj_knj(SJ3_CONTEXT u_char* p) {
break; break;
case AIATTRIBUTE: case AIATTRIBUTE:
p += setj_atrb(p); p += setj_atrb(SJ3_CONTEXT_PASS p);
break; break;
case LEADINGHANKAKU: case LEADINGHANKAKU:
p += setj_norm2(p); p += setj_norm2(SJ3_CONTEXT_PASS p);
break; break;
case KANJIASSYUKU: case KANJIASSYUKU:
@ -124,22 +124,22 @@ int setj_knj(SJ3_CONTEXT u_char* p) {
break; break;
default: default:
p += setj_norm2(p); p += setj_norm2(SJ3_CONTEXT_PASS p);
} }
} while(contf); } while(contf);
return 1; return 1;
} }
int setj_norm1(u_char* p) { int setj_norm1(SJ3_CONTEXT u_char* p) {
return 1; return 1;
} }
int setj_norm2(u_char* p) { int setj_norm2(SJ3_CONTEXT u_char* p) {
return 2; return 2;
} }
int setj_norm3(u_char* p) { int setj_norm3(SJ3_CONTEXT u_char* p) {
return 3; return 3;
} }
@ -187,11 +187,11 @@ void setjrec(SJ3_CONTEXT u_char* tagp, int mode) {
for(tmp = ptr + 1; *tmp != HINSIBLKTERM;) { for(tmp = ptr + 1; *tmp != HINSIBLKTERM;) {
switch(*tmp & KANJIMODEMASK) { switch(*tmp & KANJIMODEMASK) {
case ZENHIRAASSYUKU: case ZENHIRAASSYUKU:
tmp += setj_norm1(tmp); tmp += setj_norm1(SJ3_CONTEXT_PASS tmp);
break; break;
case ZENKATAASSYUKU: case ZENKATAASSYUKU:
tmp += setj_norm1(tmp); tmp += setj_norm1(SJ3_CONTEXT_PASS tmp);
break; break;
case OFFSETASSYUKU: case OFFSETASSYUKU:
@ -199,11 +199,11 @@ void setjrec(SJ3_CONTEXT u_char* tagp, int mode) {
break; break;
case AIATTRIBUTE: case AIATTRIBUTE:
tmp += setj_atrb(tmp); tmp += setj_atrb(SJ3_CONTEXT_PASS tmp);
break; break;
case LEADINGHANKAKU: case LEADINGHANKAKU:
tmp += setj_norm2(tmp); tmp += setj_norm2(SJ3_CONTEXT_PASS tmp);
break; break;
case KANJIASSYUKU: case KANJIASSYUKU:
@ -215,7 +215,7 @@ void setjrec(SJ3_CONTEXT u_char* tagp, int mode) {
break; break;
default: default:
tmp += setj_norm2(tmp); tmp += setj_norm2(SJ3_CONTEXT_PASS tmp);
} }
} }
@ -255,11 +255,11 @@ void setnumrec(SJ3_CONTEXT u_char* tagp, JREC* rec, TypeGram gram) {
for(tmp = ptr + 1; *tmp != HINSIBLKTERM;) { for(tmp = ptr + 1; *tmp != HINSIBLKTERM;) {
switch(*tmp & KANJIMODEMASK) { switch(*tmp & KANJIMODEMASK) {
case ZENHIRAASSYUKU: case ZENHIRAASSYUKU:
tmp += setj_norm1(tmp); tmp += setj_norm1(SJ3_CONTEXT_PASS tmp);
break; break;
case ZENKATAASSYUKU: case ZENKATAASSYUKU:
tmp += setj_norm1(tmp); tmp += setj_norm1(SJ3_CONTEXT_PASS tmp);
break; break;
case OFFSETASSYUKU: case OFFSETASSYUKU:
@ -267,11 +267,11 @@ void setnumrec(SJ3_CONTEXT u_char* tagp, JREC* rec, TypeGram gram) {
break; break;
case AIATTRIBUTE: case AIATTRIBUTE:
tmp += setj_atrb(tmp); tmp += setj_atrb(SJ3_CONTEXT_PASS tmp);
break; break;
case LEADINGHANKAKU: case LEADINGHANKAKU:
tmp += setj_norm2(tmp); tmp += setj_norm2(SJ3_CONTEXT_PASS tmp);
break; break;
case KANJIASSYUKU: case KANJIASSYUKU:
@ -283,7 +283,7 @@ void setnumrec(SJ3_CONTEXT u_char* tagp, JREC* rec, TypeGram gram) {
break; break;
default: default:
tmp += setj_norm2(tmp); tmp += setj_norm2(SJ3_CONTEXT_PASS tmp);
} }
} }

View file

@ -163,11 +163,11 @@ hiraknj(SJ3_CONTEXT u_char* p) {
if(p[codesize(*p)] == KANJISTREND) flg = FALSE; if(p[codesize(*p)] == KANJISTREND) flg = FALSE;
switch(*p & KANJIMODEMASK) { switch(*p & KANJIMODEMASK) {
case ZENHIRAASSYUKU: case ZENHIRAASSYUKU:
result = hiraknj_hask(p, &i); result = hiraknj_hask(SJ3_CONTEXT_PASS p, &i);
break; break;
case ZENKATAASSYUKU: case ZENKATAASSYUKU:
result = hiraknj_kask(p, &i); result = hiraknj_kask(SJ3_CONTEXT_PASS p, &i);
break; break;
case OFFSETASSYUKU: case OFFSETASSYUKU:
@ -175,11 +175,11 @@ hiraknj(SJ3_CONTEXT u_char* p) {
break; break;
case AIATTRIBUTE: case AIATTRIBUTE:
result = hiraknj_atrb(p, &i); result = hiraknj_atrb(SJ3_CONTEXT_PASS p, &i);
break; break;
case LEADINGHANKAKU: case LEADINGHANKAKU:
result = hiraknj_norm(p, &i); result = hiraknj_norm(SJ3_CONTEXT_PASS p, &i);
break; break;
case KANJIASSYUKU: case KANJIASSYUKU:
@ -187,7 +187,7 @@ hiraknj(SJ3_CONTEXT u_char* p) {
break; break;
default: default:
result = hiraknj_hira(p, &i); result = hiraknj_hira(SJ3_CONTEXT_PASS p, &i);
} }
if(result) return result; if(result) return result;
@ -198,7 +198,7 @@ hiraknj(SJ3_CONTEXT u_char* p) {
return 0; return 0;
} }
int hiraknj_atrb(u_char* p, int* len) { int hiraknj_atrb(SJ3_CONTEXT u_char* p, int* len) {
*len = 2; *len = 2;
return 0; return 0;
} }
@ -213,22 +213,22 @@ int hiraknj_knj(SJ3_CONTEXT u_char* p, int* len) {
return hiraknj(SJ3_CONTEXT_PASS askknj[*p & KNJASSYUKUMASK]); return hiraknj(SJ3_CONTEXT_PASS askknj[*p & KNJASSYUKUMASK]);
} }
int hiraknj_hask(u_char* p, int* len) { int hiraknj_hask(SJ3_CONTEXT u_char* p, int* len) {
*len = 1; *len = 1;
return 2; return 2;
} }
int hiraknj_kask(u_char* p, int* len) { int hiraknj_kask(SJ3_CONTEXT u_char* p, int* len) {
*len = 1; *len = 1;
return 3; return 3;
} }
int hiraknj_norm(u_char* p, int* len) { int hiraknj_norm(SJ3_CONTEXT u_char* p, int* len) {
*len = codesize(*p); *len = codesize(*p);
return 1; return 1;
} }
int hiraknj_hira(u_char* p, int* len) { int hiraknj_hira(SJ3_CONTEXT u_char* p, int* len) {
u_char ch; u_char ch;
*len = codesize(*p); *len = codesize(*p);

View file

@ -90,7 +90,7 @@ srchdict(SJ3_CONTEXT u_char* tagp) {
segno = srchidx(SJ3_CONTEXT_PASS prevseg, (int)dicinl); segno = srchidx(SJ3_CONTEXT_PASS prevseg, (int)dicinl);
(*curdict->getdic)(curdict, segno); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, segno);
if(prevseg != segno) { if(prevseg != segno) {
@ -109,7 +109,7 @@ srchdict(SJ3_CONTEXT u_char* tagp) {
if(segno >= curdict->segunit) return NULL; if(segno >= curdict->segunit) return NULL;
(*curdict->getdic)(curdict, segno); (*curdict->getdic)(SJ3_CONTEXT_PASS curdict, segno);
tagp = dicbuf; tagp = dicbuf;
} }

View file

@ -1,27 +1,11 @@
#include <sj_kanakan.h> #include <sj_kanakan.h>
int main(int argc, char** argv) { int main(int argc, char** argv) {
DictFile* dict; char out[64 * 1024];
DICTL* node; int i = 0;
char out[64 * 1024]; char c[64 * 1024];
int i = 0; char b;
char c[64 * 1024]; Sj3Context* ctx = alloccontext("dic.bin");
char b;
Sj3Context ctx;
ctx.work = calloc(1, sizeof(Global));
node = calloc(1, sizeof(DICTL));
ctx.work->Jdictlist = node;
initwork(&ctx);
dict = opendict(&ctx, "dic.bin", "");
node->dict = &dict->dict;
node->next = NULL;
seldict(&ctx, dict->dict.dicid);
c[0] = 0; c[0] = 0;
@ -37,7 +21,7 @@ int main(int argc, char** argv) {
} }
i = 0; i = 0;
while((strlen(c) - i) > 0 && (i += cl2knj(&ctx, (u_char*)c + i, strlen(c) - i, (u_char*)out))) { while((strlen(c) - i) > 0 && (i += cl2knj(ctx, (u_char*)c + i, strlen(c) - i, (u_char*)out))) {
STDYOUT* s = (STDYOUT*)out; STDYOUT* s = (STDYOUT*)out;
printf("> %s\n", out + sizeof(STDYOUT)); printf("> %s\n", out + sizeof(STDYOUT));
@ -46,5 +30,7 @@ int main(int argc, char** argv) {
c[0] = 0; c[0] = 0;
} }
free_context(ctx);
return 0; return 0;
} }