diff options
Diffstat (limited to 'src/interfaces/odbc/windev/multibyte.c')
-rw-r--r-- | src/interfaces/odbc/windev/multibyte.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/interfaces/odbc/windev/multibyte.c b/src/interfaces/odbc/windev/multibyte.c new file mode 100644 index 00000000000..b19af2764c0 --- /dev/null +++ b/src/interfaces/odbc/windev/multibyte.c @@ -0,0 +1,138 @@ +/*-------- + * Module : multibyte.c + * + * Description: Mlutibyte related additional function. + * + * Create 2001-03-03 Eiji Tokuya + *-------- + */ + +#include "multibyte.h" +#include <string.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, "%27Shift_JIS%27") || + strstr(str, "'SJIS'") || + strstr(str, "'sjis'") || + strstr(str, "'Shift_JIS'")) + { + multibyte_client_encoding = SJIS; + return ("SJIS"); + } + if (strstr(str, "%27BIG5%27") || + strstr(str, "%27Big5%27") || + strstr(str, "'BIG5'") || + strstr(str, "'big5'") || + strstr(str, "'Big5'")) + { + multibyte_client_encoding = BIG5; + return ("BIG5"); + } + return ("OTHER"); +} + + +/*-------- + * 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); +} |