8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 06:43:04 +01:00

Moved the files into intl. They don't belong in jrd.

This commit is contained in:
bellardo 2002-04-09 23:27:59 +00:00
parent 0d3e386c07
commit d70dac3dd6
3 changed files with 0 additions and 607 deletions

View File

@ -1,489 +0,0 @@
/*
* PROGRAM: JRD Access Method
* MODULE: kanji.c
* DESCRIPTION:
*
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at http://www.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#include "firebird.h"
#include "../jrd/ib_stdio.h"
#include "../jrd/common.h"
#include "../jrd/kanji.h"
#include "../jrd/kanji_proto.h"
#define S2E(s1, s2, j1, j2) \
{ \
if (s2 >= 0x9f) { \
if (s1 >= 0xe0) j1 = (s1*2 - 0xe0); \
else j1 = (s1*2 - 0x60); \
j2 = (s2 + 2); \
} else { \
if (s1 >= 0xe0) j1 = (s1*2 - 0xe1); \
else j1 = (s1*2 - 0x61);\
if (s2 >= 0x7f) j2 = (s2 + 0x60); \
else j2 = (s2 + 0x61); \
} \
}
USHORT KANJI_check_euc(UCHAR * euc_str, USHORT euc_len)
{
/**************************************
*
* K A N J I _ c h e c k _ e u c
*
**************************************
*
* Functional description
* This is a cousin of the KANJI_check_sjis routine.
* Make sure that the euc string does not have any truncated 2 byte
* character at the end. * If we have a truncated character then,
* return 1.
* else return(0);
**************************************/
UCHAR c1, c2;
while (euc_len--) {
if (*euc_str & 0x80) { /* Is it EUC */
if (euc_len == 0) { /* truncated kanji */
return (1);
}
else {
euc_str += 2;
euc_len -= 1;
}
}
else { /* it is a ASCII */
euc_str++;
}
}
return (0);
}
USHORT KANJI_check_sjis(UCHAR * sjis_str, USHORT sjis_len)
{
/**************************************
*
* K A N J I _ c h e c k _ s j i s
*
**************************************
*
* Functional description
* This is a cousin of the KANJI_check_euc routine.
* Make sure that the sjis string does not have any truncated 2 byte
* character at the end. * If we have a truncated character then,
* return 1.
* else return(0);
**************************************/
UCHAR c1;
while (sjis_len--) {
if (*sjis_str & 0x80) { /* Is it SJIS */
if SJIS1
((c1 = *sjis_str)) { /* It is a KANJI */
if (sjis_len == 0) { /* truncated KANJI */
return (1);
}
else {
sjis_str += 2;
sjis_len -= 1;
}
}
else { /*It is a KANA */
sjis_str++;
}
}
else { /* it is a ASCII */
sjis_str++;
}
}
return (0);
}
USHORT KANJI_euc2sjis(UCHAR * euc_str,
USHORT euc_len,
UCHAR * sjis_str,
USHORT sjis_buf_len, USHORT * sjis_len)
{
/**************************************
*
* K A N J I _ e u c 2 s j i s
*
**************************************
*
* Functional description
* Convert euc_len number of bytes in euc_str to sjis_str .
* sjis_buf_len is the maximum size of the sjis buffer.
* sjis_len is set to the number of bytes put in the sjis_str.
* If a kanji conversion error occurs a 1 is returned.
*
**************************************/
UCHAR c1, c2;
*sjis_len = 0;
while (euc_len) {
if (*euc_str & 0x80) { /* Non-Ascii - High bit set */
if (*sjis_len >= sjis_buf_len) /*buffer full */
return (1);
c1 = *euc_str++;
euc_len--;
if (EUC1(c1)) { /* It is a EUC */
if (euc_len == 0)
return (1); /* truncated EUC */
c2 = *euc_str++;
euc_len--;
if (!(EUC2(c2)))
return (1); /* Bad EUC */
if (c1 == 0x8e) { /* Kana */
*sjis_len += 1;
*sjis_str++ = c2;
}
else { /* Kanji */
*sjis_len += 2;
if (*sjis_len > sjis_buf_len) /*buffer full */
return (1);
c1 ^= 0x80;
c2 ^= 0x80;
*sjis_str++ =
(c1 - 0x21) / 2 + ((c1 <= 0x5e) ? 0x81 : 0xc1);
if (c1 & 1) /* odd */
*sjis_str++ = c2 + ((c2 <= 0x5f) ? 0x1f : 0x20);
else
*sjis_str++ = c2 + 0x7e;
}
}
else /* It is some bad character */
return (1);
}
else { /* ASCII */
euc_len--;
*sjis_len += 1;
*sjis_str++ = *euc_str++;
}
}
return (0);
}
USHORT KANJI_euc_byte2short(UCHAR * src, USHORT * dst, USHORT len)
{
/**************************************
*
* K A N J I _ e u c _ b y t e 2 s h o r t
*
**************************************
*
* Functional description
* Convert len number of bytes of EUC string in
* src (SCHAR-based buffer) into dst (short-based buffer).
* This routine merges:
* 1-byte ASCII into 1 sshort, and
* 2-byte EUC kanji into 1 sshort.
* Return the number of "characters" in dst.
*
**************************************/
USHORT l, x;
for (l = 0; len-- > 0; l++) {
x = (EUC1(*src)) ? (len--, (*src++ << 8)) : 0;
x |= *src++;
*dst++ = x;
}
return l;
}
USHORT KANJI_euc_len(UCHAR * sjis_str, USHORT sjis_len, USHORT * euc_len)
{
/**************************************
*
* K A N J I _ e u c _ l e n
*
**************************************
*
* Functional description
* Return the number of euc bytes corresponding to a given sjis string.
* Returns 1 if invalid kanji is encountered.
*
**************************************/
UCHAR c1, c2;
*euc_len = 0;
while (sjis_len) {
if (*sjis_str & 0x80) { /* Non-Ascii - High bit set */
c1 = *sjis_str++;
sjis_len--;
if (SJIS1(c1)) { /* First byte is a KANJI */
if (sjis_len == 0)
return (1); /* truncated KANJI */
c2 = *sjis_str++;
sjis_len--;
if (!(SJIS2(c2)))
return (1); /* Bad second byte */
*euc_len += 2; /* Good Kanji */
}
else if (SJIS_SINGLE(c1))
*euc_len += 2; /* Kana */
else
return (1); /* It is some bad character */
}
else { /* it is a ASCII */
sjis_len--;
*euc_len += 1;
sjis_str++;
}
}
return (0);
}
USHORT KANJI_sjis2euc(UCHAR * sjis_str,
USHORT sjis_len,
UCHAR * euc_str, USHORT euc_buf_len, USHORT * euc_len)
{
/**************************************
*
* K A N J I _ s j i s 2 e u c
*
**************************************
*
* Functional description
* Convert sjis_len number of bytes in sjis_str to euc_str .
* euc_len is set to the number of bytes put in the euc_str.
* If a kanji conversion error occurs a 1 is returned.
*
**************************************/
UCHAR c1, c2;
*euc_len = 0;
while (sjis_len) {
if (*euc_len >= euc_buf_len) /*buffer full */
return (1);
if (*sjis_str & 0x80) { /* Non-Ascii - High bit set */
c1 = *sjis_str++;
sjis_len--;
if (SJIS1(c1)) { /* First byte is a KANJI */
if (sjis_len == 0)
return (1); /* truncated KANJI */
c2 = *sjis_str++;
sjis_len--;
if (!(SJIS2(c2)))
return (1); /* Bad second byte */
*euc_len += 2; /* Good Kanji */
if (*euc_len > euc_buf_len) /*buffer full */
return (1);
S2E(c1, c2, *euc_str, *(euc_str + 1));
euc_str += 2;
}
else if (SJIS_SINGLE(c1)) {
*euc_len += 2; /* Kana */
if (*euc_len > euc_buf_len) /*buffer full */
return (1);
*euc_str++ = 0x8e;
*euc_str++ = c1;
}
else
return (1); /* It is some bad character */
}
else { /* it is a ASCII */
*euc_len += 1;
sjis_len--;
*euc_str++ = *sjis_str++;
}
}
return (0);
}
USHORT KANJI_sjis_byte2short(UCHAR * src;
USHORT * dst, USHORT len) {
/**************************************
*
* K A N J I _ s j i s _ b y t e 2 s h o r t
*
**************************************
*
* Functional description
* Convert len number of bytes of SJIS string in
* src (SCHAR-based buffer) into dst (short-based buffer).
* This routine merges:
* 1-byte ASCII into 1 sshort,
* 1-byte SJIS kana 1 sshort, and
* 2-byte SJIS kanji into 1 sshort.
* Return the number of "characters" in dst.
*
**************************************/
USHORT l, x;
for (l = 0; len-- > 0; l++) {
x = (SJIS1(*src)) ? (len--, (*src++ << 8)) : 0;
x |= *src++;
*dst++ = x;
}
return l;
}
USHORT KANJI_sjis2euc5(UCHAR * sjis_str,
USHORT sjis_len,
UCHAR * euc_str,
USHORT euc_buf_len,
USHORT * euc_len, USHORT * ib_sjis, USHORT * ib_euc)
{
/**************************************
*
* K A N J I _ s j i s 2 e u c 5
*
**************************************
*
* Functional description
* Similar to KANJI_sjis2euc().
* Differences:
* (1) when buffer is full, returns (1).
* (2) when there's invalid SCHAR, returns(2).
* (3) two additional parameters are:
* ib_sjis number of in-bound sjis character
* ib_euc number of in-bound euc character
* This function is designed to convert blob segment from SJIS to EUC
* on retrieval. The reason we have ib_sjis and ib_euc is to keep
* track of splitting fragments from segments.
*
**************************************/
UCHAR c1, c2;
*euc_len = 0;
*ib_sjis = *ib_euc = 0;
while (sjis_len) {
if (*euc_len >= euc_buf_len) /*buffer full */
return (1);
if (*sjis_str & 0x80) { /* Non-Ascii - High bit set */
c1 = *sjis_str++;
sjis_len--;
if (SJIS1(c1)) { /* First byte is a KANJI */
if (sjis_len == 0)
return (2); /* truncated KANJI */
c2 = *sjis_str++;
sjis_len--;
if (!(SJIS2(c2)))
return (2); /* Bad second byte */
*euc_len += 2; /* Good Kanji */
if (*euc_len > euc_buf_len) /*buffer full */
return (1);
S2E(c1, c2, *euc_str, *(euc_str + 1));
euc_str += 2;
*ib_sjis += 2;
*ib_euc += 2;
}
else if (SJIS_SINGLE(c1)) {
*euc_len += 2; /* Kana */
if (*euc_len > euc_buf_len) /*buffer full */
return (1);
*euc_str++ = 0x8e;
*euc_str++ = c1;
(*ib_sjis)++;
*ib_euc += 2;
}
else
return (2); /* It is some bad character */
}
else { /* it is a ASCII */
*euc_len += 1;
sjis_len--;
*euc_str++ = *sjis_str++;
(*ib_sjis)++;
(*ib_euc)++;
}
}
return (0);
}
USHORT KANJI_sjis_len(UCHAR * euc_str, USHORT euc_len, USHORT * sjis_len)
{
/**************************************
*
* K A N J I _ s j i s _ l e n
*
**************************************
*
* Functional description
* Find the number of sjis bytes corresponding to a given euc string.
* Returns 1 if invalid kanji is encountered.
*
**************************************/
UCHAR c1, c2;
*sjis_len = 0;
while (euc_len) {
if (*euc_str & 0x80) { /* Non-Ascii - High bit set */
c1 = *euc_str++;
euc_len--;
if (EUC1(c1)) { /* It is a EUC */
if (euc_len == 0)
return (1); /* truncated EUC */
c2 = *euc_str++;
euc_len--;
if (!(EUC2(c2)))
return (1); /* Bad EUC */
if (c1 == 0x8e)
*sjis_len += 1; /* Kana */
else
*sjis_len += 2; /* Kanji */
}
else /* It is some bad character */
return (1);
}
else { /* ASCII */
euc_len--;
*sjis_len += 1;
euc_str++;
}
}
return (0);
}

View File

@ -1,80 +0,0 @@
/*
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at http://www.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#ifndef _JRD_KANJI_H_
#define _JRD_KANJI_H_
#include "../jrd/common.h"
#define SJIS1(uc) \
((0x80 <= (UCHAR) ((uc) & 0xff) && (UCHAR) ((uc) & 0xff) <= 0x9f) || \
(0xe0 <= (UCHAR) ((uc) & 0xff) && (UCHAR) ((uc) & 0xff) <= 0xef))
#define SJIS2(uc) ((0x40 <= (UCHAR) ((uc) & 0xff) && (UCHAR) ((uc) & 0xff) <= 0xfc))
#define SJIS_SINGLE(uc) ( 0xa0 <= (UCHAR) ((uc) & 0xff) && (UCHAR) ((uc) & 0xff) <= 0xdf )
#define EUC1(c) (c & 0x80)
#define EUC2(c) (c & 0x80)
#define KANJISHORT(s) (s & 0xff80)
#define KANJI_MASK 0x80
#ifdef JPN_EUC
#define KANJI1(c) EUC1(c)
#define KANJI2(c) EUC2(c)
#else
#ifdef JPN_SJIS
#define KANJI1(c) SJIS1(c)
#define KANJI2(c) SJIS2(c)
#endif /* JPN_SJIS */
#endif /* JPN_EUC */
#ifdef JPN_EUC
#define JPN1_CHAR(c) EUC1(c)
#else
#ifdef JPN_SJIS
#define JPN1_CHAR(c) (SJIS1(c) || SJIS_SINGLE(c))
#endif /* JPN_SJIS */
#endif /* JPN_EUC */
#ifdef JPN_EUC
#define KANJI_check KANJI_check_euc
#else
#ifdef JPN_SJIS
#define KANJI_check KANJI_check_sjis
#endif /* JPN_SJIS */
#endif /*JPN_EUC */
#ifdef JPN_EUC
#define KANJI_byte2short KANJI_euc_byte2short
#else
#ifdef JPN_SJIS
#define KANJI_byte2short KANJI_sjis_byte2short
#endif /* JPN_SJIS */
#endif /*JPN_EUC */
extern USHORT KANJI_check_euc();
extern USHORT KANJI_check_sjis();
extern USHORT KANJI_euc2sjis();
extern USHORT KANJI_euc_byte2short();
extern USHORT KANJI_euc_len();
extern USHORT KANJI_sjis2euc();
extern USHORT KANJI_sjis2euc5();
extern USHORT KANJI_sjis_byte2short();
extern USHORT KANJI_sjis_len();
#endif /* _JRD_KANJI_H_ */

View File

@ -1,38 +0,0 @@
/*
* PROGRAM: JRD Access Method
* MODULE: kanji_proto.h
* DESCRIPTION: Prototype header file for kanji.c
*
* The contents of this file are subject to the Interbase Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy
* of the License at http://www.Inprise.com/IPL.html
*
* Software distributed under the License is distributed on an
* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
* or implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code was created by Inprise Corporation
* and its predecessors. Portions created by Inprise Corporation are
* Copyright (C) Inprise Corporation.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
*/
#ifndef _JRD_KANJI_PROTO_H_
#define _JRD_KANJI_PROTO_H_
extern USHORT KANJI_check_euc(UCHAR *, USHORT);
extern USHORT KANJI_check_sjis(UCHAR *, USHORT);
extern USHORT KANJI_euc2sjis(UCHAR *, USHORT, UCHAR *, USHORT, USHORT *);
extern USHORT KANJI_euc_byte2short(UCHAR *, USHORT *, USHORT);
extern USHORT KANJI_euc_len(UCHAR *, USHORT, USHORT *);
extern USHORT KANJI_sjis2euc(UCHAR *, USHORT, UCHAR *, USHORT, USHORT *);
extern USHORT KANJI_sjis_byte2short(UCHAR *, USHORT *, USHORT);
extern USHORT KANJI_sjis2euc5(UCHAR *, USHORT, UCHAR *, USHORT, USHORT *,
USHORT *, USHORT *);
extern USHORT KANJI_sjis_len(UCHAR *, USHORT, USHORT *);
#endif /* _JRD_KANJI_PROTO_H_ */