1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
* 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);
}