1 : /*
2 : * "streamable kanji code filter and converter"
3 : * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
4 : *
5 : * LICENSE NOTICES
6 : *
7 : * This file is part of "streamable kanji code filter and converter",
8 : * which is distributed under the terms of GNU Lesser General Public
9 : * License (version 2) as published by the Free Software Foundation.
10 : *
11 : * This software is distributed in the hope that it will be useful,
12 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : * GNU Lesser General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU Lesser General Public
17 : * License along with "streamable kanji code filter and converter";
18 : * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
19 : * Suite 330, Boston, MA 02111-1307 USA
20 : *
21 : * The author of this file:
22 : *
23 : */
24 : /*
25 : * The source code included in this files was separated from mbfilter.c
26 : * by Moriyoshi Koizumi <moriyoshi@php.net> on 20 Dec 2002. The file
27 : * mbfilter.c is included in this package .
28 : *
29 : */
30 :
31 : #ifdef HAVE_CONFIG_H
32 : #include "config.h"
33 : #endif
34 :
35 : #ifdef HAVE_STDDEF_H
36 : #include <stddef.h>
37 : #endif
38 :
39 : #include "mbfl_ident.h"
40 : #include "mbfl_allocators.h"
41 : #include "mbfilter_pass.h"
42 : #include "mbfilter_8bit.h"
43 : #include "mbfilter_wchar.h"
44 :
45 : #include "filters/mbfilter_euc_cn.h"
46 : #include "filters/mbfilter_hz.h"
47 : #include "filters/mbfilter_euc_tw.h"
48 : #include "filters/mbfilter_big5.h"
49 : #include "filters/mbfilter_uhc.h"
50 : #include "filters/mbfilter_euc_kr.h"
51 : #include "filters/mbfilter_iso2022_kr.h"
52 : #include "filters/mbfilter_sjis.h"
53 : #include "filters/mbfilter_jis.h"
54 : #include "filters/mbfilter_iso2022_jp_ms.h"
55 : #include "filters/mbfilter_euc_jp.h"
56 : #include "filters/mbfilter_euc_jp_win.h"
57 : #include "filters/mbfilter_ascii.h"
58 : #include "filters/mbfilter_koi8r.h"
59 : #include "filters/mbfilter_cp866.h"
60 : #include "filters/mbfilter_cp932.h"
61 : #include "filters/mbfilter_cp936.h"
62 : #include "filters/mbfilter_cp1251.h"
63 : #include "filters/mbfilter_cp1252.h"
64 : #include "filters/mbfilter_cp51932.h"
65 : #include "filters/mbfilter_iso8859_1.h"
66 : #include "filters/mbfilter_iso8859_2.h"
67 : #include "filters/mbfilter_iso8859_3.h"
68 : #include "filters/mbfilter_iso8859_4.h"
69 : #include "filters/mbfilter_iso8859_5.h"
70 : #include "filters/mbfilter_iso8859_6.h"
71 : #include "filters/mbfilter_iso8859_7.h"
72 : #include "filters/mbfilter_iso8859_8.h"
73 : #include "filters/mbfilter_iso8859_9.h"
74 : #include "filters/mbfilter_iso8859_10.h"
75 : #include "filters/mbfilter_iso8859_13.h"
76 : #include "filters/mbfilter_iso8859_14.h"
77 : #include "filters/mbfilter_iso8859_15.h"
78 : #include "filters/mbfilter_base64.h"
79 : #include "filters/mbfilter_qprint.h"
80 : #include "filters/mbfilter_uuencode.h"
81 : #include "filters/mbfilter_7bit.h"
82 : #include "filters/mbfilter_utf7.h"
83 : #include "filters/mbfilter_utf7imap.h"
84 : #include "filters/mbfilter_utf8.h"
85 : #include "filters/mbfilter_utf16.h"
86 : #include "filters/mbfilter_utf32.h"
87 : #include "filters/mbfilter_byte2.h"
88 : #include "filters/mbfilter_byte4.h"
89 : #include "filters/mbfilter_ucs4.h"
90 : #include "filters/mbfilter_ucs2.h"
91 : #include "filters/mbfilter_htmlent.h"
92 : #include "filters/mbfilter_armscii8.h"
93 :
94 : static const struct mbfl_identify_vtbl vtbl_identify_false = {
95 : mbfl_no_encoding_pass,
96 : mbfl_filt_ident_false_ctor,
97 : mbfl_filt_ident_common_dtor,
98 : mbfl_filt_ident_false };
99 :
100 :
101 : static const struct mbfl_identify_vtbl *mbfl_identify_filter_list[] = {
102 : &vtbl_identify_utf8,
103 : &vtbl_identify_utf7,
104 : &vtbl_identify_ascii,
105 : &vtbl_identify_eucjp,
106 : &vtbl_identify_sjis,
107 : &vtbl_identify_eucjpwin,
108 : &vtbl_identify_sjiswin,
109 : &vtbl_identify_jis,
110 : &vtbl_identify_2022jp,
111 : &vtbl_identify_2022jpms,
112 : &vtbl_identify_cp51932,
113 : &vtbl_identify_euccn,
114 : &vtbl_identify_cp936,
115 : &vtbl_identify_hz,
116 : &vtbl_identify_euctw,
117 : &vtbl_identify_big5,
118 : &vtbl_identify_euckr,
119 : &vtbl_identify_uhc,
120 : &vtbl_identify_2022kr,
121 : &vtbl_identify_cp1251,
122 : &vtbl_identify_cp866,
123 : &vtbl_identify_koi8r,
124 : &vtbl_identify_cp1252,
125 : &vtbl_identify_8859_1,
126 : &vtbl_identify_8859_2,
127 : &vtbl_identify_8859_3,
128 : &vtbl_identify_8859_4,
129 : &vtbl_identify_8859_5,
130 : &vtbl_identify_8859_6,
131 : &vtbl_identify_8859_7,
132 : &vtbl_identify_8859_8,
133 : &vtbl_identify_8859_9,
134 : &vtbl_identify_8859_10,
135 : &vtbl_identify_8859_13,
136 : &vtbl_identify_8859_14,
137 : &vtbl_identify_8859_15,
138 : &vtbl_identify_armscii8,
139 : &vtbl_identify_false,
140 : NULL
141 : };
142 :
143 :
144 :
145 : /*
146 : * identify filter
147 : */
148 : const struct mbfl_identify_vtbl * mbfl_identify_filter_get_vtbl(enum mbfl_no_encoding encoding)
149 118 : {
150 : const struct mbfl_identify_vtbl * vtbl;
151 : int i;
152 :
153 118 : i = 0;
154 619 : while ((vtbl = mbfl_identify_filter_list[i++]) != NULL) {
155 501 : if (vtbl->encoding == encoding) {
156 118 : break;
157 : }
158 : }
159 :
160 118 : return vtbl;
161 : }
162 :
163 : mbfl_identify_filter *mbfl_identify_filter_new(enum mbfl_no_encoding encoding)
164 30 : {
165 : mbfl_identify_filter *filter;
166 :
167 : /* allocate */
168 30 : filter = (mbfl_identify_filter *)mbfl_malloc(sizeof(mbfl_identify_filter));
169 30 : if (filter == NULL) {
170 0 : return NULL;
171 : }
172 :
173 30 : if (mbfl_identify_filter_init(filter, encoding)) {
174 0 : mbfl_free(filter);
175 0 : return NULL;
176 : }
177 :
178 30 : return filter;
179 : }
180 :
181 : int mbfl_identify_filter_init(mbfl_identify_filter *filter, enum mbfl_no_encoding encoding)
182 118 : {
183 : const struct mbfl_identify_vtbl *vtbl;
184 :
185 : /* encoding structure */
186 118 : filter->encoding = mbfl_no2encoding(encoding);
187 118 : if (filter->encoding == NULL) {
188 0 : filter->encoding = &mbfl_encoding_pass;
189 : }
190 :
191 118 : filter->status = 0;
192 118 : filter->flag = 0;
193 118 : filter->score = 0;
194 :
195 : /* setup the function table */
196 118 : vtbl = mbfl_identify_filter_get_vtbl(filter->encoding->no_encoding);
197 118 : if (vtbl == NULL) {
198 0 : vtbl = &vtbl_identify_false;
199 : }
200 118 : filter->filter_ctor = vtbl->filter_ctor;
201 118 : filter->filter_dtor = vtbl->filter_dtor;
202 118 : filter->filter_function = vtbl->filter_function;
203 :
204 : /* constructor */
205 118 : (*filter->filter_ctor)(filter);
206 :
207 118 : return 0;
208 : }
209 :
210 : void mbfl_identify_filter_delete(mbfl_identify_filter *filter)
211 30 : {
212 30 : if (filter == NULL) {
213 0 : return;
214 : }
215 :
216 30 : mbfl_identify_filter_cleanup(filter);
217 30 : mbfl_free((void*)filter);
218 : }
219 :
220 : void mbfl_identify_filter_cleanup(mbfl_identify_filter *filter)
221 118 : {
222 118 : (*filter->filter_dtor)(filter);
223 118 : }
224 :
225 : void mbfl_filt_ident_common_ctor(mbfl_identify_filter *filter)
226 118 : {
227 118 : filter->status = 0;
228 118 : filter->flag = 0;
229 118 : }
230 :
231 : void mbfl_filt_ident_common_dtor(mbfl_identify_filter *filter)
232 118 : {
233 118 : filter->status = 0;
234 118 : }
235 :
236 : int mbfl_filt_ident_false(int c, mbfl_identify_filter *filter)
237 0 : {
238 0 : filter->flag = 1; /* bad */
239 0 : return c;
240 : }
241 :
242 : void mbfl_filt_ident_false_ctor(mbfl_identify_filter *filter)
243 0 : {
244 0 : filter->status = 0;
245 0 : filter->flag = 1;
246 0 : }
247 :
248 : int mbfl_filt_ident_true(int c, mbfl_identify_filter *filter)
249 0 : {
250 0 : return c;
251 : }
|