sj3lib: KNF

Formatter: knfmt 4.2.0
Signed-off-by: Masanori Ogino <mogino@acm.org>
This commit is contained in:
Masanori Ogino 2023-11-30 08:48:00 +09:00
commit e00547f414
4 changed files with 1182 additions and 1097 deletions

View file

@ -130,13 +130,13 @@ put_cmd(int cmd)
static u_char * static u_char *
put_ndata(u_char *p, int n) put_ndata(u_char *p, int n)
{ {
while (n-- > 0) put_byte(p ? *p++ : 0); while (n-- > 0)
put_byte(p ? *p++ : 0);
return p; return p;
} }
static int static int
put_over( put_over(int buflen,
int buflen,
int n, int n,
u_char *(*func1)(), u_char *str1, int len1, u_char *(*func1)(), u_char *str1, int len1,
u_char *(*func2)(), u_char *str2, int len2, u_char *(*func2)(), u_char *str2, int len2,
@ -149,10 +149,18 @@ put_over(
int len[ARGNUM]; int len[ARGNUM];
int i; int i;
func[0] = func1; data[0] = str1; len[0] = len1; func[0] = func1;
func[1] = func2; data[1] = str2; len[1] = len2; data[0] = str1;
func[2] = func3; data[2] = str3; len[2] = len3; len[0] = len1;
func[3] = func4; data[3] = str4; len[3] = len4; func[1] = func2;
data[1] = str2;
len[1] = len2;
func[2] = func3;
data[2] = str3;
len[2] = len3;
func[3] = func4;
data[3] = str4;
len[3] = len4;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
if (len[i] < buflen) { if (len[i] < buflen) {
@ -160,8 +168,10 @@ put_over(
buflen -= len[i]; buflen -= len[i];
} else { } else {
while (len[i] > 0) { while (len[i] > 0) {
data[i] = (*func[i])(data[i], (len[i] < buflen) ? len[i] : buflen); data[i] = (*func[i])(data[i],
if (put_flush() == ERROR) return ERROR; (len[i] < buflen) ? len[i] : buflen);
if (put_flush() == ERROR)
return ERROR;
len[i] -= buflen; len[i] -= buflen;
buflen = BUFFER_SIZE; buflen = BUFFER_SIZE;
} }
@ -176,7 +186,8 @@ put_over(
static int static int
get_buffer(void) get_buffer(void)
{ {
if (ReadErrorFlag) return ERROR; if (ReadErrorFlag)
return ERROR;
getpos = getlen = 0; getpos = getlen = 0;
getlen = read(server_fd, getbuf, sizeof(getbuf)); getlen = read(server_fd, getbuf, sizeof(getbuf));
@ -241,30 +252,37 @@ get_nstring(u_char* p, int n)
c = get_byte(); c = get_byte();
while (c) { while (c) {
if (n > 1) { *p++ = c; n--; } if (n > 1) {
*p++ = c;
n--;
}
c = get_byte(); c = get_byte();
} }
if (n > 0) *p++ = 0; if (n > 0)
*p++ = 0;
return n; return n;
} }
static u_char * static u_char *
get_ndata(u_char *p, int n) get_ndata(u_char *p, int n)
{ {
while (n-- > 0) *p++ = get_byte(); while (n-- > 0)
*p++ = get_byte();
return p; return p;
} }
static void static void
skip_string(void) skip_string(void)
{ {
while (get_byte()) ; while (get_byte())
;
} }
static void static void
skip_ndata(int n) skip_ndata(int n)
{ {
while (n-- > 0) get_byte(); while (n-- > 0)
get_byte();
} }
static int static int
@ -285,8 +303,8 @@ open_unix(void)
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
len += sizeof(sunix.sun_len); len += sizeof(sunix.sun_len);
#endif #endif
if (connect(fd, (struct sockaddr *)&sunix, len) if (connect(fd, (struct sockaddr *)&sunix, len) ==
== ERROR) { ERROR) {
sj3_error_number = SJ3_ConnectSocket; sj3_error_number = SJ3_ConnectSocket;
return ERROR; return ERROR;
} }
@ -351,13 +369,8 @@ open_inet(char* host)
return fd; return fd;
} }
int int
sj3_make_connection( sj3_make_connection(SJ3_CLIENT_ENV *client, char *serv, char *user, char *prog)
SJ3_CLIENT_ENV* client,
char* serv,
char* user,
char* prog)
{ {
char host[MAXHOSTNAMELEN]; char host[MAXHOSTNAMELEN];
int tmp; int tmp;
@ -367,13 +380,13 @@ sj3_make_connection(
client->fd = -1; client->fd = -1;
if (!serv || *serv == '\0' || !strcmp(serv, af_unix_str)) if (!serv || *serv == '\0' || !strcmp(serv, af_unix_str)) {
{ if ((server_fd = open_unix()) == ERROR)
if ((server_fd = open_unix()) == ERROR) return ERROR; return ERROR;
strcpy(host, af_unix_str); strcpy(host, af_unix_str);
} } else {
else { if ((server_fd = open_inet(serv)) == ERROR)
if ((server_fd = open_inet(serv)) == ERROR) return ERROR; return ERROR;
gethostname(host, sizeof(host)); gethostname(host, sizeof(host));
} }
client->fd = server_fd; client->fd = server_fd;
@ -390,25 +403,30 @@ sj3_make_connection(
put_string(host, hostlen); put_string(host, hostlen);
put_string(user, userlen); put_string(user, userlen);
put_string(prog, proglen); put_string(prog, proglen);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 3, put_string, host, hostlen, put_string, user, if (put_over(buflen, 3, put_string, host, hostlen, put_string,
userlen, put_string, prog, proglen, NULL, NULL, 0) == ERROR) user, userlen, put_string, prog, proglen, NULL, NULL, 0) ==
ERROR)
return ERROR; return ERROR;
} }
if ((tmp = get_int()) == SJ3_DifferentVersion) { if ((tmp = get_int()) == SJ3_DifferentVersion) {
if (ReadErrorFlag) return ERROR; if (ReadErrorFlag)
return ERROR;
put_cmd(SJ3_CONNECT); put_cmd(SJ3_CONNECT);
put_int(1); put_int(1);
if (datalen <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) { if (datalen <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) {
put_string(host, hostlen); put_string(host, hostlen);
put_string(user, userlen); put_string(user, userlen);
put_string(prog, proglen); put_string(prog, proglen);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 3, put_string, host, hostlen, put_string, user, if (put_over(buflen, 3, put_string, host, hostlen,
userlen, put_string, prog, proglen, NULL, NULL, 0) == ERROR) put_string, user, userlen, put_string, prog,
proglen, NULL, NULL, 0) == ERROR)
return ERROR; return ERROR;
} }
if ((tmp = get_int())) { if ((tmp = get_int())) {
@ -427,9 +445,11 @@ sj3_make_connection(
cliptr->default_char[1] = 0x40; cliptr->default_char[1] = 0x40;
sj3_error_number = 0; sj3_error_number = 0;
if (ReadErrorFlag) return ERROR; if (ReadErrorFlag)
return ERROR;
put_cmd(SJ3_STDYSIZE); put_cmd(SJ3_STDYSIZE);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((tmp = get_int())) { if ((tmp = get_int())) {
sj3_erase_connection(client); sj3_erase_connection(client);
@ -449,19 +469,19 @@ sj3_erase_connection(SJ3_CLIENT_ENV* client)
client_init(client); client_init(client);
put_cmd(SJ3_DISCONNECT); put_cmd(SJ3_DISCONNECT);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
sj3_error_number = get_int(); sj3_error_number = get_int();
close(server_fd); close(server_fd);
cliptr->fd = -1; cliptr->fd = -1;
if (ReadErrorFlag) return ERROR; if (ReadErrorFlag)
return ERROR;
return sj3_error_number ? ERROR : 0; return sj3_error_number ? ERROR : 0;
} }
long long
sj3_open_dictionary( sj3_open_dictionary(SJ3_CLIENT_ENV *client,
SJ3_CLIENT_ENV* client,
char *dictname, char *password) char *dictname, char *password)
{ {
int res; int res;
@ -478,14 +498,17 @@ sj3_open_dictionary(
if (datalen < (buflen = BUFFER_SIZE - CMDLEN)) { if (datalen < (buflen = BUFFER_SIZE - CMDLEN)) {
put_string(dictname, dictlen); put_string(dictname, dictlen);
put_string(password, passlen); put_string(password, passlen);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 2, put_string, dictname, dictlen, put_string, if (put_over(buflen, 2, put_string, dictname, dictlen,
password, passlen, NULL, NULL, 0, NULL, NULL, 0) == ERROR) put_string, password, passlen, NULL, NULL, 0, NULL, NULL,
0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return 0; if ((sj3_error_number = get_int()))
return 0;
res = get_int(); res = get_int();
return ReadErrorFlag ? ERROR : res; return ReadErrorFlag ? ERROR : res;
} }
@ -497,17 +520,16 @@ sj3_close_dictionary(SJ3_CLIENT_ENV* client, long dicid)
put_cmd(SJ3_CLOSEDICT); put_cmd(SJ3_CLOSEDICT);
put_int(dicid); put_int(dicid);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_open_study_file( sj3_open_study_file(SJ3_CLIENT_ENV *client, char *stdyname, char *password)
SJ3_CLIENT_ENV* client,
char* stdyname, char* password)
{ {
int stdylen, passlen; int stdylen, passlen;
int datalen, buflen; int datalen, buflen;
@ -522,14 +544,17 @@ sj3_open_study_file(
if (datalen < (buflen = BUFFER_SIZE - CMDLEN)) { if (datalen < (buflen = BUFFER_SIZE - CMDLEN)) {
put_string(stdyname, stdylen); put_string(stdyname, stdylen);
put_string(password, passlen); put_string(password, passlen);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 2, put_string, stdyname, stdylen, put_string, if (put_over(buflen, 2, put_string, stdyname, stdylen,
password, passlen, NULL, NULL, 0, NULL, NULL, 0) == ERROR) put_string, password, passlen, NULL, NULL, 0, NULL, NULL,
0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
@ -539,36 +564,40 @@ sj3_close_study_file(SJ3_CLIENT_ENV* client)
client_init(client); client_init(client);
put_cmd(SJ3_CLOSESTDY); put_cmd(SJ3_CLOSESTDY);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_get_id_size(SJ3_CLIENT_ENV *client) sj3_get_id_size(SJ3_CLIENT_ENV *client)
{ {
client_init(client); client_init(client);
put_cmd(SJ3_STDYSIZE); put_cmd(SJ3_STDYSIZE);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
cliptr->stdy_size = get_int(); cliptr->stdy_size = get_int();
return ReadErrorFlag ? ERROR : cliptr->stdy_size; return ReadErrorFlag ? ERROR : cliptr->stdy_size;
} }
int int
sj3_lock_server(SJ3_CLIENT_ENV *client) sj3_lock_server(SJ3_CLIENT_ENV *client)
{ {
client_init(client); client_init(client);
put_cmd(SJ3_LOCK); put_cmd(SJ3_LOCK);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
@ -578,19 +607,16 @@ sj3_unlock_server(SJ3_CLIENT_ENV *client)
client_init(client); client_init(client);
put_cmd(SJ3_UNLOCK); put_cmd(SJ3_UNLOCK);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_ikkatu_henkan( sj3_ikkatu_henkan(SJ3_CLIENT_ENV *client, u_char *src, u_char *dst, int dstsiz,
SJ3_CLIENT_ENV* client,
u_char* src,
u_char* dst,
int dstsiz,
int mb_flag) int mb_flag)
{ {
int c; int c;
@ -613,32 +639,34 @@ sj3_ikkatu_henkan(
put_cmd(SJ3_PH2KNJ_EUC); put_cmd(SJ3_PH2KNJ_EUC);
if (srclen < (buflen = BUFFER_SIZE - CMDLEN)) { if (srclen < (buflen = BUFFER_SIZE - CMDLEN)) {
put_string(src, srclen); put_string(src, srclen);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 1, put_string, src, srclen, NULL, NULL, 0, if (put_over(buflen, 1, put_string, src, srclen, NULL, NULL, 0,
NULL, NULL, 0, NULL, NULL, 0) == ERROR) NULL, NULL, 0, NULL, NULL, 0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
result = get_int(); result = get_int();
result = 0; result = 0;
stysiz = cliptr->stdy_size; stysiz = cliptr->stdy_size;
len1 = 1 + stysiz + 1 + 1; len1 = 1 + stysiz + 1 + 1;
while ((c = get_byte())) { while ((c = get_byte())) {
top = dst; top = dst;
if (dstsiz < len1) goto error1; if (dstsiz < len1)
goto error1;
*dst++ = len = c; *dst++ = len = c;
dst = get_ndata(dst, stysiz); dst = get_ndata(dst, stysiz);
dstsiz -= (stysiz + 1); dstsiz -= (stysiz + 1);
while ((c = get_byte())) { while ((c = get_byte())) {
if (dstsiz-- < 3) goto error2; if (dstsiz-- < 3)
goto error2;
*dst++ = c; *dst++ = c;
} }
*dst++ = 0; *dst++ = 0;
@ -649,26 +677,21 @@ sj3_ikkatu_henkan(
*dst = 0; *dst = 0;
return ReadErrorFlag ? ERROR : result; return ReadErrorFlag ? ERROR : result;
error1: error1:
do { do {
skip_ndata(stysiz); skip_ndata(stysiz);
error2: error2:
while (get_byte()) ; while (get_byte())
;
} while (get_byte()); } while (get_byte());
*top = 0; *top = 0;
return ReadErrorFlag ? ERROR : result; return ReadErrorFlag ? ERROR : result;
} }
int int
sj3_bunsetu_henkan( sj3_bunsetu_henkan(SJ3_CLIENT_ENV *client, u_char *yomi, int len,
SJ3_CLIENT_ENV* client, u_char *kanji, int mb_flag)
u_char* yomi,
int len,
u_char* kanji,
int mb_flag)
{ {
int result; int result;
int buflen; int buflen;
@ -683,15 +706,16 @@ sj3_bunsetu_henkan(
if ((len + 1) <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) { if ((len + 1) <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) {
put_ndata(yomi, len); put_ndata(yomi, len);
put_byte(0); put_byte(0);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 2, put_ndata, yomi, len, put_ndata, NULL,
if (put_over(buflen, 2, put_ndata, yomi, len, put_ndata, NULL, 1, 1, NULL, NULL, 0, NULL, NULL, 0) == ERROR)
NULL, NULL, 0, NULL, NULL, 0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
result = get_int(); result = get_int();
get_string(get_ndata(kanji, cliptr->stdy_size)); get_string(get_ndata(kanji, cliptr->stdy_size));
@ -699,10 +723,7 @@ sj3_bunsetu_henkan(
} }
int int
sj3_bunsetu_jikouho( sj3_bunsetu_jikouho(SJ3_CLIENT_ENV *client, u_char *kanji, int mode,
SJ3_CLIENT_ENV* client,
u_char* kanji,
int mode,
int mb_flag) int mb_flag)
{ {
int result; int result;
@ -714,9 +735,11 @@ sj3_bunsetu_jikouho(
else else
put_cmd(SJ3_NEXTCL_EUC); put_cmd(SJ3_NEXTCL_EUC);
put_int(mode); put_int(mode);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
result = get_int(); result = get_int();
get_string(get_ndata(kanji, cliptr->stdy_size)); get_string(get_ndata(kanji, cliptr->stdy_size));
@ -724,9 +747,8 @@ sj3_bunsetu_jikouho(
} }
int int
sj3_bunsetu_maekouho( sj3_bunsetu_maekouho(SJ3_CLIENT_ENV *client, u_char *kanji, int mode,
SJ3_CLIENT_ENV* client, int mb_flag)
u_char* kanji, int mode, int mb_flag)
{ {
int result; int result;
@ -737,22 +759,19 @@ sj3_bunsetu_maekouho(
else else
put_cmd(SJ3_PREVCL_EUC); put_cmd(SJ3_PREVCL_EUC);
put_int(mode); put_int(mode);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
result = get_int(); result = get_int();
get_string(get_ndata(kanji, cliptr->stdy_size)); get_string(get_ndata(kanji, cliptr->stdy_size));
return ReadErrorFlag ? ERROR : result; return ReadErrorFlag ? ERROR : result;
} }
int int
sj3_bunsetu_kouhosuu( sj3_bunsetu_kouhosuu(SJ3_CLIENT_ENV *client, u_char *yomi, int len, int mb_flag)
SJ3_CLIENT_ENV* client,
u_char* yomi,
int len,
int mb_flag)
{ {
int result; int result;
int buflen; int buflen;
@ -767,27 +786,24 @@ sj3_bunsetu_kouhosuu(
if ((len + 1) <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) { if ((len + 1) <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) {
put_ndata(yomi, len); put_ndata(yomi, len);
put_byte(0); put_byte(0);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 2, put_ndata, yomi, len, put_ndata, NULL,
if (put_over(buflen, 2, put_ndata, yomi, len, put_ndata, NULL, 1, 1, NULL, NULL, 0, NULL, NULL, 0) == ERROR)
NULL, NULL, 0, NULL, NULL, 0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
result = get_int(); result = get_int();
return ReadErrorFlag ? ERROR : result; return ReadErrorFlag ? ERROR : result;
} }
int int
sj3_bunsetu_zenkouho( sj3_bunsetu_zenkouho(SJ3_CLIENT_ENV *client, u_char *yomi, int len,
SJ3_CLIENT_ENV* client, SJ3_DOUON *douon, int mb_flag)
u_char* yomi,
int len,
SJ3_DOUON* douon,
int mb_flag)
{ {
int cnt = 0; int cnt = 0;
int buflen; int buflen;
@ -802,15 +818,16 @@ sj3_bunsetu_zenkouho(
if ((len + 1) <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) { if ((len + 1) <= (buflen = BUFFER_SIZE - CMDLEN - INTLEN)) {
put_ndata(yomi, len); put_ndata(yomi, len);
put_byte(0); put_byte(0);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 2, put_ndata, yomi, len, put_ndata, NULL,
if (put_over(buflen, 2, put_ndata, yomi, len, put_ndata, NULL, 1, 1, NULL, NULL, 0, NULL, NULL, 0) == ERROR)
NULL, NULL, 0, NULL, NULL, 0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
while (get_int()) { while (get_int()) {
get_ndata(&(douon->dcid), cliptr->stdy_size); get_ndata(&(douon->dcid), cliptr->stdy_size);
@ -823,7 +840,6 @@ sj3_bunsetu_zenkouho(
return ReadErrorFlag ? ERROR : cnt; return ReadErrorFlag ? ERROR : cnt;
} }
int int
sj3_tango_gakusyuu(SJ3_CLIENT_ENV *client, SJ3_STUDYREC *stdy) sj3_tango_gakusyuu(SJ3_CLIENT_ENV *client, SJ3_STUDYREC *stdy)
{ {
@ -834,26 +850,22 @@ sj3_tango_gakusyuu(SJ3_CLIENT_ENV* client, SJ3_STUDYREC* stdy)
put_cmd(SJ3_STUDY); put_cmd(SJ3_STUDY);
if (cliptr->stdy_size <= (buflen = BUFFER_SIZE - CMDLEN)) { if (cliptr->stdy_size <= (buflen = BUFFER_SIZE - CMDLEN)) {
put_ndata(stdy, cliptr->stdy_size); put_ndata(stdy, cliptr->stdy_size);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 1, put_ndata, stdy, cliptr->stdy_size,
if (put_over(buflen, 1, put_ndata, stdy, cliptr -> stdy_size, NULL, NULL, NULL, 0, NULL, NULL, 0, NULL, NULL, 0) == ERROR)
NULL, 0, NULL, NULL, 0, NULL, NULL, 0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int()))
if ((sj3_error_number = get_int())) return ERROR; return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_bunsetu_gakusyuu( sj3_bunsetu_gakusyuu(SJ3_CLIENT_ENV *client, u_char *yomi1, u_char *yomi2,
SJ3_CLIENT_ENV* client, SJ3_STUDYREC *stdy, int mb_flag)
u_char* yomi1,
u_char* yomi2,
SJ3_STUDYREC* stdy,
int mb_flag)
{ {
int yomilen1, yomilen2; int yomilen1, yomilen2;
int datalen, buflen; int datalen, buflen;
@ -872,7 +884,8 @@ sj3_bunsetu_gakusyuu(
put_string(yomi1, yomilen1); put_string(yomi1, yomilen1);
put_string(yomi2, yomilen2); put_string(yomi2, yomilen2);
put_ndata(stdy, cliptr->stdy_size); put_ndata(stdy, cliptr->stdy_size);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 3, put_string, yomi1, yomilen1, put_string, if (put_over(buflen, 3, put_string, yomi1, yomilen1, put_string,
yomi2, yomilen2, put_ndata, stdy, cliptr->stdy_size, yomi2, yomilen2, put_ndata, stdy, cliptr->stdy_size,
@ -880,19 +893,14 @@ sj3_bunsetu_gakusyuu(
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_tango_touroku( sj3_tango_touroku(SJ3_CLIENT_ENV *client, long dicid, u_char *yomi,
SJ3_CLIENT_ENV* client, u_char *kanji, int code, int mb_flag)
long dicid,
u_char* yomi,
u_char* kanji,
int code,
int mb_flag)
{ {
int yomilen, kanjilen; int yomilen, kanjilen;
int datalen, buflen; int datalen, buflen;
@ -912,25 +920,23 @@ sj3_tango_touroku(
put_string(yomi, yomilen); put_string(yomi, yomilen);
put_string(kanji, kanjilen); put_string(kanji, kanjilen);
put_int(code); put_int(code);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 3, put_string, yomi, yomilen, put_string, kanji, if (put_over(buflen, 3, put_string, yomi, yomilen, put_string,
kanjilen, put_ndata, &code, INTLEN, NULL, NULL, 0) == ERROR) kanji, kanjilen, put_ndata, &code, INTLEN, NULL, NULL, 0) ==
ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_tango_sakujo( sj3_tango_sakujo(SJ3_CLIENT_ENV *client, long dicid, u_char *yomi,
SJ3_CLIENT_ENV* client, u_char *kanji, int code, int mb_flag)
long dicid,
u_char* yomi,
u_char* kanji,
int code,
int mb_flag)
{ {
int yomilen, kanjilen; int yomilen, kanjilen;
int datalen, buflen; int datalen, buflen;
@ -950,24 +956,22 @@ sj3_tango_sakujo(
put_string(yomi, yomilen); put_string(yomi, yomilen);
put_string(kanji, kanjilen); put_string(kanji, kanjilen);
put_int(code); put_int(code);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 3, put_string, yomi, yomilen, put_string, kanji, if (put_over(buflen, 3, put_string, yomi, yomilen, put_string,
kanjilen, put_ndata, &code, INTLEN, NULL, NULL, 0) == ERROR) kanji, kanjilen, put_ndata, &code, INTLEN, NULL, NULL, 0) ==
ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_tango_syutoku( sj3_tango_syutoku(SJ3_CLIENT_ENV *client, int dicid, u_char *buf, int mb_flag)
SJ3_CLIENT_ENV* client,
int dicid,
u_char* buf,
int mb_flag)
{ {
u_char *p; u_char *p;
@ -978,9 +982,11 @@ sj3_tango_syutoku(
else else
put_cmd(SJ3_GETDICT_EUC); put_cmd(SJ3_GETDICT_EUC);
put_int(dicid); put_int(dicid);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
p = get_string(buf); p = get_string(buf);
p = get_string(p); p = get_string(p);
@ -989,11 +995,7 @@ sj3_tango_syutoku(
} }
int int
sj3_tango_jikouho( sj3_tango_jikouho(SJ3_CLIENT_ENV *client, int dicid, u_char *buf, int mb_flag)
SJ3_CLIENT_ENV* client,
int dicid,
u_char* buf,
int mb_flag)
{ {
u_char *p; u_char *p;
@ -1004,9 +1006,11 @@ sj3_tango_jikouho(
else else
put_cmd(SJ3_NEXTDICT_EUC); put_cmd(SJ3_NEXTDICT_EUC);
put_int(dicid); put_int(dicid);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
p = get_string(buf); p = get_string(buf);
p = get_string(p); p = get_string(p);
@ -1015,11 +1019,7 @@ sj3_tango_jikouho(
} }
int int
sj3_tango_maekouho( sj3_tango_maekouho(SJ3_CLIENT_ENV *client, int dicid, u_char *buf, int mb_flag)
SJ3_CLIENT_ENV* client,
int dicid,
u_char* buf,
int mb_flag)
{ {
u_char *p; u_char *p;
@ -1030,9 +1030,11 @@ sj3_tango_maekouho(
else else
put_cmd(SJ3_PREVDICT_EUC); put_cmd(SJ3_PREVDICT_EUC);
put_int(dicid); put_int(dicid);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
p = get_string(buf); p = get_string(buf);
p = get_string(p); p = get_string(p);
@ -1040,13 +1042,8 @@ sj3_tango_maekouho(
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_make_dict_file( sj3_make_dict_file(SJ3_CLIENT_ENV *client, char *path, int idxlen, int seglen,
SJ3_CLIENT_ENV* client,
char* path,
int idxlen,
int seglen,
int segnum) int segnum)
{ {
int pathlen; int pathlen;
@ -1063,7 +1060,8 @@ sj3_make_dict_file(
put_int(idxlen); put_int(idxlen);
put_int(seglen); put_int(seglen);
put_int(segnum); put_int(segnum);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 4, put_string, path, pathlen, put_ndata, if (put_over(buflen, 4, put_string, path, pathlen, put_ndata,
&idxlen, INTLEN, put_ndata, &seglen, INTLEN, &idxlen, INTLEN, put_ndata, &seglen, INTLEN,
@ -1071,17 +1069,13 @@ sj3_make_dict_file(
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_make_study_file( sj3_make_study_file(SJ3_CLIENT_ENV *client, char *path, int stynum, int clstep,
SJ3_CLIENT_ENV* client,
char* path,
int stynum,
int clstep,
int cllen) int cllen)
{ {
int pathlen; int pathlen;
@ -1098,7 +1092,8 @@ sj3_make_study_file(
put_int(stynum); put_int(stynum);
put_int(clstep); put_int(clstep);
put_int(cllen); put_int(cllen);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 4, put_string, path, pathlen, put_ndata, if (put_over(buflen, 4, put_string, path, pathlen, put_ndata,
&stynum, INTLEN, put_ndata, &clstep, INTLEN, &stynum, INTLEN, put_ndata, &clstep, INTLEN,
@ -1106,11 +1101,11 @@ sj3_make_study_file(
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_make_directory(SJ3_CLIENT_ENV *client, char *path) sj3_make_directory(SJ3_CLIENT_ENV *client, char *path)
{ {
@ -1124,19 +1119,19 @@ sj3_make_directory(SJ3_CLIENT_ENV* client, char* path)
put_cmd(SJ3_MAKEDIR); put_cmd(SJ3_MAKEDIR);
if (pathlen <= (buflen = BUFFER_SIZE - CMDLEN)) { if (pathlen <= (buflen = BUFFER_SIZE - CMDLEN)) {
put_string(path, pathlen); put_string(path, pathlen);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 1, put_string, path, pathlen, NULL, NULL, 0, if (put_over(buflen, 1, put_string, path, pathlen, NULL, NULL,
NULL, NULL, 0, NULL, NULL, 0) == ERROR) 0, NULL, NULL, 0, NULL, NULL, 0) == ERROR)
return ERROR; return ERROR;
} }
if ((sj3_error_number = get_int()))
if ((sj3_error_number = get_int())) return ERROR; return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_access(SJ3_CLIENT_ENV *client, char *path, int mode) sj3_access(SJ3_CLIENT_ENV *client, char *path, int mode)
{ {
@ -1153,7 +1148,8 @@ sj3_access(SJ3_CLIENT_ENV* client, char* path, int mode)
if (datalen <= (buflen = BUFFER_SIZE - CMDLEN)) { if (datalen <= (buflen = BUFFER_SIZE - CMDLEN)) {
put_string(path, pathlen); put_string(path, pathlen);
put_int(mode); put_int(mode);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
} else { } else {
if (put_over(buflen, 2, put_string, path, pathlen, put_ndata, if (put_over(buflen, 2, put_string, path, pathlen, put_ndata,
&mode, INTLEN, NULL, NULL, 0, NULL, NULL, 0) == ERROR) &mode, INTLEN, NULL, NULL, 0, NULL, NULL, 0) == ERROR)
@ -1165,7 +1161,6 @@ sj3_access(SJ3_CLIENT_ENV* client, char* path, int mode)
return ReadErrorFlag ? ERROR : result; return ReadErrorFlag ? ERROR : result;
} }
int int
sj3_who(SJ3_CLIENT_ENV *client, SJ3_WHO_STRUCT *ret, int num) sj3_who(SJ3_CLIENT_ENV *client, SJ3_WHO_STRUCT *ret, int num)
{ {
@ -1174,7 +1169,8 @@ sj3_who(SJ3_CLIENT_ENV* client, SJ3_WHO_STRUCT* ret, int num)
client_init(client); client_init(client);
put_cmd(SJ3_WHO); put_cmd(SJ3_WHO);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((i = get_int()) < 0) { if ((i = get_int()) < 0) {
sj3_error_number = SJ3_InternalError; sj3_error_number = SJ3_InternalError;
@ -1189,8 +1185,7 @@ sj3_who(SJ3_CLIENT_ENV* client, SJ3_WHO_STRUCT* ret, int num)
get_nstring(ret->username, SJ3_NAME_LENGTH); get_nstring(ret->username, SJ3_NAME_LENGTH);
get_nstring(ret->progname, SJ3_NAME_LENGTH); get_nstring(ret->progname, SJ3_NAME_LENGTH);
ret++; ret++;
} } else {
else {
get_int(); get_int();
skip_string(); skip_string();
skip_string(); skip_string();
@ -1201,16 +1196,17 @@ sj3_who(SJ3_CLIENT_ENV* client, SJ3_WHO_STRUCT* ret, int num)
return ReadErrorFlag ? ERROR : ((i < num) ? i : num); return ReadErrorFlag ? ERROR : ((i < num) ? i : num);
} }
int int
sj3_quit(SJ3_CLIENT_ENV *client) sj3_quit(SJ3_CLIENT_ENV *client)
{ {
client_init(client); client_init(client);
put_cmd(SJ3_QUIT); put_cmd(SJ3_QUIT);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
@ -1220,13 +1216,14 @@ sj3_kill(SJ3_CLIENT_ENV* client)
client_init(client); client_init(client);
put_cmd(SJ3_KILL); put_cmd(SJ3_KILL);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
if ((sj3_error_number = get_int())) return ERROR; if ((sj3_error_number = get_int()))
return ERROR;
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }
int int
sj3_version(SJ3_CLIENT_ENV *client, char *dst, int dstsiz) sj3_version(SJ3_CLIENT_ENV *client, char *dst, int dstsiz)
{ {
@ -1235,18 +1232,28 @@ sj3_version(SJ3_CLIENT_ENV* client, char* dst, int dstsiz)
client_init(client); client_init(client);
put_cmd(SJ3_VERSION); put_cmd(SJ3_VERSION);
if (put_flush() == ERROR) return ERROR; if (put_flush() == ERROR)
return ERROR;
sj3_error_number = get_int(); sj3_error_number = get_int();
c = get_byte(); c = get_byte();
while (c) { while (c) {
while (c) { while (c) {
if (dstsiz > 2) { *dst++ = c; dstsiz--; } if (dstsiz > 2) {
*dst++ = c;
dstsiz--;
}
c = get_byte(); c = get_byte();
} }
if (dstsiz > 1) { *dst++ = 0; dstsiz--; } if (dstsiz > 1) {
*dst++ = 0;
dstsiz--;
}
c = get_byte(); c = get_byte();
} }
if (dstsiz > 0) { *dst++ = 0; dstsiz--; } if (dstsiz > 0) {
*dst++ = 0;
dstsiz--;
}
return ReadErrorFlag ? ERROR : 0; return ReadErrorFlag ? ERROR : 0;
} }

View file

@ -48,6 +48,7 @@
#include "sj_string.h" #include "sj_string.h"
extern int sj3_error_number; extern int sj3_error_number;
#define SYS_SJIS 0 #define SYS_SJIS 0
#define SYS_EUC 1 #define SYS_EUC 1
#define SYS_NOTDEF -1 #define SYS_NOTDEF -1
@ -86,19 +87,22 @@ make_dirs(char* path)
int i; int i;
for (p = path; *p; p++) { for (p = path; *p; p++) {
if (*p != *path_delimiter) continue; if (*p != *path_delimiter)
continue;
strncpy(tmp, path, (i = p - path)); strncpy(tmp, path, (i = p - path));
tmp[i] = '\0'; tmp[i] = '\0';
if (sj3_access(&client, tmp, F_OK) != ERROR) continue; if (sj3_access(&client, tmp, F_OK) != ERROR)
if (sj3_error_number == SJ3_ServerDown) return ERROR; continue;
if (sj3_error_number == SJ3_ServerDown)
return ERROR;
if (sj3_make_directory(&client, tmp) == ERROR) return ERROR; if (sj3_make_directory(&client, tmp) == ERROR)
return ERROR;
} }
return 0; return 0;
} }
int int
sj3_open(char *host, char *user) sj3_open(char *host, char *user)
{ {
@ -106,12 +110,15 @@ sj3_open(char* host, char* user)
char *p; char *p;
int err = SJ3_NORMAL_END; int err = SJ3_NORMAL_END;
if (client.fd != -1) return SJ3_ALREADY_CONNECTED; if (client.fd != -1)
return SJ3_ALREADY_CONNECTED;
sprintf(tmp, "%d.sj3lib", getpid()); sprintf(tmp, "%d.sj3lib", getpid());
if (sj3_make_connection(&client, host, user, tmp) == ERROR) { if (sj3_make_connection(&client, host, user, tmp) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
client.fd = -1; return SJ3_CONNECT_ERROR; goto server_dead;
client.fd = -1;
return SJ3_CONNECT_ERROR;
} }
if (client.stdy_size > SJ3_WORD_ID_SIZE) { if (client.stdy_size > SJ3_WORD_ID_SIZE) {
@ -121,7 +128,8 @@ sj3_open(char* host, char* user)
mdicid = sj3_open_dictionary(&client, MainDictionary, NULL); mdicid = sj3_open_dictionary(&client, MainDictionary, NULL);
if (mdicid == 0) { if (mdicid == 0) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CANNOT_OPEN_MDICT; err |= SJ3_CANNOT_OPEN_MDICT;
} }
@ -131,14 +139,17 @@ sj3_open(char* host, char* user)
strcat(tmp, user); strcat(tmp, user);
strcat(tmp, path_delimiter); strcat(tmp, path_delimiter);
if (make_dirs(tmp) == ERROR) { if (make_dirs(tmp) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
return (err | SJ3_CANNOT_MAKE_UDIR); return (err | SJ3_CANNOT_MAKE_UDIR);
} }
for (p = tmp ; *p ; p++) ; for (p = tmp; *p; p++)
;
strcpy(p, UserDictionary); strcpy(p, UserDictionary);
if (sj3_access(&client, tmp, F_OK) == ERROR) { if (sj3_access(&client, tmp, F_OK) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
if (sj3_make_dict_file(&client, tmp, DefIdxLen, if (sj3_make_dict_file(&client, tmp, DefIdxLen,
DefSegLen, DefSegNum) == ERROR) { DefSegLen, DefSegNum) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) if (sj3_error_number == SJ3_ServerDown)
@ -148,13 +159,15 @@ sj3_open(char* host, char* user)
} }
udicid = sj3_open_dictionary(&client, tmp, ""); udicid = sj3_open_dictionary(&client, tmp, "");
if (udicid == 0) { if (udicid == 0) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CANNOT_OPEN_UDICT; err |= SJ3_CANNOT_OPEN_UDICT;
} }
strcpy(p, StudyFile); strcpy(p, StudyFile);
if (sj3_access(&client, tmp, F_OK) == ERROR) { if (sj3_access(&client, tmp, F_OK) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
if (sj3_make_study_file(&client, tmp, DefStyNum, DefClStep, if (sj3_make_study_file(&client, tmp, DefStyNum, DefClStep,
DefClLen) == ERROR) { DefClLen) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) if (sj3_error_number == SJ3_ServerDown)
@ -163,7 +176,8 @@ sj3_open(char* host, char* user)
} }
} }
if (sj3_open_study_file(&client, tmp, "") == ERROR) { if (sj3_open_study_file(&client, tmp, "") == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CANNOT_OPEN_STUDY; err |= SJ3_CANNOT_OPEN_STUDY;
} }
@ -174,11 +188,9 @@ server_dead:
return SJ3_SERVER_DEAD; return SJ3_SERVER_DEAD;
} }
int int
sj3_open_with_list( sj3_open_with_list(char *host, char *user, int dicts_num, char **dicts,
char* host, char* user, int dicts_num, int *error_num, int **error_index)
char** dicts, int* error_num, int** error_index)
{ {
char tmp[PathNameLen]; char tmp[PathNameLen];
char *p; char *p;
@ -186,12 +198,15 @@ sj3_open_with_list(
int i, err_id_num = 0; int i, err_id_num = 0;
long *dict_idx = NULL; long *dict_idx = NULL;
if (client.fd != -1) return SJ3_ALREADY_CONNECTED; if (client.fd != -1)
return SJ3_ALREADY_CONNECTED;
sprintf(tmp, "%d.sj3lib", getpid()); sprintf(tmp, "%d.sj3lib", getpid());
if (sj3_make_connection(&client, host, user, tmp) == ERROR) { if (sj3_make_connection(&client, host, user, tmp) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
client.fd = -1; return SJ3_CONNECT_ERROR; goto server_dead;
client.fd = -1;
return SJ3_CONNECT_ERROR;
} }
if (client.stdy_size > SJ3_WORD_ID_SIZE) { if (client.stdy_size > SJ3_WORD_ID_SIZE) {
@ -200,7 +215,8 @@ sj3_open_with_list(
} }
if ((dicts_num > 0) && dicts) { if ((dicts_num > 0) && dicts) {
if (!(dict_idx = (long *)malloc(sizeof(long) * dicts_num * 2))) { if (!(dict_idx = (long *)malloc(sizeof(long) * dicts_num *
2))) {
return SJ3_CONNECT_ERROR; return SJ3_CONNECT_ERROR;
} }
memset(dict_idx, 0, sizeof(long) * dicts_num * 2); memset(dict_idx, 0, sizeof(long) * dicts_num * 2);
@ -208,9 +224,11 @@ sj3_open_with_list(
dicid_list = dict_idx; dicid_list = dict_idx;
err_id_num = 0; err_id_num = 0;
for (i = 0; i < dicts_num; i++) { for (i = 0; i < dicts_num; i++) {
dict_idx[i] = sj3_open_dictionary(&client, dicts[i], NULL); dict_idx[i] = sj3_open_dictionary(&client, dicts[i],
NULL);
if (dict_idx[i] == 0) { if (dict_idx[i] == 0) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
dict_idx[dicts_num + err_id_num] = i; dict_idx[dicts_num + err_id_num] = i;
err_id_num++; err_id_num++;
} else if (mdicid == 0) { } else if (mdicid == 0) {
@ -222,8 +240,10 @@ sj3_open_with_list(
err |= SJ3_CANNOT_OPEN_MDICT; err |= SJ3_CANNOT_OPEN_MDICT;
mdicid = 0; mdicid = 0;
} }
if (error_num) *error_num = err_id_num; if (error_num)
if (error_index) *error_index = (int *) &(dict_idx[dicts_num]); *error_num = err_id_num;
if (error_index)
*error_index = (int *)&(dict_idx[dicts_num]);
} }
strcpy(tmp, sj3_user_dir); strcpy(tmp, sj3_user_dir);
@ -232,14 +252,17 @@ sj3_open_with_list(
strcat(tmp, user); strcat(tmp, user);
strcat(tmp, path_delimiter); strcat(tmp, path_delimiter);
if (make_dirs(tmp) == ERROR) { if (make_dirs(tmp) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
return (err | SJ3_CANNOT_MAKE_UDIR); return (err | SJ3_CANNOT_MAKE_UDIR);
} }
for (p = tmp ; *p ; p++) ; for (p = tmp; *p; p++)
;
strcpy(p, UserDictionary); strcpy(p, UserDictionary);
if (sj3_access(&client, tmp, F_OK) == ERROR) { if (sj3_access(&client, tmp, F_OK) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
if (sj3_make_dict_file(&client, tmp, DefIdxLen, if (sj3_make_dict_file(&client, tmp, DefIdxLen,
DefSegLen, DefSegNum) == ERROR) { DefSegLen, DefSegNum) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) if (sj3_error_number == SJ3_ServerDown)
@ -250,13 +273,15 @@ sj3_open_with_list(
udicid = sj3_open_dictionary(&client, tmp, ""); udicid = sj3_open_dictionary(&client, tmp, "");
if (udicid == 0) { if (udicid == 0) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CANNOT_OPEN_UDICT; err |= SJ3_CANNOT_OPEN_UDICT;
} }
strcpy(p, StudyFile); strcpy(p, StudyFile);
if (sj3_access(&client, tmp, F_OK) == ERROR) { if (sj3_access(&client, tmp, F_OK) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
if (sj3_make_study_file(&client, tmp, DefStyNum, DefClStep, if (sj3_make_study_file(&client, tmp, DefStyNum, DefClStep,
DefClLen) == ERROR) { DefClLen) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) if (sj3_error_number == SJ3_ServerDown)
@ -265,7 +290,8 @@ sj3_open_with_list(
} }
} }
if (sj3_open_study_file(&client, tmp, "") == ERROR) { if (sj3_open_study_file(&client, tmp, "") == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CANNOT_OPEN_STUDY; err |= SJ3_CANNOT_OPEN_STUDY;
} }
@ -275,28 +301,32 @@ server_dead:
if (dict_idx) { if (dict_idx) {
free(dict_idx); free(dict_idx);
dict_idx = NULL; dict_idx = NULL;
if (error_num) *error_num = 0; if (error_num)
if (error_index) *error_index = NULL; *error_num = 0;
if (error_index)
*error_index = NULL;
} }
mdicid = udicid = 0; mdicid = udicid = 0;
return SJ3_SERVER_DEAD; return SJ3_SERVER_DEAD;
} }
int int
sj3_close(void) sj3_close(void)
{ {
int err = SJ3_NORMAL_END; int err = SJ3_NORMAL_END;
int i; int i;
if (client.fd == -1) return SJ3_NOT_CONNECTED; if (client.fd == -1)
return SJ3_NOT_CONNECTED;
if (mdicid == 0) if (mdicid == 0)
err |= SJ3_NOT_OPENED_MDICT; err |= SJ3_NOT_OPENED_MDICT;
else if (dicid_list) { else if (dicid_list) {
for (i = 0; i < dicid_num; i++) { for (i = 0; i < dicid_num; i++) {
if (sj3_close_dictionary(&client, dicid_list[i]) == ERROR) { if (sj3_close_dictionary(&client, dicid_list[i]) ==
if (sj3_error_number == SJ3_ServerDown) goto server_dead; ERROR) {
if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CLOSE_MDICT_ERROR; err |= SJ3_CLOSE_MDICT_ERROR;
} }
} }
@ -304,7 +334,8 @@ sj3_close(void)
dicid_list = NULL; dicid_list = NULL;
dicid_num = 0; dicid_num = 0;
} else if (sj3_close_dictionary(&client, mdicid) == ERROR) { } else if (sj3_close_dictionary(&client, mdicid) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CLOSE_MDICT_ERROR; err |= SJ3_CLOSE_MDICT_ERROR;
} }
mdicid = 0; mdicid = 0;
@ -312,7 +343,8 @@ sj3_close(void)
if (udicid == 0) if (udicid == 0)
err |= SJ3_NOT_OPENED_UDICT; err |= SJ3_NOT_OPENED_UDICT;
else if (sj3_close_dictionary(&client, udicid) == ERROR) { else if (sj3_close_dictionary(&client, udicid) == ERROR) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_CLOSE_UDICT_ERROR; err |= SJ3_CLOSE_UDICT_ERROR;
} }
udicid = 0; udicid = 0;
@ -323,15 +355,18 @@ sj3_close(void)
goto server_dead; goto server_dead;
case SJ3_StdyFileNotOpened: case SJ3_StdyFileNotOpened:
err |= SJ3_NOT_OPENED_STUDY; break; err |= SJ3_NOT_OPENED_STUDY;
break;
default: default:
err |= SJ3_CLOSE_STUDY_ERROR; break; err |= SJ3_CLOSE_STUDY_ERROR;
break;
} }
} }
if (sj3_erase_connection(&client)) { if (sj3_erase_connection(&client)) {
if (sj3_error_number == SJ3_ServerDown) goto server_dead; if (sj3_error_number == SJ3_ServerDown)
goto server_dead;
err |= SJ3_DISCONNECT_ERROR; err |= SJ3_DISCONNECT_ERROR;
} }
@ -347,7 +382,6 @@ server_dead:
return SJ3_SERVER_DEAD; return SJ3_SERVER_DEAD;
} }
int int
sj3_getkan(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz) sj3_getkan(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz)
{ {
@ -356,10 +390,12 @@ sj3_getkan(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
int len; int len;
int stysiz = client.stdy_size; int stysiz = client.stdy_size;
if ((len = strlen(yomi)) > SJ3_IKKATU_YOMI) return 0; if ((len = strlen(yomi)) > SJ3_IKKATU_YOMI)
return 0;
while (*yomi) { while (*yomi) {
len = sj3_ikkatu_henkan(&client, yomi, knj, knjsiz, MBCODE_SJIS); len = sj3_ikkatu_henkan(&client, yomi, knj, knjsiz,
MBCODE_SJIS);
if (len == ERROR) { if (len == ERROR) {
if (client.fd < 0) { if (client.fd < 0) {
mdicid = udicid = 0; mdicid = udicid = 0;
@ -367,8 +403,7 @@ sj3_getkan(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
} }
return 0; return 0;
} } else if (len == 0)
else if (len == 0)
break; break;
src = knj; src = knj;
@ -379,7 +414,8 @@ sj3_getkan(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
bun->destlen = strlen(src); bun->destlen = strlen(src);
bun->srcstr = yomi; bun->srcstr = yomi;
bun->deststr = knj; bun->deststr = knj;
while (*src) *knj++ = *src++; while (*src)
*knj++ = *src++;
knjsiz -= bun->destlen; knjsiz -= bun->destlen;
src++; src++;
yomi += bun->srclen; yomi += bun->srclen;
@ -401,7 +437,6 @@ sj3_getkan(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
return buncnt; return buncnt;
} }
int int
sj3_getkan_euc(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz) sj3_getkan_euc(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz)
{ {
@ -413,11 +448,14 @@ sj3_getkan_euc(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
int knjorg = knjsiz; int knjorg = knjsiz;
SJ3_BUNSETU *hbun = bun; SJ3_BUNSETU *hbun = bun;
if ((len = strlen(yomi)) > SJ3_IKKATU_YOMI) return 0; if ((len = strlen(yomi)) > SJ3_IKKATU_YOMI)
return 0;
if (client.svr_version == 1) { if (client.svr_version == 1) {
defuse = 0; defuse = 0;
len = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse); len = sj3_str_euctosjis(buf1, sizeof(buf1), yomi,
if ((len < 0) || defuse) return 0; client.default_char, &defuse);
if ((len < 0) || defuse)
return 0;
yp = buf1; yp = buf1;
if (knjsiz > sizeof(kbuf)) { if (knjsiz > sizeof(kbuf)) {
mflag = 1; mflag = 1;
@ -441,8 +479,7 @@ sj3_getkan_euc(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
} }
return 0; return 0;
} } else if (len == 0)
else if (len == 0)
break; break;
src = kp; src = kp;
@ -453,7 +490,8 @@ sj3_getkan_euc(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
bun->destlen = strlen(src); bun->destlen = strlen(src);
bun->srcstr = yp; bun->srcstr = yp;
bun->deststr = kp; bun->deststr = kp;
while (*src) *kp++ = *src++; while (*src)
*kp++ = *src++;
knjsiz -= bun->destlen; knjsiz -= bun->destlen;
src++; src++;
yp += bun->srclen; yp += bun->srclen;
@ -477,15 +515,18 @@ sj3_getkan_euc(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
yp = buf1; yp = buf1;
bun = hbun; bun = hbun;
defuse = 0; defuse = 0;
len = sj3_str_sjistoeuc(knj, knjorg, kp, client.default_char, &defuse); len = sj3_str_sjistoeuc(knj, knjorg, kp, client.default_char,
if ((len < 0) || defuse) return 0; &defuse);
if ((len < 0) || defuse)
return 0;
for (i = 0; i < buncnt; i++) { for (i = 0; i < buncnt; i++) {
sentou = sj3_sjistoeuclen(yp, bun[i].srcstr - yp); sentou = sj3_sjistoeuclen(yp, bun[i].srcstr - yp);
saigo = sj3_sjistoeuclen(bun[i].srcstr, bun[i].srclen); saigo = sj3_sjistoeuclen(bun[i].srcstr, bun[i].srclen);
bun[i].srclen = saigo; bun[i].srclen = saigo;
bun[i].srcstr = yomi + sentou; bun[i].srcstr = yomi + sentou;
sentou = sj3_sjistoeuclen(kp, bun[i].deststr - kp); sentou = sj3_sjistoeuclen(kp, bun[i].deststr - kp);
saigo = sj3_sjistoeuclen(bun[i].deststr, bun[i].destlen); saigo = sj3_sjistoeuclen(bun[i].deststr,
bun[i].destlen);
bun[i].destlen = saigo; bun[i].destlen = saigo;
bun[i].deststr = knj + sentou; bun[i].deststr = knj + sentou;
} }
@ -498,7 +539,6 @@ sj3_getkan_euc(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
return buncnt; return buncnt;
} }
int int
sj3_getkan_mb(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz) sj3_getkan_mb(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz)
{ {
@ -510,13 +550,13 @@ sj3_getkan_mb(u_char* yomi, SJ3_BUNSETU* bun, u_char* knj, int knjsiz)
return sj3_getkan(yomi, bun, knj, knjsiz); return sj3_getkan(yomi, bun, knj, knjsiz);
} }
int int
sj3_douoncnt(u_char *yomi) sj3_douoncnt(u_char *yomi)
{ {
int i; int i;
if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0; if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI)
return 0;
i = sj3_bunsetu_kouhosuu(&client, yomi, i, MBCODE_SJIS); i = sj3_bunsetu_kouhosuu(&client, yomi, i, MBCODE_SJIS);
if (i == ERROR) { if (i == ERROR) {
@ -531,19 +571,21 @@ sj3_douoncnt(u_char* yomi)
return i; return i;
} }
int int
sj3_douoncnt_euc(u_char *yomi) sj3_douoncnt_euc(u_char *yomi)
{ {
int i, l, flag; int i, l, flag;
u_char *yp; u_char *yp;
if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0; if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI)
return 0;
if (client.svr_version == 1) { if (client.svr_version == 1) {
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse); l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi,
if ((l < 0) || defuse) return 0; client.default_char, &defuse);
if ((l < 0) || defuse)
return 0;
yp = buf1; yp = buf1;
flag = MBCODE_SJIS; flag = MBCODE_SJIS;
} else { } else {
@ -563,7 +605,6 @@ sj3_douoncnt_euc(u_char* yomi)
return i; return i;
} }
int int
sj3_douoncnt_mb(u_char *yomi) sj3_douoncnt_mb(u_char *yomi)
{ {
@ -575,13 +616,13 @@ sj3_douoncnt_mb(u_char* yomi)
return sj3_douoncnt(yomi); return sj3_douoncnt(yomi);
} }
int int
sj3_getdouon(u_char *yomi, SJ3_DOUON *dou) sj3_getdouon(u_char *yomi, SJ3_DOUON *dou)
{ {
int i; int i;
if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0; if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI)
return 0;
i = sj3_bunsetu_zenkouho(&client, yomi, i, dou, MBCODE_SJIS); i = sj3_bunsetu_zenkouho(&client, yomi, i, dou, MBCODE_SJIS);
if (i == ERROR) { if (i == ERROR) {
@ -595,18 +636,20 @@ sj3_getdouon(u_char* yomi, SJ3_DOUON* dou)
return i; return i;
} }
int int
sj3_getdouon_euc(u_char *yomi, SJ3_DOUON *dou) sj3_getdouon_euc(u_char *yomi, SJ3_DOUON *dou)
{ {
int i, j, l; int i, j, l;
if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI) return 0; if ((i = strlen(yomi)) > SJ3_BUNSETU_YOMI)
return 0;
if (client.svr_version == 1) { if (client.svr_version == 1) {
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse); l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi,
if ((l < 0) || defuse) return 0; client.default_char, &defuse);
if ((l < 0) || defuse)
return 0;
i = sj3_bunsetu_zenkouho(&client, buf1, i, dou, MBCODE_SJIS); i = sj3_bunsetu_zenkouho(&client, buf1, i, dou, MBCODE_SJIS);
if (i == ERROR) { if (i == ERROR) {
if (client.fd < 0) { if (client.fd < 0) {
@ -619,7 +662,8 @@ sj3_getdouon_euc(u_char* yomi, SJ3_DOUON* dou)
defuse = 0; defuse = 0;
l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf),
dou[j].ddata, client.default_char, &defuse); dou[j].ddata, client.default_char, &defuse);
if ((l < 0) || defuse) return 0; if ((l < 0) || defuse)
return 0;
(void)memcpy(dou[j].ddata, kbuf, l + 1); (void)memcpy(dou[j].ddata, kbuf, l + 1);
dou[j].dlen = l; dou[j].dlen = l;
} }
@ -636,7 +680,6 @@ sj3_getdouon_euc(u_char* yomi, SJ3_DOUON* dou)
return i; return i;
} }
int int
sj3_getdouon_mb(u_char *yomi, SJ3_DOUON *dou) sj3_getdouon_mb(u_char *yomi, SJ3_DOUON *dou)
{ {
@ -648,7 +691,6 @@ sj3_getdouon_mb(u_char* yomi, SJ3_DOUON* dou)
return sj3_getdouon(yomi, dou); return sj3_getdouon(yomi, dou);
} }
int int
sj3_gakusyuu(SJ3_STUDYREC *dcid) sj3_gakusyuu(SJ3_STUDYREC *dcid)
{ {
@ -662,11 +704,11 @@ sj3_gakusyuu(SJ3_STUDYREC* dcid)
return 0; return 0;
} }
int int
sj3_gakusyuu2(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid) sj3_gakusyuu2(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid)
{ {
if (sj3_bunsetu_gakusyuu(&client, yomi1, yomi2, dcid, MBCODE_SJIS) == ERROR) { if (sj3_bunsetu_gakusyuu(&client, yomi1, yomi2, dcid, MBCODE_SJIS) ==
ERROR) {
if (client.fd < 0) { if (client.fd < 0) {
mdicid = udicid = 0; mdicid = udicid = 0;
return -1; return -1;
@ -676,7 +718,6 @@ sj3_gakusyuu2(u_char* yomi1, u_char* yomi2, SJ3_STUDYREC* dcid)
return 0; return 0;
} }
int int
sj3_gakusyuu2_euc(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid) sj3_gakusyuu2_euc(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid)
{ {
@ -685,11 +726,15 @@ sj3_gakusyuu2_euc(u_char* yomi1, u_char* yomi2, SJ3_STUDYREC* dcid)
if (client.svr_version == 1) { if (client.svr_version == 1) {
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi1, client.default_char, &defuse); l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi1,
if ((l < 0) || defuse) return 1; client.default_char, &defuse);
if ((l < 0) || defuse)
return 1;
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(buf2, sizeof(buf2), yomi2, client.default_char, &defuse); l = sj3_str_euctosjis(buf2, sizeof(buf2), yomi2,
if ((l < 0) || defuse) return 1; client.default_char, &defuse);
if ((l < 0) || defuse)
return 1;
y1p = buf1; y1p = buf1;
y2p = buf2; y2p = buf2;
flag = MBCODE_SJIS; flag = MBCODE_SJIS;
@ -708,7 +753,6 @@ sj3_gakusyuu2_euc(u_char* yomi1, u_char* yomi2, SJ3_STUDYREC* dcid)
return 0; return 0;
} }
int int
sj3_gakusyuu2_mb(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid) sj3_gakusyuu2_mb(u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *dcid)
{ {
@ -720,47 +764,61 @@ sj3_gakusyuu2_mb(u_char* yomi1, u_char* yomi2, SJ3_STUDYREC* dcid)
return sj3_gakusyuu2(yomi1, yomi2, dcid); return sj3_gakusyuu2(yomi1, yomi2, dcid);
} }
int int
sj3_touroku(u_char *yomi, u_char *kanji, int code) sj3_touroku(u_char *yomi, u_char *kanji, int code)
{ {
if (sj3_tango_touroku(&client, udicid, yomi, kanji, code, MBCODE_SJIS)) { if (sj3_tango_touroku(&client, udicid, yomi, kanji, code,
MBCODE_SJIS)) {
if (client.fd < 0) { if (client.fd < 0) {
mdicid = udicid = 0; mdicid = udicid = 0;
return -1; return -1;
} }
switch (sj3_error_number) { switch (sj3_error_number) {
case SJ3_NoSuchDict: case SJ3_NoSuchDict:
case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR; case SJ3_ReadOnlyDict:
case SJ3_DictLocked: return SJ3_DICT_LOCKED; return SJ3_DICT_ERROR;
case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR; case SJ3_DictLocked:
case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR; return SJ3_DICT_LOCKED;
case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE; case SJ3_BadYomiString:
case SJ3_AlreadyExistWord: return SJ3_WORD_EXIST; return SJ3_BAD_YOMI_STR;
case SJ3_NoMoreDouonWord: return SJ3_DOUON_FULL; case SJ3_BadKanjiString:
case SJ3_NoMoreUserDict: return SJ3_DICT_FULL; return SJ3_BAD_KANJI_STR;
case SJ3_NoMoreIndexBlock: return SJ3_INDEX_FULL; case SJ3_BadHinsiCode:
default: return SJ3_TOUROKU_FAILED; return SJ3_BAD_HINSI_CODE;
case SJ3_AlreadyExistWord:
return SJ3_WORD_EXIST;
case SJ3_NoMoreDouonWord:
return SJ3_DOUON_FULL;
case SJ3_NoMoreUserDict:
return SJ3_DICT_FULL;
case SJ3_NoMoreIndexBlock:
return SJ3_INDEX_FULL;
default:
return SJ3_TOUROKU_FAILED;
} }
} }
return 0; return 0;
} }
int int
sj3_touroku_euc(u_char *yomi, u_char *kanji, int code) sj3_touroku_euc(u_char *yomi, u_char *kanji, int code)
{ {
int l, flag; int l, flag;
u_char *yp; u_char *yp;
u_char *kp; u_char *kp;
if (client.svr_version == 1) { if (client.svr_version == 1) {
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse); l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi,
if ((l < 0) || defuse) return SJ3_BAD_YOMI_STR; client.default_char, &defuse);
if ((l < 0) || defuse)
return SJ3_BAD_YOMI_STR;
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(kbuf, sizeof(kbuf), kanji, client.default_char, &defuse); l = sj3_str_euctosjis(kbuf, sizeof(kbuf), kanji,
if ((l < 0) || defuse) return SJ3_BAD_KANJI_STR; client.default_char, &defuse);
if ((l < 0) || defuse)
return SJ3_BAD_KANJI_STR;
yp = buf1; yp = buf1;
kp = kbuf; kp = kbuf;
flag = MBCODE_SJIS; flag = MBCODE_SJIS;
@ -776,23 +834,32 @@ sj3_touroku_euc(u_char* yomi, u_char* kanji, int code)
} }
switch (sj3_error_number) { switch (sj3_error_number) {
case SJ3_NoSuchDict: case SJ3_NoSuchDict:
case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR; case SJ3_ReadOnlyDict:
case SJ3_DictLocked: return SJ3_DICT_LOCKED; return SJ3_DICT_ERROR;
case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR; case SJ3_DictLocked:
case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR; return SJ3_DICT_LOCKED;
case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE; case SJ3_BadYomiString:
case SJ3_AlreadyExistWord: return SJ3_WORD_EXIST; return SJ3_BAD_YOMI_STR;
case SJ3_NoMoreDouonWord: return SJ3_DOUON_FULL; case SJ3_BadKanjiString:
case SJ3_NoMoreUserDict: return SJ3_DICT_FULL; return SJ3_BAD_KANJI_STR;
case SJ3_NoMoreIndexBlock: return SJ3_INDEX_FULL; case SJ3_BadHinsiCode:
default: return SJ3_TOUROKU_FAILED; return SJ3_BAD_HINSI_CODE;
case SJ3_AlreadyExistWord:
return SJ3_WORD_EXIST;
case SJ3_NoMoreDouonWord:
return SJ3_DOUON_FULL;
case SJ3_NoMoreUserDict:
return SJ3_DICT_FULL;
case SJ3_NoMoreIndexBlock:
return SJ3_INDEX_FULL;
default:
return SJ3_TOUROKU_FAILED;
} }
} }
return 0; return 0;
} }
int int
sj3_touroku_mb(u_char *yomi, u_char *kanji, int code) sj3_touroku_mb(u_char *yomi, u_char *kanji, int code)
{ {
@ -804,7 +871,6 @@ sj3_touroku_mb(u_char* yomi, u_char* kanji, int code)
return sj3_touroku(yomi, kanji, code); return sj3_touroku(yomi, kanji, code);
} }
int int
sj3_syoukyo(u_char *yomi, u_char *kanji, int code) sj3_syoukyo(u_char *yomi, u_char *kanji, int code)
{ {
@ -815,32 +881,43 @@ sj3_syoukyo(u_char* yomi, u_char* kanji, int code)
} }
switch (sj3_error_number) { switch (sj3_error_number) {
case SJ3_NoSuchDict: case SJ3_NoSuchDict:
case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR; case SJ3_ReadOnlyDict:
case SJ3_DictLocked: return SJ3_DICT_LOCKED; return SJ3_DICT_ERROR;
case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR; case SJ3_DictLocked:
case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR; return SJ3_DICT_LOCKED;
case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE; case SJ3_BadYomiString:
case SJ3_NoSuchWord: return SJ3_WORD_NOT_EXIST; return SJ3_BAD_YOMI_STR;
default: return SJ3_SYOUKYO_FAILED; case SJ3_BadKanjiString:
return SJ3_BAD_KANJI_STR;
case SJ3_BadHinsiCode:
return SJ3_BAD_HINSI_CODE;
case SJ3_NoSuchWord:
return SJ3_WORD_NOT_EXIST;
default:
return SJ3_SYOUKYO_FAILED;
} }
} }
return 0; return 0;
} }
int int
sj3_syoukyo_euc(u_char *yomi, u_char *kanji, int code) sj3_syoukyo_euc(u_char *yomi, u_char *kanji, int code)
{ {
int l, flag; int l, flag;
u_char *yp; u_char *yp;
u_char *kp; u_char *kp;
if (client.svr_version == 1) { if (client.svr_version == 1) {
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi, client.default_char, &defuse); l = sj3_str_euctosjis(buf1, sizeof(buf1), yomi,
if ((l < 0) || defuse) return SJ3_BAD_YOMI_STR; client.default_char, &defuse);
if ((l < 0) || defuse)
return SJ3_BAD_YOMI_STR;
defuse = 0; defuse = 0;
l = sj3_str_euctosjis(kbuf, sizeof(kbuf), kanji, client.default_char, &defuse); l = sj3_str_euctosjis(kbuf, sizeof(kbuf), kanji,
if ((l < 0) || defuse) return SJ3_BAD_KANJI_STR; client.default_char, &defuse);
if ((l < 0) || defuse)
return SJ3_BAD_KANJI_STR;
yp = buf1; yp = buf1;
kp = kbuf; kp = kbuf;
flag = MBCODE_SJIS; flag = MBCODE_SJIS;
@ -856,19 +933,25 @@ sj3_syoukyo_euc(u_char* yomi, u_char* kanji, int code)
} }
switch (sj3_error_number) { switch (sj3_error_number) {
case SJ3_NoSuchDict: case SJ3_NoSuchDict:
case SJ3_ReadOnlyDict: return SJ3_DICT_ERROR; case SJ3_ReadOnlyDict:
case SJ3_DictLocked: return SJ3_DICT_LOCKED; return SJ3_DICT_ERROR;
case SJ3_BadYomiString: return SJ3_BAD_YOMI_STR; case SJ3_DictLocked:
case SJ3_BadKanjiString: return SJ3_BAD_KANJI_STR; return SJ3_DICT_LOCKED;
case SJ3_BadHinsiCode: return SJ3_BAD_HINSI_CODE; case SJ3_BadYomiString:
case SJ3_NoSuchWord: return SJ3_WORD_NOT_EXIST; return SJ3_BAD_YOMI_STR;
default: return SJ3_SYOUKYO_FAILED; case SJ3_BadKanjiString:
return SJ3_BAD_KANJI_STR;
case SJ3_BadHinsiCode:
return SJ3_BAD_HINSI_CODE;
case SJ3_NoSuchWord:
return SJ3_WORD_NOT_EXIST;
default:
return SJ3_SYOUKYO_FAILED;
} }
} }
return 0; return 0;
} }
int int
sj3_syoukyo_mb(u_char *yomi, u_char *kanji, int code) sj3_syoukyo_mb(u_char *yomi, u_char *kanji, int code)
{ {
@ -880,7 +963,6 @@ sj3_syoukyo_mb(u_char* yomi, u_char* kanji, int code)
return sj3_syoukyo(yomi, kanji, code); return sj3_syoukyo(yomi, kanji, code);
} }
int int
sj3_getdict(u_char *buf) sj3_getdict(u_char *buf)
{ {
@ -894,7 +976,6 @@ sj3_getdict(u_char* buf)
return 0; return 0;
} }
int int
sj3_getdict_euc(u_char *buf) sj3_getdict_euc(u_char *buf)
{ {
@ -910,12 +991,15 @@ sj3_getdict_euc(u_char* buf)
} }
defuse = 0; defuse = 0;
slen = strlen(buf) + 1; slen = strlen(buf) + 1;
l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf, client.default_char, &defuse); l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf,
if ((l < 0) || defuse) return 1;
l++;
ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l, &(buf[slen]),
client.default_char, &defuse); client.default_char, &defuse);
if ((ll < 0) || defuse) return 1; if ((l < 0) || defuse)
return 1;
l++;
ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l,
&(buf[slen]), client.default_char, &defuse);
if ((ll < 0) || defuse)
return 1;
ll++; ll++;
slen += strlen(&(buf[slen])) + 1; slen += strlen(&(buf[slen])) + 1;
l = l + ll; l = l + ll;
@ -934,7 +1018,6 @@ sj3_getdict_euc(u_char* buf)
return 0; return 0;
} }
int int
sj3_getdict_mb(u_char *buf) sj3_getdict_mb(u_char *buf)
{ {
@ -959,7 +1042,6 @@ sj3_nextdict(u_char* buf)
return 0; return 0;
} }
int int
sj3_nextdict_euc(u_char *buf) sj3_nextdict_euc(u_char *buf)
{ {
@ -975,12 +1057,15 @@ sj3_nextdict_euc(u_char* buf)
} }
defuse = 0; defuse = 0;
slen = strlen(buf) + 1; slen = strlen(buf) + 1;
l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf, client.default_char, &defuse); l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf,
if ((l < 0) || defuse) return 1;
l++;
ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l, &(buf[slen]),
client.default_char, &defuse); client.default_char, &defuse);
if ((ll < 0) || defuse) return 1; if ((l < 0) || defuse)
return 1;
l++;
ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l,
&(buf[slen]), client.default_char, &defuse);
if ((ll < 0) || defuse)
return 1;
ll++; ll++;
slen += strlen(&(buf[slen])) + 1; slen += strlen(&(buf[slen])) + 1;
l = l + ll; l = l + ll;
@ -999,7 +1084,6 @@ sj3_nextdict_euc(u_char* buf)
return 0; return 0;
} }
int int
sj3_nextdict_mb(u_char *buf) sj3_nextdict_mb(u_char *buf)
{ {
@ -1024,7 +1108,6 @@ sj3_prevdict(u_char* buf)
return 0; return 0;
} }
int int
sj3_prevdict_euc(u_char *buf) sj3_prevdict_euc(u_char *buf)
{ {
@ -1040,12 +1123,15 @@ sj3_prevdict_euc(u_char* buf)
} }
defuse = 0; defuse = 0;
slen = strlen(buf) + 1; slen = strlen(buf) + 1;
l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf, client.default_char, &defuse); l = sj3_str_sjistoeuc(kbuf, sizeof(kbuf), buf,
if ((l < 0) || defuse) return 1;
l++;
ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l, &(buf[slen]),
client.default_char, &defuse); client.default_char, &defuse);
if ((ll < 0) || defuse) return 1; if ((l < 0) || defuse)
return 1;
l++;
ll = sj3_str_sjistoeuc(&(kbuf[l]), sizeof(kbuf) - l,
&(buf[slen]), client.default_char, &defuse);
if ((ll < 0) || defuse)
return 1;
ll++; ll++;
slen += strlen(&(buf[slen])) + 1; slen += strlen(&(buf[slen])) + 1;
l = l + ll; l = l + ll;
@ -1064,7 +1150,6 @@ sj3_prevdict_euc(u_char* buf)
return 0; return 0;
} }
int int
sj3_prevdict_mb(u_char *buf) sj3_prevdict_mb(u_char *buf)
{ {
@ -1089,7 +1174,6 @@ sj3_lockserv(void)
return 0; return 0;
} }
int int
sj3_unlockserv(void) sj3_unlockserv(void)
{ {

View file

@ -28,7 +28,6 @@
* from Sony Corporation. * from Sony Corporation.
*/ */
#ifndef _SJ3LIB_H_ #ifndef _SJ3LIB_H_
#define _SJ3LIB_H_ 1 #define _SJ3LIB_H_ 1
@ -37,8 +36,6 @@
#define SJ3_NORMAL_END 0 #define SJ3_NORMAL_END 0
#define SJ3_SERVER_DEAD (1 << 0) #define SJ3_SERVER_DEAD (1 << 0)
#define SJ3_CONNECT_ERROR (1 << 1) #define SJ3_CONNECT_ERROR (1 << 1)
#define SJ3_ALREADY_CONNECTED (1 << 2) #define SJ3_ALREADY_CONNECTED (1 << 2)
#define SJ3_CANNOT_OPEN_MDICT (1 << 3) #define SJ3_CANNOT_OPEN_MDICT (1 << 3)
@ -48,8 +45,6 @@
#define SJ3_CANNOT_MAKE_UDICT (1 << 7) #define SJ3_CANNOT_MAKE_UDICT (1 << 7)
#define SJ3_CANNOT_MAKE_STUDY (1 << 8) #define SJ3_CANNOT_MAKE_STUDY (1 << 8)
#define SJ3_DISCONNECT_ERROR (1 << 1) #define SJ3_DISCONNECT_ERROR (1 << 1)
#define SJ3_NOT_CONNECTED (1 << 2) #define SJ3_NOT_CONNECTED (1 << 2)
#define SJ3_NOT_OPENED_MDICT (1 << 3) #define SJ3_NOT_OPENED_MDICT (1 << 3)
@ -59,8 +54,6 @@
#define SJ3_CLOSE_UDICT_ERROR (1 << 7) #define SJ3_CLOSE_UDICT_ERROR (1 << 7)
#define SJ3_CLOSE_STUDY_ERROR (1 << 8) #define SJ3_CLOSE_STUDY_ERROR (1 << 8)
#define SJ3_DICT_ERROR 1 #define SJ3_DICT_ERROR 1
#define SJ3_DICT_LOCKED 2 #define SJ3_DICT_LOCKED 2
#define SJ3_BAD_YOMI_STR 3 #define SJ3_BAD_YOMI_STR 3
@ -76,20 +69,11 @@
#define SJ3_WORD_NOT_EXIST 6 #define SJ3_WORD_NOT_EXIST 6
#define SJ3_SYOUKYO_FAILED 10 #define SJ3_SYOUKYO_FAILED 10
#define SJ3_IKKATU_YOMI 512 #define SJ3_IKKATU_YOMI 512
#define SJ3_BUNSETU_YOMI 128 #define SJ3_BUNSETU_YOMI 128
#define SJ3_BUNSETU_KANJI 512 #define SJ3_BUNSETU_KANJI 512
#ifndef SJ3_WORD_ID_SIZE #ifndef SJ3_WORD_ID_SIZE
# define SJ3_WORD_ID_SIZE 32 # define SJ3_WORD_ID_SIZE 32
#endif #endif
@ -98,9 +82,6 @@ typedef struct studyrec {
unsigned char dummy[SJ3_WORD_ID_SIZE]; unsigned char dummy[SJ3_WORD_ID_SIZE];
} SJ3_STUDYREC; } SJ3_STUDYREC;
typedef struct bunsetu { typedef struct bunsetu {
int srclen; int srclen;
int destlen; int destlen;
@ -109,16 +90,12 @@ typedef struct bunsetu {
struct studyrec dcid; struct studyrec dcid;
} SJ3_BUNSETU; } SJ3_BUNSETU;
typedef struct douon { typedef struct douon {
unsigned char ddata[SJ3_BUNSETU_KANJI]; unsigned char ddata[SJ3_BUNSETU_KANJI];
int dlen; int dlen;
SJ3_STUDYREC dcid; SJ3_STUDYREC dcid;
} SJ3_DOUON; } SJ3_DOUON;
#define SJ3_H_NRMNOUN 1 #define SJ3_H_NRMNOUN 1
#define SJ3_H_PRONOUN 12 #define SJ3_H_PRONOUN 12
#define SJ3_H_LNAME 21 #define SJ3_H_LNAME 21
@ -148,13 +125,6 @@ typedef struct douon {
#define SJ3_H_WAVERB 99 #define SJ3_H_WAVERB 99
#define SJ3_H_SINGLE 189 #define SJ3_H_SINGLE 189
/* moved from include/sj3lowlib.h for function prototypes.
* $SonyRCSfile: sj3lowlib.h,v $
* $SonyRevision: 1.1 $
* $SonyDate: 1994/06/03 08:00:59 $
*/
typedef struct sj3_client_env { typedef struct sj3_client_env {
int fd; int fd;
int serv_dead_flg; int serv_dead_flg;
@ -174,36 +144,51 @@ typedef struct sj3_who_struct {
char progname[SJ3_NAME_LENGTH]; char progname[SJ3_NAME_LENGTH];
} SJ3_WHO_STRUCT; } SJ3_WHO_STRUCT;
#define MBCODE_SJIS 1 #define MBCODE_SJIS 1
#define MBCODE_EUC 2 #define MBCODE_EUC 2
/* level1.c */ /* level1.c */
void sj3_set_timeout(int timeout); void sj3_set_timeout(int timeout);
int sj3_make_connection(SJ3_CLIENT_ENV *client, char *serv, char *user, char *prog); int sj3_make_connection(SJ3_CLIENT_ENV *client, char *serv, char *user,
char *prog);
int sj3_erase_connection(SJ3_CLIENT_ENV *client); int sj3_erase_connection(SJ3_CLIENT_ENV *client);
long sj3_open_dictionary(SJ3_CLIENT_ENV *client, char *dictname, char *password); long sj3_open_dictionary(SJ3_CLIENT_ENV *client, char *dictname,
char *password);
int sj3_close_dictionary(SJ3_CLIENT_ENV *client, long dicid); int sj3_close_dictionary(SJ3_CLIENT_ENV *client, long dicid);
int sj3_open_study_file(SJ3_CLIENT_ENV *client, char *stdyname, char *password); int sj3_open_study_file(SJ3_CLIENT_ENV *client, char *stdyname, char *password);
int sj3_close_study_file(SJ3_CLIENT_ENV *client); int sj3_close_study_file(SJ3_CLIENT_ENV *client);
int sj3_get_id_size(SJ3_CLIENT_ENV *client); int sj3_get_id_size(SJ3_CLIENT_ENV *client);
int sj3_lock_server(SJ3_CLIENT_ENV *client); int sj3_lock_server(SJ3_CLIENT_ENV *client);
int sj3_unlock_server(SJ3_CLIENT_ENV *client); int sj3_unlock_server(SJ3_CLIENT_ENV *client);
int sj3_ikkatu_henkan(SJ3_CLIENT_ENV *client, u_char *src, u_char *dst, int dstsiz, int mb_flag); int sj3_ikkatu_henkan(SJ3_CLIENT_ENV *client, u_char *src, u_char *dst,
int sj3_bunsetu_henkan(SJ3_CLIENT_ENV *client, u_char *yomi, int len, u_char *kanji, int mb_flag); int dstsiz, int mb_flag);
int sj3_bunsetu_jikouho(SJ3_CLIENT_ENV *client, u_char *kanji, int mode, int mb_flag); int sj3_bunsetu_henkan(SJ3_CLIENT_ENV *client, u_char *yomi, int len,
int sj3_bunsetu_maekouho(SJ3_CLIENT_ENV *client, u_char *kanji, int mode, int mb_flag); u_char *kanji, int mb_flag);
int sj3_bunsetu_kouhosuu(SJ3_CLIENT_ENV *client, u_char *yomi, int len, int mb_flag); int sj3_bunsetu_jikouho(SJ3_CLIENT_ENV *client, u_char *kanji, int mode,
int sj3_bunsetu_zenkouho(SJ3_CLIENT_ENV *client, u_char *yomi, int len, SJ3_DOUON *douon, int mb_flag); int mb_flag);
int sj3_bunsetu_maekouho(SJ3_CLIENT_ENV *client, u_char *kanji, int mode,
int mb_flag);
int sj3_bunsetu_kouhosuu(SJ3_CLIENT_ENV *client, u_char *yomi, int len,
int mb_flag);
int sj3_bunsetu_zenkouho(SJ3_CLIENT_ENV *client, u_char *yomi, int len,
SJ3_DOUON *douon, int mb_flag);
int sj3_tango_gakusyuu(SJ3_CLIENT_ENV *client, SJ3_STUDYREC *stdy); int sj3_tango_gakusyuu(SJ3_CLIENT_ENV *client, SJ3_STUDYREC *stdy);
int sj3_bunsetu_gakusyuu(SJ3_CLIENT_ENV *client, u_char *yomi1, u_char *yomi2, SJ3_STUDYREC *stdy, int mb_flag); int sj3_bunsetu_gakusyuu(SJ3_CLIENT_ENV *client, u_char *yomi1, u_char *yomi2,
int sj3_tango_touroku(SJ3_CLIENT_ENV *client, long dicid, u_char *yomi, u_char *kanji, int code, int mb_flag); SJ3_STUDYREC *stdy, int mb_flag);
int sj3_tango_sakujo(SJ3_CLIENT_ENV *client, long dicid, u_char *yomi, u_char *kanji, int code, int mb_flag); int sj3_tango_touroku(SJ3_CLIENT_ENV *client, long dicid, u_char *yomi,
int sj3_tango_syutoku(SJ3_CLIENT_ENV *client, int dicid, u_char *buf, int mb_flag); u_char *kanji, int code, int mb_flag);
int sj3_tango_jikouho(SJ3_CLIENT_ENV *client, int dicid, u_char *buf, int mb_flag); int sj3_tango_sakujo(SJ3_CLIENT_ENV *client, long dicid, u_char *yomi,
int sj3_tango_maekouho(SJ3_CLIENT_ENV *client, int dicid, u_char *buf, int mb_flag); u_char *kanji, int code, int mb_flag);
int sj3_make_dict_file(SJ3_CLIENT_ENV *client, char *path, int idxlen, int seglen, int segnum); int sj3_tango_syutoku(SJ3_CLIENT_ENV *client, int dicid, u_char *buf,
int sj3_make_study_file(SJ3_CLIENT_ENV *client, char *path, int stynum, int clstep, int cllen); int mb_flag);
int sj3_tango_jikouho(SJ3_CLIENT_ENV *client, int dicid, u_char *buf,
int mb_flag);
int sj3_tango_maekouho(SJ3_CLIENT_ENV *client, int dicid, u_char *buf,
int mb_flag);
int sj3_make_dict_file(SJ3_CLIENT_ENV *client, char *path, int idxlen,
int seglen, int segnum);
int sj3_make_study_file(SJ3_CLIENT_ENV *client, char *path, int stynum,
int clstep, int cllen);
int sj3_make_directory(SJ3_CLIENT_ENV *client, char *path); int sj3_make_directory(SJ3_CLIENT_ENV *client, char *path);
int sj3_access(SJ3_CLIENT_ENV *client, char *path, int mode); int sj3_access(SJ3_CLIENT_ENV *client, char *path, int mode);
int sj3_who(SJ3_CLIENT_ENV *client, SJ3_WHO_STRUCT *ret, int num); int sj3_who(SJ3_CLIENT_ENV *client, SJ3_WHO_STRUCT *ret, int num);
@ -213,7 +198,8 @@ int sj3_version(SJ3_CLIENT_ENV *client, char *dst, int dstsiz);
/* sj.c */ /* sj.c */
int sj3_open(char *host, char *user); int sj3_open(char *host, char *user);
int sj3_open_with_list(char *host, char *user, int dicts_num, char **dicts, int *error_num, int **error_index); int sj3_open_with_list(char *host, char *user, int dicts_num, char **dicts,
int *error_num, int **error_index);
int sj3_close(void); int sj3_close(void);
int sj3_getkan(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz); int sj3_getkan(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz);
int sj3_getkan_euc(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz); int sj3_getkan_euc(u_char *yomi, SJ3_BUNSETU *bun, u_char *knj, int knjsiz);

View file

@ -51,7 +51,8 @@
#define iskana(c) ((0xa1 <= (c)) && ((c) <= 0xdf)) #define iskana(c) ((0xa1 <= (c)) && ((c) <= 0xdf))
int int
sj3_str_sjistoeuc(unsigned char *out, int outlen, unsigned char *in, unsigned char *sjis_default, int *useflag) sj3_str_sjistoeuc(unsigned char *out, int outlen, unsigned char *in,
unsigned char *sjis_default, int *useflag)
{ {
unsigned char *sjis = in, *euc = out; unsigned char *sjis = in, *euc = out;
int n = 0; int n = 0;
@ -60,15 +61,17 @@ sj3_str_sjistoeuc(unsigned char *out, int outlen, unsigned char *in, unsigned ch
euc[0] = '\0'; euc[0] = '\0';
*useflag = 0; *useflag = 0;
if (!sjis) return 0; if (!sjis)
return 0;
while (*sjis && n < outlen) { while (*sjis && n < outlen) {
if (issjis1(*sjis)) { if (issjis1(*sjis)) {
code = sjis2euc((*sjis << 8) | *(sjis + 1)); code = sjis2euc((*sjis << 8) | *(sjis + 1));
if (n + 2 > outlen) return -1; if (n + 2 > outlen)
return -1;
if (code == 0) { if (code == 0) {
default_code = sjis2euc((sjis_default[0] << 8) default_code = sjis2euc((sjis_default[0] << 8) |
| sjis_default[1]); sjis_default[1]);
euc[n++] = default_code >> 8; euc[n++] = default_code >> 8;
euc[n++] = default_code & 0xff; euc[n++] = default_code & 0xff;
(*useflag)++; (*useflag)++;
@ -79,23 +82,24 @@ sj3_str_sjistoeuc(unsigned char *out, int outlen, unsigned char *in, unsigned ch
sjis += 2; sjis += 2;
} else { } else {
if (*sjis >= 0xa1 && *sjis <= 0xdf) { if (*sjis >= 0xa1 && *sjis <= 0xdf) {
if (n + 2 > outlen) return -1; if (n + 2 > outlen)
return -1;
euc[n++] = SS2; euc[n++] = SS2;
} }
euc[n++] = *sjis; euc[n++] = *sjis;
sjis++; sjis++;
} }
} }
if (n > outlen) return -1; if (n > outlen)
return -1;
euc[n] = '\0'; euc[n] = '\0';
return n; return n;
} }
int int
sj3_str_euctosjis(unsigned char *out, int outlen, unsigned char *in, unsigned char *sjis_default, int *useflag) sj3_str_euctosjis(unsigned char *out, int outlen, unsigned char *in,
unsigned char *sjis_default, int *useflag)
{ {
unsigned char *euc = in, *sjis = out; unsigned char *euc = in, *sjis = out;
int n = 0; int n = 0;
@ -104,12 +108,14 @@ sj3_str_euctosjis(unsigned char *out, int outlen, unsigned char *in, unsigned ch
sjis[0] = '\0'; sjis[0] = '\0';
*useflag = 0; *useflag = 0;
if (!euc) return 0; if (!euc)
return 0;
while (*euc && n < outlen) { while (*euc && n < outlen) {
if (iseuc(*euc)) { if (iseuc(*euc)) {
code = euc2sjis((*euc << 8) | *(euc + 1)); code = euc2sjis((*euc << 8) | *(euc + 1));
if (n + 2 > outlen) return -1; if (n + 2 > outlen)
return -1;
if (code == 0) { if (code == 0) {
sjis[n++] = sjis_default[0]; sjis[n++] = sjis_default[0];
sjis[n++] = sjis_default[1]; sjis[n++] = sjis_default[1];
@ -120,7 +126,8 @@ sj3_str_euctosjis(unsigned char *out, int outlen, unsigned char *in, unsigned ch
} }
euc += 2; euc += 2;
} else if (*euc == SS3) { } else if (*euc == SS3) {
if (n + 2 > outlen) return -1; if (n + 2 > outlen)
return -1;
sjis[n++] = sjis_default[0]; sjis[n++] = sjis_default[0];
sjis[n++] = sjis_default[1]; sjis[n++] = sjis_default[1];
euc += 3; euc += 3;
@ -133,7 +140,8 @@ sj3_str_euctosjis(unsigned char *out, int outlen, unsigned char *in, unsigned ch
euc++; euc++;
} }
} }
if (n > outlen) return -1; if (n > outlen)
return -1;
sjis[n] = '\0'; sjis[n] = '\0';
return n; return n;
@ -142,14 +150,16 @@ sj3_str_euctosjis(unsigned char *out, int outlen, unsigned char *in, unsigned ch
int int
sj3_sjistoeuclen(unsigned char *str, int max) sj3_sjistoeuclen(unsigned char *str, int max)
{ {
register int len = 0, bytes = 1; int len = 0, bytes = 1;
if (!max) return 0; if (!max)
return 0;
while ((bytes <= max) && *str) { while ((bytes <= max) && *str) {
if (issjis1(*str)) { if (issjis1(*str)) {
str++; str++;
bytes++; bytes++;
if (!*str) break; if (!*str)
break;
len += 2; len += 2;
} else if (*str & 0x80) { } else if (*str & 0x80) {
len += 2; len += 2;
@ -194,8 +204,8 @@ sj_euc2sjis (unsigned char *s)
void void
sj_jis2sjis(unsigned char *s) sj_jis2sjis(unsigned char *s)
{ {
register int high, low; int high, low;
register int nh, nl; int nh, nl;
high = s[0]; high = s[0];
low = s[1]; low = s[1];
@ -206,8 +216,7 @@ sj_jis2sjis (unsigned char *s)
nl = low + 0x1f; nl = low + 0x1f;
if (low > 0x5f) if (low > 0x5f)
nl++; nl++;
} } else
else
nl = low + 0x7e; nl = low + 0x7e;
s[0] = nh; s[0] = nh;
s[1] = nl; s[1] = nl;
@ -224,16 +233,16 @@ sj_sjis2euc (unsigned char *s)
void void
sj_sjis2jis(unsigned char *s) sj_sjis2jis(unsigned char *s)
{ {
register int byte1, byte2; int byte1, byte2;
register unsigned char *sp; unsigned char *sp;
sp = s; sp = s;
byte1 = *sp++; byte1 = *sp++;
byte2 = *sp--; byte2 = *sp--;
if (byte1 <= 0x80 || byte1 >= 0xf0 if (byte1 <= 0x80 || byte1 >= 0xf0 ||
|| ( byte1>=0xa0 && byte1<=0xdf ) (byte1 >= 0xa0 && byte1 <= 0xdf) ||
|| byte2 <= 0x3f || byte2 >= 0xfe || byte2==0x7f ) { byte2 <= 0x3f || byte2 >= 0xfe || byte2 == 0x7f) {
byte1 = 0x81; byte1 = 0x81;
byte2 = 0x40; byte2 = 0x40;
} }
@ -241,8 +250,7 @@ sj_sjis2jis (unsigned char *s)
if (byte2 >= 0x9f) { if (byte2 >= 0x9f) {
*sp++ = (byte1 << 1) + 0x22; *sp++ = (byte1 << 1) + 0x22;
*sp = byte2 - 0x7e; *sp = byte2 - 0x7e;
} } else {
else {
*sp++ = (byte1 << 1) + 0x21; *sp++ = (byte1 << 1) + 0x21;
*sp = byte2 - ((byte2 <= 0x7e) ? 0x1f : 0x20); *sp = byte2 - ((byte2 <= 0x7e) ? 0x1f : 0x20);
} }