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, &copyright_state_start_fun_v4,
256 			&copyright_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