sj4/lib/sj4rkcv/rk_conv.c

1121 lines
23 KiB
C
Raw Normal View History

2008-01-11 11:57:08 +00:00
/*
* Copyright (c) 1994 Sony Corporation
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL SONY CORPORATION BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* Except as contained in this notice, the name of Sony Corporation
* shall not be used in advertising or otherwise to promote the sale, use
* or other dealings in this Software without prior written authorization
* from Sony Corporation.
*
*/
#ifndef lint
2026-06-20 02:12:04 +09:00
static char rcsid[] = "$Header: /export/work/contrib/sj4/sj4rkcv/RCS/rk_conv.c,v 1.14 1994/06/03 07:42:16 notanaka Exp $";
2008-01-11 11:57:08 +00:00
#endif
#include "wchar16.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <string.h>
#ifdef __sony_news
#include <jctype.h>
#endif
#include "kctype.h"
#include "rk.h"
2026-06-20 02:12:04 +09:00
#include "sj4rkcv.h"
2008-01-11 11:57:08 +00:00
#if defined(__sony_news) && defined(SVR4)
2026-06-20 02:12:04 +09:00
#define wscmp sj4_wscmp16
#define wsncmp sj4_wsncmp16
#define wsncpy sj4_wsncpy16
#define wscpy sj4_wscpy16
#define wslen sj4_wslen16
#define mbstowcs sj4_mbstowcs16
#define wcstombs sj4_wcstombs16
2008-01-11 11:57:08 +00:00
#endif
2026-06-19 01:49:53 +09:00
#define ENDMARK(c) (c == SPACE || c == TAB)
#define SKLINE(c) (c == EOL || c == NSTR)
#define TOUPPER(c) (islower(c) ? toupper(c) : (c))
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
#define WTOUPPER(c) ((wchar16_t)(islower(((c) & 0xff)) ? toupper(((c) & 0xff)) : ((c) & 0xff)))
2008-01-11 11:57:08 +00:00
2026-06-20 02:12:04 +09:00
#define SJ4_NO -1
#define SJ4_SJIS 0
#define SJ4_EUC 1
2008-01-11 11:57:08 +00:00
2026-06-20 02:12:04 +09:00
RkTabl* sj4_rcode[MAXCODE];
RkTablW16* sj4_rcode_w16[MAXCODE];
2026-06-19 01:49:53 +09:00
RkTablW16* rktblp;
wchar16_t rline[MAXLLEN];
wchar16_t lstr[MAXLLEN];
2008-01-11 11:57:08 +00:00
static wchar16_t intmp[MAXLLEN];
static wchar16_t outtmp[MAXLLEN];
2026-06-19 01:49:53 +09:00
static u_char mtmp[MAXLLEN];
static int rk_erase;
static int rk_errin = 0;
static int rk_cflag;
static int rk_klen;
2026-06-20 02:12:04 +09:00
static int file_code = SJ4_NO;
2026-06-19 01:49:53 +09:00
static RkbufRec rkpbuf, *rkpp = NULL;
static RkTablW16* rkhp;
static StrbufRec strpbuf, *strpp;
static wchar16_t* shp;
static YmibufRec ymipbuf, *ymipp;
static u_short* yhp;
2026-06-20 02:12:04 +09:00
void sj4_rkcode(int code) {
2026-06-19 01:49:53 +09:00
if(code)
2026-06-20 02:12:04 +09:00
file_code = SJ4_NO;
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
int sj4_rkinit2(char* rkfile, int erase) {
2008-01-11 11:57:08 +00:00
rk_erase = erase;
2026-06-20 02:12:04 +09:00
return (sj4_rkinit_mb(rkfile));
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int rcode_sjis_init() {
int i, rkeylen = 0, ryomilen = 0, rstrlen = 0;
int klen, ylen, slen, tablnum = 0, tablsize;
u_char * mbstr, *mptr, mtmp[BUFSIZ], mtmp2[BUFSIZ];
u_short * wcstr, *wcptr;
RkTabl * tabl, *tabl_next, *tabl_prev;
RkTablW16* tabl_w16;
2008-01-11 11:57:08 +00:00
tablsize = sizeof(RkTabl);
2026-06-19 01:49:53 +09:00
for(i = 0; i < MAXCODE; i++) {
2026-06-20 02:12:04 +09:00
if(sj4_rcode_w16[i]) {
tabl_w16 = sj4_rcode_w16[i];
2026-06-19 01:49:53 +09:00
while(tabl_w16) {
2008-01-11 11:57:08 +00:00
tablnum++;
2026-06-19 01:49:53 +09:00
if(tabl_w16->r_key)
rkeylen += wslen(tabl_w16->r_key) + 1;
if(tabl_w16->r_str)
rstrlen += wslen(tabl_w16->r_str) + 1;
if(tabl_w16->k_yomi)
ryomilen += wslen(tabl_w16->k_yomi) + 1;
2008-01-11 11:57:08 +00:00
tabl_w16 = tabl_w16->next;
}
}
}
2026-06-19 01:49:53 +09:00
if(!tablnum)
return 1;
tabl = (RkTabl*)malloc(tablnum * tablsize);
if(!tabl) {
2008-01-11 11:57:08 +00:00
return 0;
}
memset(tabl, '\0', tablnum * tablsize);
2026-06-19 01:49:53 +09:00
mbstr = (u_char*)malloc(rkeylen + rstrlen);
if(!mbstr) {
2008-01-11 11:57:08 +00:00
free(tabl);
return 0;
}
memset(mbstr, '\0', rkeylen + rstrlen);
2026-06-19 01:49:53 +09:00
wcptr = wcstr = (u_short*)malloc(ryomilen * sizeof(u_short));
if(!wcstr) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
return 0;
}
2026-06-19 01:49:53 +09:00
memset(wcptr, '\0', ryomilen * sizeof(u_short));
2008-01-11 11:57:08 +00:00
rkeylen *= 2;
rstrlen *= 2;
2026-06-19 01:49:53 +09:00
for(i = 0; i < MAXCODE; i++) {
2026-06-20 02:12:04 +09:00
if(sj4_rcode_w16[i]) {
tabl_w16 = sj4_rcode_w16[i];
tabl_next = sj4_rcode[i] = tabl;
2026-06-19 01:49:53 +09:00
while(tabl_w16) {
2008-01-11 11:57:08 +00:00
tabl += 1;
2026-06-19 01:49:53 +09:00
if(tabl_w16->r_key) {
if(current_locale == LC_CTYPE_EUC) {
2008-01-11 11:57:08 +00:00
mptr = mtmp;
} else {
mptr = mbstr;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mptr, tabl_w16->r_key, BUFSIZ) == -1) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
if((klen = euctosjis(mbstr, rkeylen, mtmp, sizeof(mtmp))) < 0) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
} else {
2026-06-19 01:49:53 +09:00
klen = strlen((char*)mbstr);
2008-01-11 11:57:08 +00:00
}
tabl_next->r_key = mbstr;
mbstr += klen + 1;
rkeylen -= klen + 1;
} else {
tabl_next->r_key = NULL;
}
2026-06-19 01:49:53 +09:00
if(tabl_w16->r_str) {
if(current_locale == LC_CTYPE_EUC) {
2008-01-11 11:57:08 +00:00
mptr = mtmp;
} else {
mptr = mbstr;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mptr, tabl_w16->r_str, BUFSIZ) == -1) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
if((slen = euctosjis(mbstr, rstrlen, mtmp, sizeof(mtmp))) < 0) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
} else {
2026-06-19 01:49:53 +09:00
slen = strlen((char*)mbstr);
2008-01-11 11:57:08 +00:00
}
tabl_next->r_str = mbstr;
mbstr += slen + 1;
rstrlen -= slen + 1;
} else {
tabl_next->r_str = NULL;
}
2026-06-19 01:49:53 +09:00
if(tabl_w16->k_yomi) {
2008-01-11 11:57:08 +00:00
mptr = mtmp;
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mptr, tabl_w16->k_yomi, BUFSIZ) == -1) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
if(euctosjis(mtmp2, sizeof(mtmp2), mtmp, sizeof(mtmp)) < 0) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
mptr = mtmp2;
} else {
mptr = mtmp;
}
tabl_next->k_yomi = wcptr;
2026-06-19 01:49:53 +09:00
ylen = 0;
while(*mptr) {
if(issjis1(*mptr) && issjis2(mptr[1])) {
2008-01-11 11:57:08 +00:00
*wcptr = (*mptr << 8) + mptr[1];
mptr++;
} else {
*wcptr = *mptr;
}
wcptr++;
mptr++;
ylen++;
}
*wcptr++ = 0;
ryomilen -= ylen + 1;
} else {
tabl_next->k_yomi = NULL;
}
2026-06-19 01:49:53 +09:00
tabl_w16 = tabl_w16->next;
2008-01-11 11:57:08 +00:00
tabl_next->next = tabl;
2026-06-19 01:49:53 +09:00
tabl_prev = tabl_next;
tabl_next = tabl;
2008-01-11 11:57:08 +00:00
}
tabl_prev->next = NULL;
}
}
return 1;
}
2026-06-19 01:49:53 +09:00
int rcode_euc_init() {
int i, rkeylen = 0, ryomilen = 0, rstrlen = 0;
int klen, ylen, slen, tablnum = 0, tablsize;
u_char * mbstr, *mptr, mtmp[BUFSIZ], mtmp2[BUFSIZ];
u_short * wcstr, *wcptr;
RkTabl * tabl, *tabl_next, *tabl_prev;
RkTablW16* tabl_w16;
2008-01-11 11:57:08 +00:00
tablsize = sizeof(RkTabl);
2026-06-19 01:49:53 +09:00
for(i = 0; i < MAXCODE; i++) {
2026-06-20 02:12:04 +09:00
if(sj4_rcode_w16[i]) {
tabl_w16 = sj4_rcode_w16[i];
2026-06-19 01:49:53 +09:00
while(tabl_w16) {
2008-01-11 11:57:08 +00:00
tablnum++;
2026-06-19 01:49:53 +09:00
if(tabl_w16->r_key)
rkeylen += wslen(tabl_w16->r_key) + 1;
if(tabl_w16->r_str)
rstrlen += wslen(tabl_w16->r_str) + 1;
if(tabl_w16->k_yomi)
ryomilen += wslen(tabl_w16->k_yomi) + 1;
2008-01-11 11:57:08 +00:00
tabl_w16 = tabl_w16->next;
}
}
}
2026-06-19 01:49:53 +09:00
if(!tablnum)
return 1;
tabl = (RkTabl*)malloc(tablnum * tablsize);
if(!tabl) {
2008-01-11 11:57:08 +00:00
return 0;
}
memset(tabl, '\0', tablnum * tablsize);
2026-06-19 01:49:53 +09:00
mbstr = (u_char*)malloc(rkeylen + rstrlen);
if(!mbstr) {
2008-01-11 11:57:08 +00:00
free(tabl);
return 0;
}
memset(mbstr, '\0', rkeylen + rstrlen);
2026-06-19 01:49:53 +09:00
wcptr = wcstr = (u_short*)malloc(ryomilen * sizeof(u_short));
if(!wcstr) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
return 0;
}
2026-06-19 01:49:53 +09:00
memset(wcptr, '\0', ryomilen * sizeof(u_short));
2008-01-11 11:57:08 +00:00
rkeylen *= 2;
rstrlen *= 2;
2026-06-19 01:49:53 +09:00
for(i = 0; i < MAXCODE; i++) {
2026-06-20 02:12:04 +09:00
if(sj4_rcode_w16[i]) {
tabl_w16 = sj4_rcode_w16[i];
tabl_next = sj4_rcode[i] = tabl;
2026-06-19 01:49:53 +09:00
while(tabl_w16) {
tabl += 1;
if(tabl_w16->r_key) {
if(current_locale == LC_CTYPE_SHIFTJIS) {
2008-01-11 11:57:08 +00:00
mptr = mtmp;
} else {
mptr = mbstr;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mptr, tabl_w16->r_key, BUFSIZ) == -1) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_SHIFTJIS) {
if((klen = euctosjis(mbstr, rkeylen, mtmp, sizeof(mtmp))) < 0) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
} else {
2026-06-19 01:49:53 +09:00
klen = strlen((char*)mbstr);
2008-01-11 11:57:08 +00:00
}
tabl_next->r_key = mbstr;
mbstr += klen + 1;
rkeylen -= klen + 1;
} else {
tabl_next->r_key = NULL;
}
2026-06-19 01:49:53 +09:00
if(tabl_w16->r_str) {
if(current_locale == LC_CTYPE_SHIFTJIS) {
2008-01-11 11:57:08 +00:00
mptr = mtmp;
} else {
mptr = mbstr;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mptr, tabl_w16->r_str, BUFSIZ) == -1) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_SHIFTJIS) {
if((slen = sjistoeuc(mbstr, rstrlen, mtmp, sizeof(mtmp))) < 0) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
} else {
2026-06-19 01:49:53 +09:00
slen = strlen((char*)mbstr);
2008-01-11 11:57:08 +00:00
}
tabl_next->r_str = mbstr;
mbstr += slen + 1;
rstrlen -= slen + 1;
} else {
tabl_next->r_str = NULL;
}
2026-06-19 01:49:53 +09:00
if(tabl_w16->k_yomi) {
2008-01-11 11:57:08 +00:00
mptr = mtmp;
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mptr, tabl_w16->k_yomi, BUFSIZ) == -1) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_SHIFTJIS) {
if(sjistoeuc(mtmp2, sizeof(mtmp2), mtmp, sizeof(mtmp)) < 0) {
2008-01-11 11:57:08 +00:00
free(tabl);
free(mbstr);
free(wcstr);
return 0;
}
mptr = mtmp2;
} else {
mptr = mtmp;
}
tabl_next->k_yomi = wcptr;
2026-06-19 01:49:53 +09:00
ylen = 0;
while(*mptr) {
if(iseuc(*mptr) && iseuc(mptr[1])) {
2008-01-11 11:57:08 +00:00
*wcptr = (*mptr << 8) + mptr[1];
mptr++;
} else {
*wcptr = *mptr;
}
wcptr++;
mptr++;
ylen++;
}
*wcptr++ = 0;
ryomilen -= ylen + 1;
} else {
tabl_next->k_yomi = NULL;
}
2026-06-19 01:49:53 +09:00
tabl_w16 = tabl_w16->next;
2008-01-11 11:57:08 +00:00
tabl_next->next = tabl;
2026-06-19 01:49:53 +09:00
tabl_prev = tabl_next;
tabl_next = tabl;
2008-01-11 11:57:08 +00:00
}
tabl_prev->next = NULL;
}
}
return 1;
}
2026-06-20 02:12:04 +09:00
int sj4_rkinit(char* rkfile) {
return sj4_rkinit_sub(rkfile, rcode_sjis_init);
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
int sj4_rkinit_euc(char* rkfile) {
return sj4_rkinit_sub(rkfile, rcode_euc_init);
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
int sj4_rkinit_mb(char* rkfile) {
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC)
2026-06-20 02:12:04 +09:00
return sj4_rkinit_sub(rkfile, rcode_euc_init);
2008-01-11 11:57:08 +00:00
else
2026-06-20 02:12:04 +09:00
return sj4_rkinit_sub(rkfile, rcode_sjis_init);
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
int sj4_rkinit_sub(char* rkfile, int (*mbfunc)()) {
2026-06-19 01:49:53 +09:00
char* p;
int len, klen, rlen, retv;
FILE* fp;
char line[MAXLEN + 1];
wchar16_t rkey[MAXWLEN + 1], rstr[MAXWLEN + 1];
u_short kstr[MAXWLEN + 1];
RkTablW16* rktp;
if(rkfile == NULL || *rkfile == NSTR)
2008-01-11 11:57:08 +00:00
fp = stdin;
2026-06-19 01:49:53 +09:00
else if((fp = fopen(rkfile, "r")) == NULL)
return (1);
2008-01-11 11:57:08 +00:00
cltable();
line[MAXLEN - 1] = EOL;
2026-06-19 01:49:53 +09:00
retv = 0;
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
while((p = fgets(line, MAXLEN + 1, fp)) != NULL) {
if(line[MAXLEN - 1] != EOL) {
2008-01-11 11:57:08 +00:00
line[MAXLEN - 1] = EOL;
continue;
}
2026-06-19 01:49:53 +09:00
if(SKLINE(*p) || *p == '#')
2008-01-11 11:57:08 +00:00
continue;
2026-06-19 01:49:53 +09:00
if((p = getkey(p, rkey, &len)) == NULL)
2008-01-11 11:57:08 +00:00
continue;
2026-06-19 01:49:53 +09:00
if((p = rkgetyomi(p, kstr, &klen)) == NULL)
2008-01-11 11:57:08 +00:00
continue;
p = getkey(p, rstr, &rlen);
2026-06-19 01:49:53 +09:00
if(rlen > 0 && chk_rstr(rstr, rkey, rlen, len))
2008-01-11 11:57:08 +00:00
rlen = 0;
2026-06-19 01:49:53 +09:00
if((rktp = mktable(rkey, len)) == NULL) {
2008-01-11 11:57:08 +00:00
fprintf(stderr, "Can't allocate memory for table\n");
retv = FAIL;
break;
}
2026-06-19 01:49:53 +09:00
if(rktp->k_yomi != NULL)
2008-01-11 11:57:08 +00:00
continue;
2026-06-19 01:49:53 +09:00
if(stradd(&(rktp->r_key), &rkey[1], len) == -1) {
2008-01-11 11:57:08 +00:00
fprintf(stderr, "Can't allocate memory for char\n");
retv = FAIL;
break;
}
2026-06-19 01:49:53 +09:00
if(kstradd(&(rktp->k_yomi), kstr, klen + 1) == -1) {
2008-01-11 11:57:08 +00:00
fprintf(stderr, "Can't allocate memory for short\n");
retv = FAIL;
break;
}
2026-06-19 01:49:53 +09:00
if(stradd(&(rktp->r_str), rstr, rlen + 1) == -1) {
2008-01-11 11:57:08 +00:00
fprintf(stderr, "Can't allocate memory for char\n");
retv = FAIL;
break;
}
}
fclose(fp);
2026-06-19 01:49:53 +09:00
if(!(*mbfunc)())
retv = FAIL;
2026-06-20 02:12:04 +09:00
sj4_rkclear();
2026-06-19 01:49:53 +09:00
return (retv);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
char* getkey(char* istr, wchar16_t* ostr, int* len) {
2008-01-11 11:57:08 +00:00
char c, *p;
2026-06-19 01:49:53 +09:00
int i;
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
while(ENDMARK(*istr))
2008-01-11 11:57:08 +00:00
istr++;
p = istr;
i = 0;
2026-06-19 01:49:53 +09:00
while(!ENDMARK(*p)) {
if(SKLINE(*p))
2008-01-11 11:57:08 +00:00
break;
c = *p++;
2026-06-19 01:49:53 +09:00
if(c == BSL) {
if(SKLINE(*p))
2008-01-11 11:57:08 +00:00
break;
c = *p++;
2026-06-19 01:49:53 +09:00
switch(c) {
case 'n':
*ostr++ = (wchar16_t)EOL;
2008-01-11 11:57:08 +00:00
break;
2026-06-19 01:49:53 +09:00
case 't':
*ostr++ = (wchar16_t)TAB;
2008-01-11 11:57:08 +00:00
break;
2026-06-19 01:49:53 +09:00
default:
*ostr++ = (wchar16_t)TOUPPER(c);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
} else if(c == '^') {
if(*p >= '@' && *p <= '_') {
*ostr++ = (wchar16_t)(*p - '@');
2008-01-11 11:57:08 +00:00
p++;
2026-06-19 01:49:53 +09:00
} else if(*p == '?') {
*ostr++ = (wchar16_t)0x7f;
2008-01-11 11:57:08 +00:00
p++;
} else
2026-06-19 01:49:53 +09:00
*ostr++ = (wchar16_t)'^';
2008-01-11 11:57:08 +00:00
} else
2026-06-19 01:49:53 +09:00
*ostr++ = (wchar16_t)TOUPPER(c);
if(++i > MAXWLEN) {
2008-01-11 11:57:08 +00:00
i = 0;
break;
}
}
2026-06-19 01:49:53 +09:00
*ostr = (wchar16_t)NSTR;
*len = i;
if(i > 0)
return (p);
return (NULL);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
char* rkgetyomi(char* istr, wchar16_t* ostr, int* len) {
u_char c;
u_char* p;
int i;
2008-01-11 11:57:08 +00:00
u_short cc;
2026-06-19 01:49:53 +09:00
while(ENDMARK(*istr))
2008-01-11 11:57:08 +00:00
istr++;
2026-06-19 01:49:53 +09:00
p = (u_char*)istr;
2008-01-11 11:57:08 +00:00
i = 0;
2026-06-19 01:49:53 +09:00
while(!ENDMARK(*p)) {
if(SKLINE(*p))
2008-01-11 11:57:08 +00:00
break;
cc = c = *p++;
2026-06-20 02:12:04 +09:00
if(file_code == SJ4_SJIS) {
2026-06-19 01:49:53 +09:00
if(issjis1(c) && issjis2(*p)) {
2008-01-11 11:57:08 +00:00
cc = (c << 8) + (*p & MASK);
p++;
cc = sjis2euc(cc);
}
2026-06-20 02:12:04 +09:00
} else if(file_code == SJ4_EUC) {
2026-06-19 01:49:53 +09:00
if(iseuc(c) && iseuc(*p)) {
2008-01-11 11:57:08 +00:00
cc = (c << 8) + (*p & MASK);
p++;
2026-06-19 01:49:53 +09:00
} else if(iseuckana(c) && iskana2(*p)) {
2008-01-11 11:57:08 +00:00
cc = *p++;
2026-06-19 01:49:53 +09:00
} else if(IsEUCHojo(c) && iseuc(*p) && iseuc(p[1])) {
2008-01-11 11:57:08 +00:00
cc = WcSetX0212(*p, p[1]);
p += 2;
}
} else {
2026-06-19 01:49:53 +09:00
if(issjis1(c) && issjis2(*p)) {
2026-06-20 02:12:04 +09:00
file_code = SJ4_SJIS;
2008-01-11 11:57:08 +00:00
p--;
continue;
}
2026-06-19 01:49:53 +09:00
if((iseuc(c) && iseuc(*p)) || (iseuckana(c) && iskana2(*p)) || (IsEUCHojo(c) && iseuc(*p) && iseuc(p[1]))) {
2026-06-20 02:12:04 +09:00
file_code = SJ4_EUC;
2008-01-11 11:57:08 +00:00
p--;
continue;
}
}
2026-06-19 01:49:53 +09:00
*ostr++ = (wchar16_t)cc;
if(++i > MAXWLEN) {
2008-01-11 11:57:08 +00:00
i = 0;
break;
}
}
2026-06-19 01:49:53 +09:00
*ostr = (wchar16_t)0;
*len = i;
if(i > 0)
return ((char*)p);
return (NULL);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
void cltable() {
2008-01-11 11:57:08 +00:00
int i;
2026-06-19 01:49:53 +09:00
if(rkpp != NULL) {
for(i = 0; i < MAXCODE; i++) {
2026-06-20 02:12:04 +09:00
sj4_rcode_w16[i] = NULL;
sj4_rcode[i] = NULL;
2026-06-19 01:49:53 +09:00
}
rkpp = &rkpbuf;
rkhp = rkpp->rkbuf;
strpp = &strpbuf;
shp = strpp->strbuf;
ymipp = &ymipbuf;
yhp = ymipp->ymibuf;
2008-01-11 11:57:08 +00:00
}
}
2026-06-19 01:49:53 +09:00
int chk_rstr(wchar16_t* rstr, wchar16_t* rkey, int rlen, int klen) {
int i;
wchar16_t* p;
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
if(rlen >= klen)
return (1);
2008-01-11 11:57:08 +00:00
p = rkey;
2026-06-19 01:49:53 +09:00
while(rlen <= klen) {
if(wsncmp(rstr, p, rlen) == 0)
return (0);
2008-01-11 11:57:08 +00:00
klen--;
p++;
}
2026-06-19 01:49:53 +09:00
return (1);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
RkTablW16*
rkalloc() {
RkTablW16* rkp;
RkbufRec* rkbrp;
if(rkpp == NULL) {
rkp = (RkTablW16*)malloc(RKSIZE * sizeof(RkTablW16));
if(rkp == NULL)
return (NULL);
rkhp = rkp;
rkpp = &rkpbuf;
2008-01-11 11:57:08 +00:00
rkpp->rkbuf = rkp;
rkpp->rkend = rkp + RKSIZE;
2026-06-19 01:49:53 +09:00
} else if(rkhp >= rkpp->rkend) {
rkp = (RkTablW16*)malloc(RKINCZ * sizeof(RkTablW16));
rkbrp = (RkbufRec*)malloc(sizeof(RkbufRec));
if(rkp == NULL || rkbrp == NULL)
return (NULL);
rkhp = rkp;
2008-01-11 11:57:08 +00:00
rkpp->rkbufp = rkbrp;
2026-06-19 01:49:53 +09:00
rkpp = rkbrp;
rkpp->rkbuf = rkp;
rkpp->rkend = rkp + RKINCZ;
2008-01-11 11:57:08 +00:00
}
rkp = rkhp++;
2026-06-19 01:49:53 +09:00
rkp->r_key = NULL;
2008-01-11 11:57:08 +00:00
rkp->k_yomi = NULL;
2026-06-19 01:49:53 +09:00
rkp->r_str = NULL;
rkp->next = NULL;
return (rkp);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int stradd(wchar16_t** cp, wchar16_t* str, int len) {
wchar16_t* strp;
StrbufRec* sbrp;
if(len <= 1)
return (0);
if(strpp == NULL) {
strp = (wchar16_t*)malloc(STRSIZE * sizeof(wchar16_t));
if(strp == NULL)
return (-1);
shp = strp;
strpp = &strpbuf;
2008-01-11 11:57:08 +00:00
strpp->strbuf = strp;
strpp->strend = strp + STRSIZE;
2026-06-19 01:49:53 +09:00
} else if(shp + len >= strpp->strend) {
strp = (wchar16_t*)malloc(STRINCZ * sizeof(wchar16_t));
sbrp = (StrbufRec*)malloc(sizeof(StrbufRec));
if(strp == NULL || sbrp == NULL)
return (-1);
shp = strp;
2008-01-11 11:57:08 +00:00
strpp->strbufp = sbrp;
2026-06-19 01:49:53 +09:00
strpp = sbrp;
strpp->strbuf = strp;
strpp->strend = strp + STRINCZ;
2008-01-11 11:57:08 +00:00
}
*cp = shp;
wscpy(shp, str);
shp += len;
2026-06-19 01:49:53 +09:00
return (0);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int kstradd(wchar16_t** cp, wchar16_t* kstr, int len) {
int i;
wchar16_t* usp;
YmibufRec* ybrp;
if(len <= 1)
return (0);
if(ymipp == NULL) {
usp = (wchar16_t*)malloc(YMISIZE * sizeof(wchar16_t));
if(usp == NULL)
return (-1);
yhp = usp;
ymipp = &ymipbuf;
2008-01-11 11:57:08 +00:00
ymipp->ymibuf = usp;
ymipp->ymiend = usp + YMISIZE;
2026-06-19 01:49:53 +09:00
} else if(yhp + len >= ymipp->ymiend) {
usp = (wchar16_t*)malloc(YMIINCZ * sizeof(wchar16_t));
ybrp = (YmibufRec*)malloc(sizeof(YmibufRec));
if(usp == NULL || ybrp == NULL)
return (-1);
yhp = usp;
2008-01-11 11:57:08 +00:00
ymipp->ymibufp = ybrp;
2026-06-19 01:49:53 +09:00
ymipp = ybrp;
ymipp->ymibuf = usp;
ymipp->ymiend = usp + YMIINCZ;
2008-01-11 11:57:08 +00:00
}
*cp = yhp;
2026-06-19 01:49:53 +09:00
for(i = 0; i < len; i++)
2008-01-11 11:57:08 +00:00
*yhp++ = *kstr++;
2026-06-19 01:49:53 +09:00
return (0);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
RkTablW16*
mktable(wchar16_t* key, int len) {
int i;
2008-01-11 11:57:08 +00:00
RkTablW16 *nrktp, *orktp;
2026-06-19 01:49:53 +09:00
RkTablW16* rktp;
u_int code;
2008-01-11 11:57:08 +00:00
nrktp = NULL;
orktp = NULL;
2026-06-19 01:49:53 +09:00
code = *key++ & MASK;
2026-06-20 02:12:04 +09:00
rktp = sj4_rcode_w16[code];
2026-06-19 01:49:53 +09:00
while(rktp != NULL) {
if(rktp->r_key == NULL) {
if(*key == NSTR)
return (rktp);
2008-01-11 11:57:08 +00:00
nrktp = rktp;
break;
}
2026-06-19 01:49:53 +09:00
if((i = wscmp(key, rktp->r_key)) == 0)
return (rktp);
if(i > 0 && (wslen(rktp->r_key) < len)) {
2008-01-11 11:57:08 +00:00
nrktp = rktp;
break;
}
orktp = rktp;
2026-06-19 01:49:53 +09:00
rktp = orktp->next;
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if((rktp = rkalloc()) == NULL)
return (NULL);
2026-06-20 02:12:04 +09:00
if(sj4_rcode_w16[code] == NULL)
sj4_rcode_w16[code] = rktp;
2008-01-11 11:57:08 +00:00
else {
2026-06-19 01:49:53 +09:00
if(nrktp != NULL) {
2008-01-11 11:57:08 +00:00
rktp->next = nrktp;
2026-06-19 01:49:53 +09:00
if(orktp == NULL)
2026-06-20 02:12:04 +09:00
sj4_rcode_w16[code] = rktp;
2008-01-11 11:57:08 +00:00
else
orktp->next = rktp;
} else
orktp->next = rktp;
}
2026-06-19 01:49:53 +09:00
return (rktp);
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
void sj4_rkebell(int err) {
2008-01-11 11:57:08 +00:00
rk_errin = err;
}
2026-06-20 02:12:04 +09:00
void sj4_rkclear() {
2008-01-11 11:57:08 +00:00
rline[0] = NSTR;
2026-06-19 01:49:53 +09:00
lstr[0] = NSTR;
rktblp = NULL;
rk_klen = 0;
2026-06-20 02:12:04 +09:00
sj4_rkreset();
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
void sj4_rkreset() {
2008-01-11 11:57:08 +00:00
rk_cflag = -1;
}
2026-06-20 02:12:04 +09:00
void sj4_rkconvc(wchar16_t c, u_int* rkstr) {
2026-06-19 01:49:53 +09:00
int i;
2008-01-11 11:57:08 +00:00
wchar16_t *p, *q;
2026-06-19 01:49:53 +09:00
int len;
wchar16_t wstr[MAXLLEN];
u_int kstr[MAXLLEN], *kp;
2008-01-11 11:57:08 +00:00
len = wslen(rline);
2026-06-19 01:49:53 +09:00
if(c == rk_erase) {
if(rk_cflag == 0) {
2008-01-11 11:57:08 +00:00
for(i = 0; i < len; i++)
*rkstr++ = ERRCODE + rk_erase;
2026-06-19 01:49:53 +09:00
for(i = 0; i < rk_klen; i++)
2008-01-11 11:57:08 +00:00
*rkstr++ = rk_erase;
p = lstr;
q = rline;
while(*p != NSTR) {
2026-06-19 01:49:53 +09:00
*q++ = *p;
2008-01-11 11:57:08 +00:00
*rkstr++ = ERRCODE + *p++;
}
2026-06-19 01:49:53 +09:00
*q = NSTR;
rktblp = NULL;
2008-01-11 11:57:08 +00:00
rk_cflag = -1;
} else {
2026-06-19 01:49:53 +09:00
if(len <= 0)
2008-01-11 11:57:08 +00:00
*rkstr++ = rk_erase;
else
*rkstr++ = ERRCODE + rk_erase;
rk_cflag--;
2026-06-19 01:49:53 +09:00
if(len <= 1) {
rktblp = NULL;
2008-01-11 11:57:08 +00:00
rline[0] = NSTR;
} else
rline[--len] = NSTR;
}
} else {
2026-06-19 01:49:53 +09:00
rline[len] = c;
2008-01-11 11:57:08 +00:00
rline[len + 1] = NSTR;
wscpy(wstr, rline);
2026-06-20 02:12:04 +09:00
if((i = sj4_rkconv2(wstr, kstr, len)) == CONTINUE) {
2026-06-19 01:49:53 +09:00
if(rk_cflag >= 0)
2008-01-11 11:57:08 +00:00
rk_cflag++;
*rkstr++ = ERRCODE + c;
2026-06-19 01:49:53 +09:00
} else if(i == NOMACH) {
2008-01-11 11:57:08 +00:00
rline[len] = NSTR;
2026-06-19 01:49:53 +09:00
*rkstr++ = ERRBEL;
2008-01-11 11:57:08 +00:00
} else {
rk_cflag = 0;
2026-06-19 01:49:53 +09:00
rk_klen = i;
for(i = 0; i < len; i++)
2008-01-11 11:57:08 +00:00
*rkstr++ = ERRCODE + rk_erase;
kp = kstr;
2026-06-19 01:49:53 +09:00
while(*kp != 0)
2008-01-11 11:57:08 +00:00
*rkstr++ = *kp++;
wscpy(lstr, rline);
lstr[len] = NSTR;
2026-06-19 01:49:53 +09:00
p = wstr;
q = rline;
2008-01-11 11:57:08 +00:00
while(*p != NSTR) {
*rkstr++ = ERRCODE + *p;
2026-06-19 01:49:53 +09:00
*q++ = *p++;
2008-01-11 11:57:08 +00:00
}
*q = NSTR;
}
}
*rkstr = RKEND;
}
2026-06-20 02:12:04 +09:00
int sj4_rkconv2(wchar16_t* wstr, u_int* kstr, int wlen) {
2026-06-19 01:49:53 +09:00
int i;
2008-01-11 11:57:08 +00:00
wchar16_t *p, *q, *s;
2026-06-19 01:49:53 +09:00
int rlen, len;
wchar16_t svstr[MAXLLEN];
RkTablW16* rktp;
u_short* kp;
2008-01-11 11:57:08 +00:00
len = 0;
2026-06-19 01:49:53 +09:00
if((rktp = rktblp) == NULL)
2026-06-20 02:12:04 +09:00
rktp = sj4_rcode_w16[WTOUPPER(*wstr)];
2026-06-19 01:49:53 +09:00
if(*wstr > (wchar16_t)0xff) rktp = NULL;
2008-01-11 11:57:08 +00:00
while(1) {
while(rktp != NULL) {
rlen = rkmatch((wstr + 1), rktp->r_key, wlen);
2026-06-19 01:49:53 +09:00
if(rlen == CONTINUE) {
2008-01-11 11:57:08 +00:00
rktblp = rktp;
break;
2026-06-19 01:49:53 +09:00
} else if(rlen != NOMACH) {
2008-01-11 11:57:08 +00:00
kp = rktp->k_yomi;
2026-06-19 01:49:53 +09:00
if((s = rktp->r_str) != NULL)
2008-01-11 11:57:08 +00:00
i = wslen(s);
2026-06-19 01:49:53 +09:00
else
2008-01-11 11:57:08 +00:00
i = 0;
*kstr++ = SetMojilen(rlen - i) + *kp++;
len++;
while(*kp != 0) {
*kstr++ = *kp++;
len++;
}
p = (wstr + rlen);
q = svstr;
2026-06-19 01:49:53 +09:00
if(i > 0) {
2008-01-11 11:57:08 +00:00
p -= i;
2026-06-19 01:49:53 +09:00
while(*s != NSTR) {
if(*s == WTOUPPER(*p))
2008-01-11 11:57:08 +00:00
*q = *p;
else
*q = *s;
q++;
p++;
s++;
}
}
2026-06-19 01:49:53 +09:00
if(rlen <= wlen) {
while(*p != NSTR) {
2008-01-11 11:57:08 +00:00
*q++ = *p++;
}
*q = NSTR;
wscpy(wstr, svstr);
2026-06-20 02:12:04 +09:00
rktp = sj4_rcode_w16[WTOUPPER(*wstr)];
2008-01-11 11:57:08 +00:00
wlen = wslen(wstr);
wlen--;
continue;
}
*q = NSTR;
wscpy(wstr, svstr);
rktblp = NULL;
break;
}
rktp = rktp->next;
}
2026-06-19 01:49:53 +09:00
if(rktp == NULL) {
if(wlen <= 0) {
2008-01-11 11:57:08 +00:00
*kstr++ = SetMojilen(1) + *wstr;
2026-06-19 01:49:53 +09:00
*wstr = NSTR;
rktblp = NULL;
2008-01-11 11:57:08 +00:00
len++;
2026-06-19 01:49:53 +09:00
} else if(rk_errin) {
2008-01-11 11:57:08 +00:00
len = NOMACH;
} else {
*kstr++ = SetMojilen(1) + *wstr;
len++;
p = wstr;
2026-06-19 01:49:53 +09:00
for(i = 0; i < wlen; i++) {
2008-01-11 11:57:08 +00:00
*p = *(p + 1);
p++;
}
2026-06-19 01:49:53 +09:00
*p = NSTR;
2026-06-20 02:12:04 +09:00
rktp = sj4_rcode_w16[WTOUPPER(*wstr)];
2026-06-19 01:49:53 +09:00
if(*wstr > (wchar16_t)0xff) rktp = NULL;
2008-01-11 11:57:08 +00:00
wlen--;
continue;
}
}
*kstr = 0;
break;
}
2026-06-19 01:49:53 +09:00
return (len);
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
int sj4_rkconv(u_char* romaji, u_char* kana) {
2026-06-19 01:49:53 +09:00
wchar16_t* wstr;
int len, mflag = 0, ret;
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
len = strlen((char*)romaji) + 1;
if(len > (sizeof(intmp) / sizeof(wchar16_t))) {
wstr = (wchar16_t*)malloc(len * sizeof(wchar16_t));
if(!wstr) return -1;
2008-01-11 11:57:08 +00:00
mflag = 1;
} else {
2026-06-19 01:49:53 +09:00
wstr = (wchar16_t*)intmp;
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mbstowcs(wstr, (char*)romaji, len) == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-20 02:12:04 +09:00
ret = sj4_rkconv_w16(wstr, outtmp);
2026-06-19 01:49:53 +09:00
if(ret == 0 || ret == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return ret;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mtmp, outtmp, sizeof(outtmp)) == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)romaji, wstr, len) == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
len = euctosjis(kana, MAXLLEN * 2, mtmp, sizeof(mtmp));
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
(void)memcpy(kana, mtmp, strlen((char*)mtmp) + 1);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mflag) free(wstr);
if(len > 0) {
2008-01-11 11:57:08 +00:00
return ret;
} else {
return len;
}
}
2026-06-20 02:12:04 +09:00
int sj4_rkconv_euc(u_char* romaji, u_char* kana) {
2026-06-19 01:49:53 +09:00
wchar16_t* wstr;
int len, mflag = 0, ret;
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
len = strlen((char*)romaji) + 1;
if(len > sizeof(intmp)) {
wstr = (wchar16_t*)malloc(len * sizeof(wchar16_t));
if(!wstr) return -1;
2008-01-11 11:57:08 +00:00
mflag = 1;
} else {
2026-06-19 01:49:53 +09:00
wstr = (wchar16_t*)intmp;
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mbstowcs(wstr, (char*)romaji, len) == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-20 02:12:04 +09:00
ret = sj4_rkconv_w16(wstr, outtmp);
2026-06-19 01:49:53 +09:00
if(ret == 0 || ret == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return ret;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mtmp, outtmp, sizeof(outtmp)) == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)romaji, wstr, len) == -1) {
if(mflag) free(wstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
(void)memcpy(kana, mtmp, strlen((char*)mtmp) + 1);
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
len = sjistoeuc(kana, MAXLLEN * 2, mtmp, sizeof(mtmp));
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mflag) free(wstr);
if(len > 0) {
2008-01-11 11:57:08 +00:00
return ret;
} else {
return len;
}
}
2026-06-20 02:12:04 +09:00
int sj4_rkconv_mb(u_char* romaji, u_char* kana) {
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC)
2026-06-20 02:12:04 +09:00
return sj4_rkconv_euc(romaji, kana);
2008-01-11 11:57:08 +00:00
else
2026-06-20 02:12:04 +09:00
return sj4_rkconv(romaji, kana);
2008-01-11 11:57:08 +00:00
}
2026-06-20 02:12:04 +09:00
int sj4_rkconv_w16(wchar16_t* wstr, wchar16_t* kstr) {
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
int i;
2008-01-11 11:57:08 +00:00
wchar16_t *p, *q, *s;
2026-06-19 01:49:53 +09:00
u_short cc;
int rlen, len;
wchar16_t svstr[MAXLLEN];
RkTablW16* rktp;
u_short* kp;
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
len = wslen(wstr);
2026-06-20 02:12:04 +09:00
rktp = sj4_rcode_w16[WTOUPPER(*wstr)];
2026-06-19 01:49:53 +09:00
if(*wstr > (wchar16_t)0xff) rktp = NULL;
2008-01-11 11:57:08 +00:00
while(rktp != NULL) {
rlen = rkmatch((wstr + 1), rktp->r_key, len - 1);
2026-06-19 01:49:53 +09:00
if(rlen == CONTINUE) {
2008-01-11 11:57:08 +00:00
break;
2026-06-19 01:49:53 +09:00
} else if(rlen != NOMACH) {
2008-01-11 11:57:08 +00:00
kp = rktp->k_yomi;
while((cc = *kp++) != 0) {
*kstr++ = cc;
}
wscpy(svstr, wstr);
q = wstr;
p = svstr;
2026-06-19 01:49:53 +09:00
if((s = rktp->r_str) != NULL) {
2008-01-11 11:57:08 +00:00
p += rlen;
i = wslen(s);
p -= i;
2026-06-19 01:49:53 +09:00
while(*s != NSTR) {
if(*s == WTOUPPER(*p))
2008-01-11 11:57:08 +00:00
*q = *p;
else
*q = *s;
q++;
p++;
s++;
}
}
2026-06-19 01:49:53 +09:00
if(rlen < len) {
2008-01-11 11:57:08 +00:00
p = svstr;
p += rlen;
2026-06-19 01:49:53 +09:00
while(*p != NSTR)
2008-01-11 11:57:08 +00:00
*q++ = *p++;
}
*q = NSTR;
break;
}
rktp = rktp->next;
}
2026-06-19 01:49:53 +09:00
if(rktp == NULL && len <= 1) {
2008-01-11 11:57:08 +00:00
*kstr++ = *wstr;
2026-06-19 01:49:53 +09:00
*wstr = NSTR;
rlen = 1;
2008-01-11 11:57:08 +00:00
}
*kstr = NSTR;
2026-06-19 01:49:53 +09:00
return (rlen);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int rkmatch(wchar16_t* s1, wchar16_t* s2, int len) {
2008-01-11 11:57:08 +00:00
int i;
i = 1;
2026-06-19 01:49:53 +09:00
if(s2 == NULL)
return (i);
for(; i < len + 1; i++) {
if(*s1 > (wchar16_t)0xff)
return (NOMACH);
if(WTOUPPER(*s1) != *s2) {
if(*s2 != NSTR)
return (NOMACH);
2008-01-11 11:57:08 +00:00
break;
}
s1++;
s2++;
}
2026-06-19 01:49:53 +09:00
if(*s2 != NSTR)
2008-01-11 11:57:08 +00:00
i = CONTINUE;
2026-06-19 01:49:53 +09:00
return (i);
2008-01-11 11:57:08 +00:00
}