summaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/multibyte.c
blob: b19af2764c0a97ac76115d6be245d557e70c042c (plain)
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
127
128
129
130
131
132
133
134
135
136
137
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);
}