OSDN Git Service

* Fixed warning
[modchxj/mod_chxj.git] / src / chxj_conv_z2h.c
1 /*
2  * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
3  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
4  *
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
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  */
17 #include "mod_chxj.h"
18 #include "chxj_conv_z2h.h"
19 #include "chxj_url_encode.h"
20 #include "qs_parse_string.h"
21 #include <errno.h>
22
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",},
111 };
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",},
124 };
125 static z2h_table_t kana_table3[] = {
126   { /* 0x8175 「*/ 1, "\xa2",},
127   { /* 0x8176 」*/ 1, "\xa3",},
128 };
129 static z2h_table_t kana_table4[] = {
130   { /* 0x815b ゛*/ 1, "\xb0",},
131 };
132
133 static z2h_table_t alpha_table_uc[] = {
134   { 1, "A",},
135   { 1, "B",},
136   { 1, "C",},
137   { 1, "D",},
138   { 1, "E",},
139   { 1, "F",},
140   { 1, "G",},
141   { 1, "H",},
142   { 1, "I",},
143   { 1, "J",},
144   { 1, "K",},
145   { 1, "L",},
146   { 1, "M",},
147   { 1, "N",},
148   { 1, "O",},
149   { 1, "P",},
150   { 1, "Q",},
151   { 1, "R",},
152   { 1, "S",},
153   { 1, "T",},
154   { 1, "U",},
155   { 1, "V",},
156   { 1, "W",},
157   { 1, "X",},
158   { 1, "Y",},
159   { 1, "Z",},
160 };
161 static z2h_table_t alpha_table_lc[] = {
162   { 1, "a",},
163   { 1, "b",},
164   { 1, "c",},
165   { 1, "d",},
166   { 1, "e",},
167   { 1, "f",},
168   { 1, "g",},
169   { 1, "h",},
170   { 1, "i",},
171   { 1, "j",},
172   { 1, "k",},
173   { 1, "l",},
174   { 1, "m",},
175   { 1, "n",},
176   { 1, "o",},
177   { 1, "p",},
178   { 1, "q",},
179   { 1, "r",},
180   { 1, "s",},
181   { 1, "t",},
182   { 1, "u",},
183   { 1, "v",},
184   { 1, "w",},
185   { 1, "x",},
186   { 1, "y",},
187   { 1, "z",},
188 };
189 /**
190  */
191 char *
192 chxj_conv_z2h(request_rec *r, const char *src, apr_size_t *len, chxjconvrule_entry *entryp)
193 {
194   apr_size_t          ii;
195   apr_size_t          ilen;
196   apr_pool_t          *pool;
197   char                *obuf;
198   apr_size_t          olen;
199   int                 z2h_kana_flag = 0;
200   int                 z2h_alpha_flag = 0;
201   int                 z2h_num_flag = 0;
202
203   DBG(r,"REQ[%X] start chxj_conv_z2h()", (unsigned int)(apr_size_t)r);
204
205   if (entryp->action & CONVRULE_Z2H_ON_BIT) {
206     z2h_kana_flag = 1;
207   }
208   if (entryp->action & CONVRULE_Z2H_OFF_BIT) {
209     z2h_kana_flag = 0;
210   }
211   if (entryp->action & CONVRULE_Z2H_ALPHA_ON_BIT) {
212     z2h_alpha_flag = 1;
213   }
214   if (entryp->action & CONVRULE_Z2H_ALPHA_OFF_BIT) {
215     z2h_alpha_flag = 0;
216   }
217   if (entryp->action & CONVRULE_Z2H_NUM_ON_BIT) {
218     z2h_num_flag = 1;
219   }
220   if (entryp->action & CONVRULE_Z2H_NUM_OFF_BIT) {
221     z2h_num_flag = 0;
222   }
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);
226     return (char *)src;
227   }
228
229   apr_pool_create(&pool, r->pool);
230
231   olen = 0;
232   ilen = *len;
233
234   obuf = apr_palloc(pool, ilen + 1);
235   if (! obuf) {
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);
238     return (char*)src;
239   }
240
241   memset(obuf, 0, ilen + 1);
242   for (ii=0; ii<ilen; ii++) {
243     /* sjis only */
244     if (is_sjis_kana(src[ii])) {
245       obuf[olen++] = src[ii];
246     }
247     else if (is_sjis_kanji(src[ii])) {
248       unsigned char firstbyte  = src[ii + 0];
249       unsigned char secondbyte = src[ii + 1];
250       if (   z2h_kana_flag
251           && firstbyte == 0x83
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;
258         }
259         else {
260           obuf[olen++] = src[ii + 0];
261           obuf[olen++] = src[ii + 1];
262         }
263       }
264       else
265       if (   z2h_kana_flag
266           && firstbyte == 0x81
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;
273         }
274         else {
275           obuf[olen++] = src[ii + 0];
276           obuf[olen++] = src[ii + 1];
277         }
278       }
279       else
280       if (   z2h_kana_flag
281           && firstbyte == 0x81
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;
288         }
289         else {
290           obuf[olen++] = src[ii + 0];
291           obuf[olen++] = src[ii + 1];
292         }
293       }
294       else
295       if (   z2h_kana_flag
296           && firstbyte == 0x81
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;
303         }
304         else {
305           obuf[olen++] = src[ii + 0];
306           obuf[olen++] = src[ii + 1];
307         }
308       }
309       else
310       /* Upper case */
311       if (   z2h_alpha_flag
312           && firstbyte == 0x82
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;
319         }
320         else {
321           obuf[olen++] = src[ii + 0];
322           obuf[olen++] = src[ii + 1];
323         }
324       }
325       else /* Lower case */
326       if (   z2h_alpha_flag
327           && firstbyte == 0x82
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;
334         }
335         else {
336           obuf[olen++] = src[ii + 0];
337           obuf[olen++] = src[ii + 1];
338         }
339       }
340       else
341       if (   z2h_num_flag
342           && firstbyte == 0x82
343           && (secondbyte >= 0x4F && secondbyte <= 0x58)) {
344         unsigned char p = secondbyte - 0x4F;
345         /* Detect Zenkaku Number */
346         obuf[olen] = '0' + p;
347         olen++;
348       }
349       else {
350         obuf[olen++] = src[ii + 0];
351         obuf[olen++] = src[ii + 1];
352       }
353       ii++;
354     }
355     else {
356       obuf[olen++] = src[ii];
357     }
358   }
359   *len = olen;
360
361   DBG(r,"REQ[%X] end chxj_conv_z2h_kana()", (unsigned int)(apr_size_t)r);
362   return obuf;
363 }
364 /*
365  * vim: ts=2 et
366  */