1 /* <!-- copyright */
2 /*
3 * libmetalink
4 *
5 * Copyright (c) 2008 Tatsuhiro Tsujikawa
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE.
24 */
25 /* copyright --> */
26 #include "metalink_pstm.h"
27
28 #include <string.h>
29
new_metalink_pstm(void)30 metalink_pstm_t* new_metalink_pstm(void)
31 {
32 metalink_pstm_t* stm;
33
34 stm = malloc(sizeof(metalink_pstm_t));
35 if(!stm) {
36 return NULL;
37 }
38 stm->state = NULL;
39 stm->ctrl = new_metalink_pctrl();
40 if(!stm->ctrl) {
41 goto NEW_METALINK_PSTM_ERROR;
42 }
43 stm->state = new_metalink_pstate();
44 if(!stm->state) {
45 goto NEW_METALINK_PSTM_ERROR;
46 }
47
48 metalink_pstm_set_fun(stm, &initial_state_start_fun, &initial_state_end_fun);
49
50 return stm;
51
52 NEW_METALINK_PSTM_ERROR:
53 delete_metalink_pstm(stm);
54 return NULL;
55 }
56
delete_metalink_pstm(metalink_pstm_t * stm)57 void delete_metalink_pstm(metalink_pstm_t* stm)
58 {
59 if(!stm) {
60 return;
61 }
62 delete_metalink_pctrl(stm->ctrl);
63 delete_metalink_pstate(stm->state);
64 free(stm);
65 }
66
metalink_pstm_character_buffering_enabled(const metalink_pstm_t * stm)67 int metalink_pstm_character_buffering_enabled(const metalink_pstm_t* stm)
68 {
69 return stm->state->character_buffering;
70 }
71
metalink_pstm_enable_character_buffering(metalink_pstm_t * stm)72 void metalink_pstm_enable_character_buffering(metalink_pstm_t* stm)
73 {
74 stm->state->character_buffering = 1;
75 }
76
metalink_pstm_disable_character_buffering(metalink_pstm_t * stm)77 void metalink_pstm_disable_character_buffering(metalink_pstm_t* stm)
78 {
79 stm->state->character_buffering = 0;
80 }
81
metalink_pstm_set_fun(metalink_pstm_t * stm,metalink_start_fun start_fun,metalink_end_fun end_fun)82 void metalink_pstm_set_fun(metalink_pstm_t* stm,
83 metalink_start_fun start_fun,
84 metalink_end_fun end_fun)
85 {
86 stm->state->start_fun = start_fun;
87 stm->state->end_fun = end_fun;
88 }
89
metalink_pstm_enter_null_state(metalink_pstm_t * stm)90 void metalink_pstm_enter_null_state(metalink_pstm_t* stm)
91 {
92 metalink_pstm_set_fun(stm, &null_state_start_fun, &null_state_end_fun);
93 metalink_pstm_disable_character_buffering(stm);
94 }
95
metalink_pstm_enter_metalink_state(metalink_pstm_t * stm)96 void metalink_pstm_enter_metalink_state(metalink_pstm_t* stm)
97 {
98 metalink_pstm_set_fun(stm, &metalink_state_start_fun_v3, &metalink_state_end_fun_v3);
99 metalink_pstm_disable_character_buffering(stm);
100 }
101
metalink_pstm_enter_metalink_state_v4(metalink_pstm_t * stm)102 void metalink_pstm_enter_metalink_state_v4(metalink_pstm_t* stm)
103 {
104 metalink_pstm_set_fun(stm, &metalink_state_start_fun_v4, &metalink_state_end_fun_v4);
105 metalink_pstm_disable_character_buffering(stm);
106 }
107
metalink_pstm_enter_identity_state(metalink_pstm_t * stm)108 void metalink_pstm_enter_identity_state(metalink_pstm_t* stm)
109 {
110 metalink_pstm_set_fun(stm, &identity_state_start_fun_v3, &identity_state_end_fun_v3);
111 metalink_pstm_disable_character_buffering(stm);
112 }
113
metalink_pstm_enter_tags_state(metalink_pstm_t * stm)114 void metalink_pstm_enter_tags_state(metalink_pstm_t* stm)
115 {
116 metalink_pstm_set_fun(stm, &tags_state_start_fun_v3, &tags_state_end_fun_v3);
117 metalink_pstm_disable_character_buffering(stm);
118 }
119
metalink_pstm_enter_files_state(metalink_pstm_t * stm)120 void metalink_pstm_enter_files_state(metalink_pstm_t* stm)
121 {
122 metalink_pstm_set_fun(stm, &files_state_start_fun_v3, &files_state_end_fun_v3);
123 metalink_pstm_enable_character_buffering(stm);
124 }
125
metalink_pstm_enter_file_state(metalink_pstm_t * stm)126 void metalink_pstm_enter_file_state(metalink_pstm_t* stm)
127 {
128 metalink_pstm_set_fun(stm, &file_state_start_fun_v3, &file_state_end_fun_v3);
129 metalink_pstm_enable_character_buffering(stm);
130 }
131
metalink_pstm_enter_size_state(metalink_pstm_t * stm)132 void metalink_pstm_enter_size_state(metalink_pstm_t* stm)
133 {
134 metalink_pstm_set_fun(stm, &size_state_start_fun, &size_state_end_fun);
135 metalink_pstm_enable_character_buffering(stm);
136 }
137
metalink_pstm_enter_version_state(metalink_pstm_t * stm)138 void metalink_pstm_enter_version_state(metalink_pstm_t* stm)
139 {
140 metalink_pstm_set_fun(stm, &version_state_start_fun, &version_state_end_fun);
141 metalink_pstm_enable_character_buffering(stm);
142 }
143
metalink_pstm_enter_language_state(metalink_pstm_t * stm)144 void metalink_pstm_enter_language_state(metalink_pstm_t* stm)
145 {
146 metalink_pstm_set_fun(stm, &language_state_start_fun, &language_state_end_fun);
147 metalink_pstm_enable_character_buffering(stm);
148 }
149
metalink_pstm_enter_os_state(metalink_pstm_t * stm)150 void metalink_pstm_enter_os_state(metalink_pstm_t* stm)
151 {
152 metalink_pstm_set_fun(stm, &os_state_start_fun, &os_state_end_fun);
153 metalink_pstm_enable_character_buffering(stm);
154 }
155
metalink_pstm_enter_resources_state(metalink_pstm_t * stm)156 void metalink_pstm_enter_resources_state(metalink_pstm_t* stm)
157 {
158 metalink_pstm_set_fun(stm, &resources_state_start_fun_v3, &resources_state_end_fun_v3);
159 metalink_pstm_enable_character_buffering(stm);
160 }
161
metalink_pstm_enter_url_state(metalink_pstm_t * stm)162 void metalink_pstm_enter_url_state(metalink_pstm_t* stm)
163 {
164 metalink_pstm_set_fun(stm, &url_state_start_fun, &url_state_end_fun);
165 metalink_pstm_enable_character_buffering(stm);
166 }
167
metalink_pstm_enter_verification_state(metalink_pstm_t * stm)168 void metalink_pstm_enter_verification_state(metalink_pstm_t* stm)
169 {
170 metalink_pstm_set_fun(stm, &verification_state_start_fun_v3,
171 &verification_state_end_fun_v3);
172 metalink_pstm_enable_character_buffering(stm);
173 }
174
metalink_pstm_enter_hash_state(metalink_pstm_t * stm)175 void metalink_pstm_enter_hash_state(metalink_pstm_t* stm)
176 {
177 metalink_pstm_set_fun(stm, &hash_state_start_fun, &hash_state_end_fun);
178 metalink_pstm_enable_character_buffering(stm);
179 }
180
metalink_pstm_enter_pieces_state(metalink_pstm_t * stm)181 void metalink_pstm_enter_pieces_state(metalink_pstm_t* stm)
182 {
183 metalink_pstm_set_fun(stm, &pieces_state_start_fun_v3, &pieces_state_end_fun_v3);
184 metalink_pstm_enable_character_buffering(stm);
185 }
186
metalink_pstm_enter_piece_hash_state(metalink_pstm_t * stm)187 void metalink_pstm_enter_piece_hash_state(metalink_pstm_t* stm)
188 {
189 metalink_pstm_set_fun(stm, &piece_hash_state_start_fun,
190 &piece_hash_state_end_fun);
191 metalink_pstm_enable_character_buffering(stm);
192 }
193
metalink_pstm_enter_fin_state(metalink_pstm_t * stm)194 void metalink_pstm_enter_fin_state(metalink_pstm_t* stm)
195 {
196 metalink_pstm_set_fun(stm, &fin_state_start_fun, &fin_state_end_fun);
197 metalink_pstm_disable_character_buffering(stm);
198 }
199
metalink_pstm_enter_skip_state(metalink_pstm_t * stm)200 void metalink_pstm_enter_skip_state(metalink_pstm_t* stm)
201 {
202 stm->state->before_skip_state_start_fun = stm->state->start_fun;
203 stm->state->before_skip_state_end_fun = stm->state->end_fun;
204
205 metalink_pstm_set_fun(stm, &skip_state_start_fun, &skip_state_end_fun);
206
207 metalink_pstm_disable_character_buffering(stm);
208 stm->state->skip_depth = 1;
209 }
210
metalink_pstm_exit_skip_state(metalink_pstm_t * stm)211 void metalink_pstm_exit_skip_state(metalink_pstm_t* stm)
212 {
213 metalink_pstm_set_fun(stm,
214 stm->state->before_skip_state_start_fun,
215 stm->state->before_skip_state_end_fun);
216
217 if(stm->state->before_skip_character_buffering) {
218 metalink_pstm_enable_character_buffering(stm);
219 } else {
220 metalink_pstm_disable_character_buffering(stm);
221 }
222 }
223
224 /* Metalink 4 states */
metalink_pstm_enter_file_state_v4(metalink_pstm_t * stm)225 void metalink_pstm_enter_file_state_v4(metalink_pstm_t* stm)
226 {
227 metalink_pstm_set_fun(stm, &file_state_start_fun_v4,
228 &file_state_end_fun_v4);
229 metalink_pstm_disable_character_buffering(stm);
230 }
231
metalink_pstm_enter_generator_state(metalink_pstm_t * stm)232 void metalink_pstm_enter_generator_state(metalink_pstm_t* stm)
233 {
234 metalink_pstm_set_fun(stm, &generator_state_start_fun_v4,
235 &generator_state_end_fun_v4);
236 metalink_pstm_enable_character_buffering(stm);
237 }
238
metalink_pstm_enter_origin_state(metalink_pstm_t * stm)239 void metalink_pstm_enter_origin_state(metalink_pstm_t* stm)
240 {
241 metalink_pstm_set_fun(stm, &origin_state_start_fun_v4,
242 &origin_state_end_fun_v4);
243 metalink_pstm_enable_character_buffering(stm);
244 }
245
metalink_pstm_enter_description_state_v4(metalink_pstm_t * stm)246 void metalink_pstm_enter_description_state_v4(metalink_pstm_t* stm)
247 {
248 metalink_pstm_set_fun(stm, &description_state_start_fun_v4,
249 &description_state_end_fun_v4);
250 metalink_pstm_enable_character_buffering(stm);
251 }
252
metalink_pstm_enter_copyright_state_v4(metalink_pstm_t * stm)253 void metalink_pstm_enter_copyright_state_v4(metalink_pstm_t* stm)
254 {
255 metalink_pstm_set_fun(stm, ©right_state_start_fun_v4,
256 ©right_state_end_fun_v4);
257 metalink_pstm_enable_character_buffering(stm);
258 }
259
metalink_pstm_enter_identity_state_v4(metalink_pstm_t * stm)260 void metalink_pstm_enter_identity_state_v4(metalink_pstm_t* stm)
261 {
262 metalink_pstm_set_fun(stm, &identity_state_start_fun_v4,
263 &identity_state_end_fun_v4);
264 metalink_pstm_enable_character_buffering(stm);
265 }
266
metalink_pstm_enter_logo_state_v4(metalink_pstm_t * stm)267 void metalink_pstm_enter_logo_state_v4(metalink_pstm_t* stm)
268 {
269 metalink_pstm_set_fun(stm, &logo_state_start_fun_v4,
270 &logo_state_end_fun_v4);
271 metalink_pstm_enable_character_buffering(stm);
272 }
273
metalink_pstm_enter_signature_state_v4(metalink_pstm_t * stm)274 void metalink_pstm_enter_signature_state_v4(metalink_pstm_t* stm)
275 {
276 metalink_pstm_set_fun(stm, &signature_state_start_fun_v4,
277 &signature_state_end_fun_v4);
278 metalink_pstm_enable_character_buffering(stm);
279 }
280
metalink_pstm_enter_pieces_state_v4(metalink_pstm_t * stm)281 void metalink_pstm_enter_pieces_state_v4(metalink_pstm_t* stm)
282 {
283 metalink_pstm_set_fun(stm, &pieces_state_start_fun_v4,
284 &pieces_state_end_fun_v4);
285 metalink_pstm_enable_character_buffering(stm);
286 }
287
metalink_pstm_enter_metaurl_state_v4(metalink_pstm_t * stm)288 void metalink_pstm_enter_metaurl_state_v4(metalink_pstm_t* stm)
289 {
290 metalink_pstm_set_fun(stm, &metaurl_state_start_fun_v4,
291 &metaurl_state_end_fun_v4);
292 metalink_pstm_enable_character_buffering(stm);
293 }
294
metalink_pstm_enter_published_state_v4(metalink_pstm_t * stm)295 void metalink_pstm_enter_published_state_v4(metalink_pstm_t* stm)
296 {
297 metalink_pstm_set_fun(stm, &published_state_start_fun_v4,
298 &published_state_end_fun_v4);
299 metalink_pstm_enable_character_buffering(stm);
300 }
301
metalink_pstm_enter_updated_state_v4(metalink_pstm_t * stm)302 void metalink_pstm_enter_updated_state_v4(metalink_pstm_t* stm)
303 {
304 metalink_pstm_set_fun(stm, &updated_state_start_fun_v4,
305 &updated_state_end_fun_v4);
306 metalink_pstm_enable_character_buffering(stm);
307 }
308