mirror of https://github.com/postgres/postgres
parent
9d645fd84c
commit
935017457b
@ -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 ); |
||||||
|
} |
@ -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