|
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