Working sj4_nextkan

This commit is contained in:
Nishi 2026-06-22 00:17:07 +09:00
commit df18e66b18
3 changed files with 49 additions and 24 deletions

View file

@ -4,7 +4,7 @@
#include <wchar.h>
/* 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

View file

@ -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);
});
}
len2 = strlen(ctx->outbuf + sizeof(STDYOUT));
ICONV(kouho->buffer.raw, ctx->outbuf + sizeof(STDYOUT), len2, to);
int sj4_nextkan(Sj4Lib* ctx) {
int len, len2;
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) {

View file

@ -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;
}