From df18e66b18515d0b093edc6a74ab2144e260a497 Mon Sep 17 00:00:00 2001 From: Nishi Date: Mon, 22 Jun 2026 00:17:07 +0900 Subject: [PATCH] Working sj4_nextkan --- include/sj4lib/sj4lib.h | 3 +- lib/sj4lib/sj.c | 62 +++++++++++++++++++++++++++-------------- src/sj4test/main.c | 8 ++++-- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/include/sj4lib/sj4lib.h b/include/sj4lib/sj4lib.h index a33a3a8..70e1a59 100644 --- a/include/sj4lib/sj4lib.h +++ b/include/sj4lib/sj4lib.h @@ -4,7 +4,7 @@ #include /* increase this as needed... */ -#define SJ4BUFSZ (16 * 1024) +#define SJ4BUFSZ (4 * 1024) typedef union sj4kouhobuffer { char sjis[SJ4BUFSZ]; @@ -31,6 +31,7 @@ enum SJ4CHARSET { Sj4Lib* sj4_open(int, const char*); int sj4_getkan(Sj4Lib*, const void*, int len, Sj4Kouho*); +int sj4_nextkan(Sj4Lib*); void sj4_close(Sj4Lib*); #endif diff --git a/lib/sj4lib/sj.c b/lib/sj4lib/sj.c index 7eaeb82..48f2c6e 100644 --- a/lib/sj4lib/sj.c +++ b/lib/sj4lib/sj.c @@ -17,6 +17,9 @@ struct sj4lib { u_char inbuf[SJ4BUFSZ]; u_char outbuf[SJ4BUFSZ]; u_char wrkbuf[SJ4BUFSZ]; + u_char wrk2buf[SJ4BUFSZ]; + + Sj4Kouho* kouho; }; #ifdef UCS @@ -341,34 +344,51 @@ Sj4Lib* sj4_open(int charset, const char* dic) { } #endif +#define RUNME(PROC) \ + PROC \ +\ + len2 = strlen(ctx->outbuf + sizeof(STDYOUT)); \ + ICONV(ctx->kouho->buffer.raw, ctx->outbuf + sizeof(STDYOUT), len2, to); \ +\ + memcpy(ctx->wrkbuf, ctx->inbuf, len); \ + ICONV(ctx->wrk2buf, ctx->wrkbuf, len, to); \ + if(ctx->charset == SJ4UTF16) { \ + int i; \ + for(i = 0; i < sizeof(wchar_t); i++) ctx->wrk2buf[len * sizeof(wchar_t) + i] = 0; \ + } else { \ + ctx->wrk2buf[len] = 0; \ + } \ +\ + if(ctx->charset == SJ4UTF16) { \ + ctx->kouho->buffer.utf16[len2] = 0; \ + } else { \ + ctx->kouho->buffer.raw[len2] = 0; \ + } \ +\ + return ctx->charset == SJ4UTF16 ? wcslen((wchar_t*)ctx->wrk2buf) : strlen(ctx->wrk2buf); + +#define RUNME2(PROC) \ + ICONV(ctx->inbuf, input, len, from); \ +\ + RUNME(PROC) + int sj4_getkan(Sj4Lib* ctx, const void* input, int len, Sj4Kouho* kouho) { int len2; memset(kouho, 0, sizeof(*kouho)); + ctx->kouho = kouho; - ICONV(ctx->inbuf, input, len, from); + RUNME2({ + len = cl2knj(ctx->ctx, ctx->inbuf, len, ctx->outbuf); + }); +} - len = cl2knj(ctx->ctx, ctx->inbuf, len, ctx->outbuf); +int sj4_nextkan(Sj4Lib* ctx) { + int len, len2; - len2 = strlen(ctx->outbuf + sizeof(STDYOUT)); - ICONV(kouho->buffer.raw, ctx->outbuf + sizeof(STDYOUT), len2, to); - - memcpy(ctx->wrkbuf, ctx->inbuf, len); - ICONV(ctx->outbuf, ctx->wrkbuf, len, to); - if(ctx->charset == SJ4UTF16) { - int i; - for(i = 0; i < sizeof(wchar_t); i++) ctx->outbuf[len * sizeof(wchar_t) + i] = 0; - } else { - ctx->outbuf[len] = 0; - } - - if(ctx->charset == SJ4UTF16) { - kouho->buffer.utf16[len2] = 0; - } else { - kouho->buffer.raw[len2] = 0; - } - - return ctx->charset == SJ4UTF16 ? wcslen((wchar_t*)ctx->outbuf) : strlen(ctx->outbuf); + RUNME({ + len = nextcl(ctx->ctx, ctx->outbuf, 0); + }); } void sj4_close(Sj4Lib* ctx) { diff --git a/src/sj4test/main.c b/src/sj4test/main.c index 265ce07..d7154d9 100644 --- a/src/sj4test/main.c +++ b/src/sj4test/main.c @@ -33,8 +33,12 @@ int main(int argc, char** argv) { } i = 0; - while((strlen(c) - i) > 0 && (n = sj4_getkan(ctx, c + i, strlen(c + i), &kouho))) { - printf("> %s\n", kouho.buffer.sjis); + while((strlen(c) - i) > 0 && (n = sj4_getkan(ctx, c + i, strlen(c + i), &kouho)) != 0) { + printf(">"); + do { + printf(" %s", kouho.buffer.utf8); + } while(sj4_nextkan(ctx) != 0); + printf("\n"); i += n; }