OSDN Git Service

* Added Zenkaku Alphabet -> Hankaku Alphabet function.
[modchxj/mod_chxj.git] / src / chxj_conv_z2h_kana.c
1 /*
2  * Copyright (C) 2005-2008 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 /**
134  */
135 char *
136 chxj_conv_z2h_kana(request_rec *r, const char *src, apr_size_t *len, chxjconvrule_entry *entryp)
137 {
138   apr_size_t          ii;
139   apr_size_t          ilen;
140   apr_pool_t          *pool;
141   char                *obuf;
142   apr_size_t          olen;
143
144   DBG(r,"REQ[%X] start chxj_conv_z2h_kana()", (unsigned int)(apr_size_t)r);
145
146   if (entryp->action & CONVRULE_Z2H_OFF_BIT) {
147     DBG(r,"REQ[%X] Detect Z2hOff", (unsigned int)(apr_size_t)r);
148     DBG(r,"REQ[%X] end chxj_conv_z2h_kana()", (unsigned int)(apr_size_t)r);
149     return (char *)src;
150   }
151   if (! (entryp->action & CONVRULE_Z2H_ON_BIT)) {
152     DBG(r,"REQ[%X] Detect Z2hOff", (unsigned int)(apr_size_t)r);
153     DBG(r,"REQ[%X] end chxj_conv_z2h_kana()", (unsigned int)(apr_size_t)r);
154     return (char *)src;
155   }
156
157   apr_pool_create(&pool, r->pool);
158
159   olen = 0;
160   ilen = *len;
161
162   obuf = apr_palloc(pool, ilen + 1);
163   if (! obuf) {
164     ERR(r,"%s:%d REQ[%X] memory allocation error", __FILE__,__LINE__,(unsigned int)(apr_size_t)r);
165     return (char*)src;
166   }
167
168   memset(obuf, 0, ilen + 1);
169   for (ii=0; ii<ilen; ii++) {
170     /* sjis only */
171     if (is_sjis_kana(src[ii])) {
172       obuf[olen++] = src[ii];
173     }
174     else if (is_sjis_kanji(src[ii])) {
175       unsigned char firstbyte  = src[ii + 0];
176       unsigned char secondbyte = src[ii + 1];
177       if (   firstbyte == 0x83
178           && (secondbyte >= 0x40 && secondbyte <= 0x96)) {
179         unsigned char p = secondbyte - 0x40;
180         if (kana_table1[p].byte != 0) {
181           /* Detect Zenkakaku Kana */
182           strcpy(&obuf[olen], kana_table1[p].hankaku);
183           olen += kana_table1[p].byte;
184         }
185         else {
186           obuf[olen++] = src[ii + 0];
187           obuf[olen++] = src[ii + 1];
188         }
189       }
190       else
191       if (   firstbyte == 0x81
192           && (secondbyte >= 0x41 && secondbyte <= 0x4b)) {
193         unsigned char p = secondbyte - 0x41;
194         if (kana_table2[p].byte != 0) {
195           /* Detect Zenkakaku Kana */
196           strcpy(&obuf[olen], kana_table2[p].hankaku);
197           olen += kana_table2[p].byte;
198         }
199         else {
200           obuf[olen++] = src[ii + 0];
201           obuf[olen++] = src[ii + 1];
202         }
203       }
204       else
205       if (   firstbyte == 0x81
206           && (secondbyte >= 0x75 && secondbyte <= 0x76)) {
207         unsigned char p = secondbyte - 0x75;
208         if (kana_table3[p].byte != 0) {
209           /* Detect Zenkakaku Kana */
210           strcpy(&obuf[olen], kana_table3[p].hankaku);
211           olen += kana_table3[p].byte;
212         }
213         else {
214           obuf[olen++] = src[ii + 0];
215           obuf[olen++] = src[ii + 1];
216         }
217       }
218       else
219       if (   firstbyte == 0x81
220           && (secondbyte >= 0x5b && secondbyte <= 0x5b)) {
221         unsigned char p = secondbyte - 0x5b;
222         if (kana_table4[p].byte != 0) {
223           /* Detect Zenkakaku Kana */
224           strcpy(&obuf[olen], kana_table4[p].hankaku);
225           olen += kana_table4[p].byte;
226         }
227         else {
228           obuf[olen++] = src[ii + 0];
229           obuf[olen++] = src[ii + 1];
230         }
231       }
232       else {
233         obuf[olen++] = src[ii + 0];
234         obuf[olen++] = src[ii + 1];
235       }
236       ii++;
237     }
238     else {
239       obuf[olen++] = src[ii];
240     }
241   }
242   *len = olen;
243
244   DBG(r,"REQ[%X] end chxj_conv_z2h_kana()", (unsigned int)(apr_size_t)r);
245   return obuf;
246 }
247 /*
248  * vim: ts=2 et
249  */