|
95 | 95 |
|
96 | 96 | #include "rare_cp_bitvec.h" |
97 | 97 |
|
98 | | -/* |
99 | | - * buffering converter |
100 | | - */ |
101 | | -mbfl_buffer_converter * |
102 | | -mbfl_buffer_converter_new( |
103 | | - const mbfl_encoding *from, |
104 | | - const mbfl_encoding *to, |
105 | | - size_t buf_initsz) |
106 | | -{ |
107 | | - mbfl_buffer_converter *convd = emalloc(sizeof(mbfl_buffer_converter)); |
108 | | - convd->to = to; |
109 | | - |
110 | | - /* create convert filter */ |
111 | | - convd->filter1 = NULL; |
112 | | - convd->filter2 = NULL; |
113 | | - if (mbfl_convert_filter_get_vtbl(from, to) != NULL) { |
114 | | - convd->filter1 = mbfl_convert_filter_new(from, to, mbfl_memory_device_output, NULL, &convd->device); |
115 | | - } else { |
116 | | - convd->filter2 = mbfl_convert_filter_new(&mbfl_encoding_wchar, to, mbfl_memory_device_output, NULL, &convd->device); |
117 | | - if (convd->filter2 != NULL) { |
118 | | - convd->filter1 = mbfl_convert_filter_new(from, |
119 | | - &mbfl_encoding_wchar, |
120 | | - (output_function_t)convd->filter2->filter_function, |
121 | | - (flush_function_t)convd->filter2->filter_flush, |
122 | | - convd->filter2); |
123 | | - if (convd->filter1 == NULL) { |
124 | | - mbfl_convert_filter_delete(convd->filter2); |
125 | | - } |
126 | | - } |
127 | | - } |
128 | | - if (convd->filter1 == NULL) { |
129 | | - efree(convd); |
130 | | - return NULL; |
131 | | - } |
132 | | - |
133 | | - mbfl_memory_device_init(&convd->device, buf_initsz, buf_initsz/4); |
134 | | - |
135 | | - return convd; |
136 | | -} |
137 | | - |
138 | | -void mbfl_buffer_converter_delete(mbfl_buffer_converter *convd) |
139 | | -{ |
140 | | - mbfl_convert_filter_delete(convd->filter1); |
141 | | - if (convd->filter2) { |
142 | | - mbfl_convert_filter_delete(convd->filter2); |
143 | | - } |
144 | | - mbfl_memory_device_clear(&convd->device); |
145 | | - efree((void*)convd); |
146 | | -} |
147 | | - |
148 | | -void mbfl_buffer_converter_illegal_mode(mbfl_buffer_converter *convd, int mode) |
149 | | -{ |
150 | | - if (convd->filter2) { |
151 | | - convd->filter2->illegal_mode = mode; |
152 | | - } else { |
153 | | - convd->filter1->illegal_mode = mode; |
154 | | - } |
155 | | -} |
156 | | - |
157 | | -void mbfl_buffer_converter_illegal_substchar(mbfl_buffer_converter *convd, uint32_t substchar) |
158 | | -{ |
159 | | - if (convd->filter2) { |
160 | | - convd->filter2->illegal_substchar = substchar; |
161 | | - } else { |
162 | | - convd->filter1->illegal_substchar = substchar; |
163 | | - } |
164 | | -} |
165 | | - |
166 | | -size_t mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *string) |
167 | | -{ |
168 | | - size_t n; |
169 | | - unsigned char *p; |
170 | | - mbfl_convert_filter *filter; |
171 | | - |
172 | | - ZEND_ASSERT(convd); |
173 | | - ZEND_ASSERT(string); |
174 | | - |
175 | | - mbfl_memory_device_realloc(&convd->device, convd->device.pos + string->len, string->len/4); |
176 | | - /* feed data */ |
177 | | - n = string->len; |
178 | | - p = string->val; |
179 | | - |
180 | | - filter = convd->filter1; |
181 | | - if (filter != NULL) { |
182 | | - while (n > 0) { |
183 | | - if ((*filter->filter_function)(*p++, filter) < 0) { |
184 | | - return p - string->val; |
185 | | - } |
186 | | - n--; |
187 | | - } |
188 | | - } |
189 | | - return p - string->val; |
190 | | -} |
191 | | - |
192 | | -void mbfl_buffer_converter_flush(mbfl_buffer_converter *convd) |
193 | | -{ |
194 | | - mbfl_convert_filter_flush(convd->filter1); |
195 | | -} |
196 | | - |
197 | | -mbfl_string* mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result) |
198 | | -{ |
199 | | - result->encoding = convd->to; |
200 | | - return mbfl_memory_device_result(&convd->device, result); |
201 | | -} |
202 | | - |
203 | | -mbfl_string* mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result) |
204 | | -{ |
205 | | - mbfl_buffer_converter_feed(convd, string); |
206 | | - mbfl_convert_filter_flush(convd->filter1); |
207 | | - result->encoding = convd->to; |
208 | | - return mbfl_memory_device_result(&convd->device, result); |
209 | | -} |
210 | | - |
211 | | -size_t mbfl_buffer_illegalchars(mbfl_buffer_converter *convd) |
212 | | -{ |
213 | | - size_t num_illegalchars = convd->filter1->num_illegalchar; |
214 | | - |
215 | | - if (convd->filter2) { |
216 | | - num_illegalchars += convd->filter2->num_illegalchar; |
217 | | - } |
218 | | - |
219 | | - return num_illegalchars; |
220 | | -} |
221 | | - |
222 | 98 | /* |
223 | 99 | * encoding detector |
224 | 100 | */ |
|
0 commit comments