diff --git a/include/sj3core/Struct.h b/include/sj3core/Struct.h index f789562..1e68d80 100644 --- a/include/sj3core/Struct.h +++ b/include/sj3core/Struct.h @@ -157,6 +157,11 @@ typedef struct workarea { typedef struct sj3context { Global* work; STDY* stdy; + + JREC* jrec_free; + JREC* jrec_pool; + CLREC* clrec_free; + CLREC* clrec_pool; } Sj3Context; #endif diff --git a/include/sj3core/sj_kanakan.h b/include/sj3core/sj_kanakan.h index f18c36e..b3beb81 100644 --- a/include/sj3core/sj_kanakan.h +++ b/include/sj3core/sj_kanakan.h @@ -64,10 +64,10 @@ TypeIdxOfs count_uidx(SJ3_CONTEXT2); void chg_uidx(SJ3_CONTEXT TypeDicSeg, u_char*, int); /* alloc.c */ -JREC* alloc_jrec(void); -void free_jrec(JREC*); -CLREC* alloc_clrec(void); -void free_clrec(CLREC*); +JREC* alloc_jrec(SJ3_CONTEXT2); +void free_jrec(SJ3_CONTEXT JREC*); +CLREC* alloc_clrec(SJ3_CONTEXT2); +void free_clrec(SJ3_CONTEXT CLREC*); /* charsize.c */ int codesize(u_char); @@ -163,10 +163,10 @@ int istrcmp(u_char*, u_char*, int, int); void sstrncpy(u_char*, u_char*, int); /* memory.c */ -JREC* free_jlst(JREC*); +JREC* free_jlst(SJ3_CONTEXT JREC*); CLREC* free_clst(SJ3_CONTEXT CLREC*, int); -void free_clall(CLREC*); -void free_jall(JREC*); +void free_clall(SJ3_CONTEXT CLREC*); +void free_jall(SJ3_CONTEXT JREC*); void freework(SJ3_CONTEXT2); /* mk2claus.c */ diff --git a/lib/sj3core/alloc.c b/lib/sj3core/alloc.c index 05b5648..5332949 100644 --- a/lib/sj3core/alloc.c +++ b/lib/sj3core/alloc.c @@ -46,10 +46,15 @@ #define JREC_NUM 128 #define CLREC_NUM 128 +#ifdef SJ3_GLOBAL static JREC* jrec = NULL; static CLREC* clrec = NULL; +#else +#define jrec ctx->jrec_free +#define clrec ctx->clrec_free +#endif -JREC* alloc_jrec() { +JREC* alloc_jrec(SJ3_CONTEXT2) { JREC* p; int i; @@ -59,6 +64,10 @@ JREC* alloc_jrec() { for(i = 0, p = jrec; i < JREC_NUM - 1; i++, p++) p->jsort = p + 1; p->jsort = NULL; + +#ifndef SJ3_GLOBAL + ctx->jrec_pool = jrec; +#endif } p = jrec; jrec = jrec->jsort; @@ -66,7 +75,7 @@ JREC* alloc_jrec() { return p; } -void free_jrec(JREC* p) { +void free_jrec(SJ3_CONTEXT JREC* p) { if(p != NULL) { p->jsort = jrec; jrec = p; @@ -74,7 +83,7 @@ void free_jrec(JREC* p) { } CLREC* -alloc_clrec() { +alloc_clrec(SJ3_CONTEXT2) { CLREC* p; int i; @@ -84,6 +93,10 @@ alloc_clrec() { for(i = 0, p = clrec; i < CLREC_NUM - 1; i++, p++) p->clsort = p + 1; p->clsort = NULL; + +#ifndef SJ3_GLOBAL + ctx->clrec_pool = clrec; +#endif } p = clrec; clrec = clrec->clsort; @@ -91,7 +104,7 @@ alloc_clrec() { return p; } -void free_clrec(CLREC* p) { +void free_clrec(SJ3_CONTEXT CLREC* p) { if(p != NULL) { p->clsort = clrec; clrec = p; diff --git a/lib/sj3core/cvtkanji.c b/lib/sj3core/cvtkanji.c index 38f0bd4..91824da 100644 --- a/lib/sj3core/cvtkanji.c +++ b/lib/sj3core/cvtkanji.c @@ -87,8 +87,8 @@ void cvtphknj(SJ3_CONTEXT2) { not_enough_memory: - free_clall(clt1st); - free_jall(jrt1st); + free_clall(SJ3_CONTEXT_PASS clt1st); + free_jall(SJ3_CONTEXT_PASS jrt1st); } void cvtkouho(SJ3_CONTEXT KHREC* krec) { diff --git a/lib/sj3core/init.c b/lib/sj3core/init.c index 1d63557..1de1a3f 100644 --- a/lib/sj3core/init.c +++ b/lib/sj3core/init.c @@ -118,6 +118,9 @@ void free_context(Sj3Context* ctx) { freework(ctx); + free(ctx->jrec_pool); + free(ctx->clrec_pool); + free(ctx->stdy); free(ctx->work); diff --git a/lib/sj3core/memory.c b/lib/sj3core/memory.c index 567c59d..fe4f1ef 100644 --- a/lib/sj3core/memory.c +++ b/lib/sj3core/memory.c @@ -37,7 +37,7 @@ #include "sj_kanakan.h" -JREC* free_jlst(JREC* p) { +JREC* free_jlst(SJ3_CONTEXT JREC* p) { JREC* jpk; JREC* jp; JREC* jn; @@ -57,7 +57,7 @@ JREC* free_jlst(JREC* p) { } else { - free_jrec(p); + free_jrec(SJ3_CONTEXT_PASS p); } } @@ -97,7 +97,7 @@ free_clst(SJ3_CONTEXT CLREC* p, int l) { else { (p->jnode->count)--; - free_clrec(p); + free_clrec(SJ3_CONTEXT_PASS p); } } @@ -106,31 +106,31 @@ free_clst(SJ3_CONTEXT CLREC* p, int l) { return cpk; } -void free_clall(CLREC* p) { +void free_clall(SJ3_CONTEXT CLREC* p) { CLREC* next; while(p) { (p->jnode->count)--; next = p->clsort; - free_clrec(p); + free_clrec(SJ3_CONTEXT_PASS p); p = next; } } -void free_jall(JREC* p) { +void free_jall(SJ3_CONTEXT JREC* p) { JREC* next; while(p) { next = p->jsort; - free_jrec(p); + free_jrec(SJ3_CONTEXT_PASS p); p = next; } } void freework(SJ3_CONTEXT2) { - free_clall(maxclptr); + free_clall(SJ3_CONTEXT_PASS maxclptr); clt1st = maxclptr = NULL; - free_jall(maxjptr); + free_jall(SJ3_CONTEXT_PASS maxjptr); jrt1st = maxjptr = NULL; } diff --git a/lib/sj3core/mk2claus.c b/lib/sj3core/mk2claus.c index 38b71dc..261c799 100644 --- a/lib/sj3core/mk2claus.c +++ b/lib/sj3core/mk2claus.c @@ -99,8 +99,8 @@ void mk2claus(SJ3_CONTEXT2) { if(len != clrec->cllen) { if(clt2nd != maxclptr) { - free_clall(maxclptr); - free_jall(maxjptr); + free_clall(SJ3_CONTEXT_PASS maxclptr); + free_jall(SJ3_CONTEXT_PASS maxjptr); } save2ln = set2nd(SJ3_CONTEXT_PASS clrec); @@ -138,16 +138,16 @@ void mk2claus(SJ3_CONTEXT2) { if(clt2nd == maxclptr) continue; - free_clall(clt2nd); - free_jall(jrt2nd); + free_clall(SJ3_CONTEXT_PASS clt2nd); + free_jall(SJ3_CONTEXT_PASS jrt2nd); jrt2nd = maxjptr; clt2nd = maxclptr; } if(clt2nd != maxclptr) { - free_clall(maxclptr); + free_clall(SJ3_CONTEXT_PASS maxclptr); maxclptr = NULL; - free_jall(maxjptr); + free_jall(SJ3_CONTEXT_PASS maxjptr); maxjptr = NULL; } diff --git a/lib/sj3core/mkbunset.c b/lib/sj3core/mkbunset.c index c919145..837a5d2 100644 --- a/lib/sj3core/mkbunset.c +++ b/lib/sj3core/mkbunset.c @@ -100,7 +100,7 @@ argclrec(SJ3_CONTEXT int len) { CLREC* rec; CLREC* child; - rec = alloc_clrec(); + rec = alloc_clrec(SJ3_CONTEXT_PASS2); if(!rec) { if(!maxclptr) diff --git a/lib/sj3core/mkjiritu.c b/lib/sj3core/mkjiritu.c index aa02322..6c191f7 100644 --- a/lib/sj3core/mkjiritu.c +++ b/lib/sj3core/mkjiritu.c @@ -104,7 +104,7 @@ JREC* argjrec(SJ3_CONTEXT int len, JREC* rec) { JREC* jrec; JREC* child; - jrec = alloc_jrec(); + jrec = alloc_jrec(SJ3_CONTEXT_PASS2); if(!jrec) { if(!maxjptr) return NULL; diff --git a/lib/sj3core/ph2knj.c b/lib/sj3core/ph2knj.c index 3f220bd..ec7a95a 100644 --- a/lib/sj3core/ph2knj.c +++ b/lib/sj3core/ph2knj.c @@ -86,7 +86,7 @@ int ph2knj(SJ3_CONTEXT u_char* zyomi, u_char* kanji, int knjlen) { prevclrow = selcl->right; clt1st = free_clst(SJ3_CONTEXT_PASS clt1st, (int)selcl->cllen); - jrt1st = free_jlst(jrt1st); + jrt1st = free_jlst(SJ3_CONTEXT_PASS jrt1st); cnvstart += selcl->cllen; cnvlen -= selcl->cllen; @@ -98,8 +98,8 @@ int ph2knj(SJ3_CONTEXT u_char* zyomi, u_char* kanji, int knjlen) { } if(!kanjilen) { - free_clall(clt1st); - free_jall(jrt1st); + free_clall(SJ3_CONTEXT_PASS clt1st); + free_jall(SJ3_CONTEXT_PASS jrt1st); } *kanjipos = 0; diff --git a/lib/sj3core/selclrec.c b/lib/sj3core/selclrec.c index 9c773a3..2799a24 100644 --- a/lib/sj3core/selclrec.c +++ b/lib/sj3core/selclrec.c @@ -77,8 +77,8 @@ void selclrec(SJ3_CONTEXT2) { int klen; u_char ch; - free_clall(clt1st); - free_jall(jrt1st); + free_clall(SJ3_CONTEXT_PASS clt1st); + free_jall(SJ3_CONTEXT_PASS jrt1st); klen = cnvlen; cnvlen = len; @@ -97,8 +97,8 @@ void selclrec(SJ3_CONTEXT2) { *(cnvstart + len) = ch; } - free_clall(clt2nd); + free_clall(SJ3_CONTEXT_PASS clt2nd); clt2nd = NULL; - free_jall(jrt2nd); + free_jall(SJ3_CONTEXT_PASS jrt2nd); jrt2nd = NULL; } diff --git a/lib/sj3core/wakachi.c b/lib/sj3core/wakachi.c index 14d9c11..40d6507 100644 --- a/lib/sj3core/wakachi.c +++ b/lib/sj3core/wakachi.c @@ -50,7 +50,7 @@ void wakachi(SJ3_CONTEXT2) { int i; int maxlen; - free_jall(maxjptr); + free_jall(SJ3_CONTEXT_PASS maxjptr); maxjptr = NULL; maxlen = (cnvlen > MAXCLINPUTLEN) ? MAXCLINPUTLEN : cnvlen;