mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-27 07:21:09 +08:00
Oops I forgot to add new files for multibyte support.
Sorry Eiji.
This commit is contained in:
parent
9d645fd84c
commit
935017457b
124
src/interfaces/odbc/multibyte.c
Normal file
124
src/interfaces/odbc/multibyte.c
Normal file
@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Module : multibyte.c
|
||||
*
|
||||
* Description: Mlutibyte related additional function.
|
||||
*
|
||||
* Create 2001-03-03 Eiji Tokuya
|
||||
*
|
||||
*/
|
||||
#include <string.h>
|
||||
#include "multibyte.h"
|
||||
|
||||
int multibyte_client_encoding ; /* Multibyte Client Encoding. */
|
||||
int multibyte_status ; /* Multibyte Odds and ends character. */
|
||||
|
||||
unsigned char *multibyte_strchr(unsigned char *s,unsigned char c)
|
||||
{
|
||||
int mb_st = 0 ,i = 0;
|
||||
while (!(mb_st == 0 && s[i] == c || s[i] == 0))
|
||||
{
|
||||
if (s[i] == 0)
|
||||
return (0);
|
||||
switch ( multibyte_client_encoding )
|
||||
{
|
||||
case SJIS:
|
||||
{
|
||||
if (mb_st < 2 && s[i] > 0x80 && !(s[i] > 0x9f && s[i] < 0xe0))
|
||||
mb_st = 2;
|
||||
else if (mb_st == 2)
|
||||
mb_st = 1;
|
||||
else
|
||||
mb_st = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
/* Chinese Big5 Support. */
|
||||
case BIG5:
|
||||
{
|
||||
if ( mb_st < 2 && s[i] > 0xA0 )
|
||||
mb_st = 2;
|
||||
else if ( mb_st == 2 )
|
||||
mb_st = 1;
|
||||
else
|
||||
mb_st = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
mb_st = 0;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
qlog("i = %d\n",i);
|
||||
#endif
|
||||
return (s + i);
|
||||
}
|
||||
|
||||
void multibyte_init(void)
|
||||
{
|
||||
multibyte_status = 0;
|
||||
}
|
||||
|
||||
unsigned char *check_client_encoding(unsigned char *str)
|
||||
{
|
||||
if(strstr(str,"%27SJIS%27")||strstr(str,"'SJIS'")||strstr(str,"'sjis'"))
|
||||
{
|
||||
multibyte_client_encoding = SJIS;
|
||||
return ("SJIS");
|
||||
}
|
||||
if(strstr(str,"%27BIG5%27")||strstr(str,"'BIG5'")||strstr(str,"'big5'"))
|
||||
{
|
||||
multibyte_client_encoding = BIG5;
|
||||
return ("BIG5");
|
||||
}
|
||||
return ("OHTER");
|
||||
}
|
||||
|
||||
/*
|
||||
* Multibyte Status Function.
|
||||
* Input char
|
||||
* Output 0 : 1 Byte Character.
|
||||
* 1 : MultibyteCharacter Last Byte.
|
||||
* N : MultibyteCharacter Fast or Middle Byte.
|
||||
*/
|
||||
int multibyte_char_check(unsigned char s)
|
||||
{
|
||||
switch ( multibyte_client_encoding )
|
||||
{
|
||||
/* Japanese Shift-JIS(CP932) Support. */
|
||||
case SJIS:
|
||||
{
|
||||
if ( multibyte_status < 2 && s > 0x80 && !(s > 0x9f && s < 0xE0))
|
||||
multibyte_status = 2;
|
||||
else if (multibyte_status == 2)
|
||||
multibyte_status = 1;
|
||||
else
|
||||
multibyte_status = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
/* Chinese Big5(CP950) Support. */
|
||||
case BIG5:
|
||||
{
|
||||
if ( multibyte_status < 2 && s > 0xA0)
|
||||
multibyte_status = 2;
|
||||
else if (multibyte_status == 2)
|
||||
multibyte_status = 1;
|
||||
else
|
||||
multibyte_status = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
multibyte_status = 0;
|
||||
}
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
qlog("multibyte_client_encoding = %d s = 0x%02X multibyte_stat = %d\n", multibyte_client_encoding, s, multibyte_status );
|
||||
#endif
|
||||
return( multibyte_status );
|
||||
}
|
39
src/interfaces/odbc/multibyte.h
Normal file
39
src/interfaces/odbc/multibyte.h
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
*
|
||||
* Multibyte library header ( psqlODBC Only )
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/* PostgreSQL client encoding */
|
||||
#define SQL_ASCII 0 /* SQL/ASCII */
|
||||
#define EUC_JP 1 /* EUC for Japanese */
|
||||
#define EUC_CN 2 /* EUC for Chinese */
|
||||
#define EUC_KR 3 /* EUC for Korean */
|
||||
#define EUC_TW 4 /* EUC for Taiwan */
|
||||
#define UNICODE 5 /* Unicode UTF-8 */
|
||||
#define MULE_INTERNAL 6 /* Mule internal code */
|
||||
#define LATIN1 7 /* ISO-8859 Latin 1 */
|
||||
#define LATIN2 8 /* ISO-8859 Latin 2 */
|
||||
#define LATIN3 9 /* ISO-8859 Latin 3 */
|
||||
#define LATIN4 10 /* ISO-8859 Latin 4 */
|
||||
#define LATIN5 11 /* ISO-8859 Latin 5 */
|
||||
#define LATIN6 12 /* ISO-8859 Latin 6 */
|
||||
#define LATIN7 13 /* ISO-8859 Latin 7 */
|
||||
#define LATIN8 14 /* ISO-8859 Latin 8 */
|
||||
#define LATIN9 15 /* ISO-8859 Latin 9 */
|
||||
#define KOI8 16 /* KOI8-R */
|
||||
#define WIN 17 /* windows-1251 */
|
||||
#define ALT 18 /* Alternativny Variant (MS-DOS CP866) */
|
||||
#define SJIS 32 /* Shift JIS */
|
||||
#define BIG5 33 /* Big5 */
|
||||
#define WIN1250 34 /* windows-1250 */
|
||||
|
||||
|
||||
extern int multibyte_client_encoding ; /* Multibyte client encoding. */
|
||||
extern int multibyte_status ; /* Multibyte charcter status. */
|
||||
|
||||
void multibyte_init(void);
|
||||
unsigned char *check_client_encoding(unsigned char *str);
|
||||
int multibyte_char_check(unsigned char s);
|
||||
unsigned char *multibyte_strchr(unsigned char *s, unsigned char c);
|
Loading…
Reference in New Issue
Block a user