2 * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
3 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include "chxj_conv_z2h.h"
19 #include "chxj_url_encode.h"
20 #include "qs_parse_string.h"
23 static z2h_table_t kana_table1[] = {
24 { /* 00 */ 1, "\xa7\x00",},
25 { /* 01 */ 1, "\xb1\x00",},
26 { /* 02 */ 1, "\xa8\x00",},
27 { /* 03 */ 1, "\xb2\x00",},
28 { /* 04 */ 1, "\xa9\x00",},
29 { /* 05 */ 1, "\xb3\x00",},
30 { /* 06 */ 1, "\xaa\x00",},
31 { /* 07 */ 1, "\xb4\x00",},
32 { /* 08 */ 1, "\xab\x00",},
33 { /* 09 */ 1, "\xb5\x00",},
34 { /* 10 */ 1, "\xb6\x00",},
35 { /* 11 */ 2, "\xb6\xde",},
36 { /* 12 */ 1, "\xb7\x00",},
37 { /* 13 */ 2, "\xb7\xde",},
38 { /* 14 */ 1, "\xb8\x00",},
39 { /* 15 */ 2, "\xb8\xde",},
40 { /* 16 */ 1, "\xb9\x00",},
41 { /* 17 */ 2, "\xb9\xde",},
42 { /* 18 */ 1, "\xba\x00",},
43 { /* 19 */ 2, "\xba\xde",},
44 { /* 20 */ 1, "\xbb\x00",},
45 { /* 21 */ 2, "\xbb\xde",},
46 { /* 22 */ 1, "\xbc\x00",},
47 { /* 23 */ 2, "\xbc\xde",},
48 { /* 24 */ 1, "\xbd\x00",},
49 { /* 25 */ 2, "\xbd\xde",},
50 { /* 26 */ 1, "\xbe\x00",},
51 { /* 27 */ 2, "\xbe\xde",},
52 { /* 28 */ 1, "\xbf\x00",},
53 { /* 29 */ 2, "\xbf\xde",},
54 { /* 30 */ 1, "\xc0\x00",},
55 { /* 31 */ 2, "\xc0\xde",},
56 { /* 32 */ 1, "\xc1\x00",},
57 { /* 33 */ 2, "\xc1\xde",},
58 { /* 34 */ 1, "\xaf\x00",},
59 { /* 35 */ 1, "\xc2\x00",},
60 { /* 36 */ 2, "\xc2\xde",},
61 { /* 37 */ 1, "\xc3\x00",},
62 { /* 38 */ 2, "\xc3\xde",},
63 { /* 39 */ 1, "\xc4\x00",},
64 { /* 40 */ 2, "\xc4\xde",},
65 { /* 41 */ 1, "\xc5\x00",},
66 { /* 42 */ 1, "\xc6\x00",},
67 { /* 43 */ 1, "\xc7\x00",},
68 { /* 44 */ 1, "\xc8\x00",},
69 { /* 45 */ 1, "\xc9\x00",},
70 { /* 46 */ 1, "\xca\x00",},
71 { /* 47 */ 2, "\xca\xde",},
72 { /* 48 */ 2, "\xca\xdf",},
73 { /* 49 */ 1, "\xcb\x00",},
74 { /* 50 */ 2, "\xcb\xde",},
75 { /* 51 */ 2, "\xcb\xdf",},
76 { /* 52 */ 1, "\xcc\x00",},
77 { /* 53 */ 2, "\xcc\xde",},
78 { /* 54 */ 2, "\xcc\xdf",},
79 { /* 55 */ 1, "\xcd\x00",},
80 { /* 56 */ 2, "\xcd\xde",},
81 { /* 57 */ 2, "\xcd\xdf",},
82 { /* 58 */ 1, "\xce\x00",},
83 { /* 59 */ 2, "\xce\xde",},
84 { /* 60 */ 2, "\xce\xdf",},
85 { /* 61 */ 1, "\xcf\x00",},
86 { /* 62 */ 1, "\xd0\x00",},
87 { /* 63 */ 0, "\x00\x00",},
88 { /* 64 */ 1, "\xd1\x00",},
89 { /* 65 */ 1, "\xd2\x00",},
90 { /* 66 */ 1, "\xd3\x00",},
91 { /* 67 */ 1, "\xac\x00",},
92 { /* 68 */ 1, "\xd4\x00",},
93 { /* 69 */ 1, "\xad\x00",},
94 { /* 70 */ 1, "\xd5\x00",},
95 { /* 71 */ 1, "\xae\x00",},
96 { /* 72 */ 1, "\xd6\x00",},
97 { /* 73 */ 1, "\xd7\x00",},
98 { /* 74 */ 1, "\xd8\x00",},
99 { /* 75 */ 1, "\xd9\x00",},
100 { /* 76 */ 1, "\xda\x00",},
101 { /* 77 */ 1, "\xdb\x00",},
102 { /* 78 */ 2, "\x83\x8e",},
103 { /* 79 */ 1, "\xdc\x00",},
104 { /* 80 */ 2, "\x83\x90",},
105 { /* 81 */ 2, "\x83\x91",},
106 { /* 82 */ 1, "\xa6\x00",},
107 { /* 83 */ 1, "\xdd\x00",},
108 { /* 84 */ 2, "\xb3\xde",},
109 { /* 85 */ 2, "\x83\x95",},
110 { /* 86 */ 2, "\x83\x96",},
112 static z2h_table_t kana_table2[] = {
113 { /* 0x8141 、*/ 1, "\xa4",},
114 { /* 0x8142 。*/ 1, "\xa1",},
115 { /* 0x8143 ,*/ 1, ",",},
116 { /* 0x8144 .*/ 1, ".",},
117 { /* 0x8145 ・*/ 1, "\xa5",},
118 { /* 0x8146 :*/ 1, ":",},
119 { /* 0x8147 ;*/ 1, ";",},
120 { /* 0x8148 ?*/ 1, "?",},
121 { /* 0x8149 !*/ 1, "!",},
122 { /* 0x814a ゛*/ 1, "\xde",},
123 { /* 0x814b ゜*/ 1, "\xdf",},
125 static z2h_table_t kana_table3[] = {
126 { /* 0x8175 「*/ 1, "\xa2",},
127 { /* 0x8176 」*/ 1, "\xa3",},
129 static z2h_table_t kana_table4[] = {
130 { /* 0x815b ゛*/ 1, "\xb0",},
133 static z2h_table_t alpha_table_uc[] = {
161 static z2h_table_t alpha_table_lc[] = {
192 chxj_conv_z2h(request_rec *r, const char *src, apr_size_t *len, chxjconvrule_entry *entryp)
199 int z2h_kana_flag = 0;
200 int z2h_alpha_flag = 0;
201 int z2h_num_flag = 0;
203 DBG(r,"REQ[%X] start chxj_conv_z2h()", (unsigned int)(apr_size_t)r);
205 if (entryp->action & CONVRULE_Z2H_ON_BIT) {
208 if (entryp->action & CONVRULE_Z2H_OFF_BIT) {
211 if (entryp->action & CONVRULE_Z2H_ALPHA_ON_BIT) {
214 if (entryp->action & CONVRULE_Z2H_ALPHA_OFF_BIT) {
217 if (entryp->action & CONVRULE_Z2H_NUM_ON_BIT) {
220 if (entryp->action & CONVRULE_Z2H_NUM_OFF_BIT) {
223 if (z2h_kana_flag == 0 && z2h_alpha_flag == 0 && z2h_num_flag == 0) {
224 DBG(r, "REQ[%X] No Z2h flag.", (unsigned int)(apr_size_t)r);
225 DBG(r,"REQ[%X] end chxj_conv_z2h()", (unsigned int)(apr_size_t)r);
229 apr_pool_create(&pool, r->pool);
234 obuf = apr_palloc(pool, ilen + 1);
236 ERR(r,"%s:%d REQ[%X] memory allocation error", __FILE__,__LINE__,(unsigned int)(apr_size_t)r);
237 DBG(r,"REQ[%X] end chxj_conv_z2h()", (unsigned int)(apr_size_t)r);
241 memset(obuf, 0, ilen + 1);
242 for (ii=0; ii<ilen; ii++) {
244 if (is_sjis_kana(src[ii])) {
245 obuf[olen++] = src[ii];
247 else if (is_sjis_kanji(src[ii])) {
248 unsigned char firstbyte = src[ii + 0];
249 unsigned char secondbyte = src[ii + 1];
252 && (secondbyte >= 0x40 && secondbyte <= 0x96)) {
253 unsigned char p = secondbyte - 0x40;
254 if (kana_table1[p].byte != 0) {
255 /* Detect Zenkakaku Kana */
256 strcpy(&obuf[olen], kana_table1[p].hankaku);
257 olen += kana_table1[p].byte;
260 obuf[olen++] = src[ii + 0];
261 obuf[olen++] = src[ii + 1];
267 && (secondbyte >= 0x41 && secondbyte <= 0x4b)) {
268 unsigned char p = secondbyte - 0x41;
269 if (kana_table2[p].byte != 0) {
270 /* Detect Zenkakaku Kana */
271 strcpy(&obuf[olen], kana_table2[p].hankaku);
272 olen += kana_table2[p].byte;
275 obuf[olen++] = src[ii + 0];
276 obuf[olen++] = src[ii + 1];
282 && (secondbyte >= 0x75 && secondbyte <= 0x76)) {
283 unsigned char p = secondbyte - 0x75;
284 if (kana_table3[p].byte != 0) {
285 /* Detect Zenkakaku Kana */
286 strcpy(&obuf[olen], kana_table3[p].hankaku);
287 olen += kana_table3[p].byte;
290 obuf[olen++] = src[ii + 0];
291 obuf[olen++] = src[ii + 1];
297 && (secondbyte >= 0x5b && secondbyte <= 0x5b)) {
298 unsigned char p = secondbyte - 0x5b;
299 if (kana_table4[p].byte != 0) {
300 /* Detect Zenkakaku Kana */
301 strcpy(&obuf[olen], kana_table4[p].hankaku);
302 olen += kana_table4[p].byte;
305 obuf[olen++] = src[ii + 0];
306 obuf[olen++] = src[ii + 1];
313 && (secondbyte >= 0x60 && secondbyte <= 0x79)) {
314 unsigned char p = secondbyte - 0x60;
315 if (alpha_table_uc[p].byte != 0) {
316 /* Detect Zenkaku Alphabet */
317 strcpy(&obuf[olen], alpha_table_uc[p].hankaku);
318 olen += alpha_table_uc[p].byte;
321 obuf[olen++] = src[ii + 0];
322 obuf[olen++] = src[ii + 1];
325 else /* Lower case */
328 && (secondbyte >= 0x81 && secondbyte <= 0x9a)) {
329 unsigned char p = secondbyte - 0x81;
330 if (alpha_table_lc[p].byte != 0) {
331 /* Detect Zenkaku Alphabet */
332 strcpy(&obuf[olen], alpha_table_lc[p].hankaku);
333 olen += alpha_table_lc[p].byte;
336 obuf[olen++] = src[ii + 0];
337 obuf[olen++] = src[ii + 1];
343 && (secondbyte >= 0x4F && secondbyte <= 0x58)) {
344 unsigned char p = secondbyte - 0x4F;
345 /* Detect Zenkaku Number */
346 obuf[olen] = '0' + p;
350 obuf[olen++] = src[ii + 0];
351 obuf[olen++] = src[ii + 1];
356 obuf[olen++] = src[ii];
361 DBG(r,"REQ[%X] end chxj_conv_z2h_kana()", (unsigned int)(apr_size_t)r);