Mercurial > mplayer.hg
annotate m_option.c @ 11810:8cce53dd235f
Have the MOV demuxer recognize and display (via MPINFO) registered ISO
and other major brands instead of the usual "Unknown major brand" from
only having "isom" defined.
patch by Shan <sweber@slingshot.co.nz>, approved by Alex
author | diego |
---|---|
date | Tue, 20 Jan 2004 04:59:48 +0000 |
parents | 3f488aa0d646 |
children | 3ccd5dcf447c |
rev | line source |
---|---|
8164 | 1 #include "config.h" |
2 | |
3 #include <stdlib.h> | |
4 #include <string.h> | |
5 #include <math.h> | |
6 #include <stdio.h> | |
7 #include <stdarg.h> | |
8 #include <inttypes.h> | |
8262 | 9 #include <unistd.h> |
8164 | 10 |
11 #include "m_option.h" | |
12 //#include "m_config.h" | |
13 #include "mp_msg.h" | |
11412 | 14 #include "libmpdemux/url.h" |
8164 | 15 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
16 // Don't free for 'production' atm |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
17 #ifndef MP_DEBUG |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
18 #define NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
19 #endif |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
20 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
21 m_option_t* m_option_list_find(m_option_t* list,char* name) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
22 int i; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
23 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
24 for(i = 0 ; list[i].name ; i++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
25 int l = strlen(list[i].name) - 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
26 if((list[i].type->flags & M_OPT_TYPE_ALLOW_WILDCARD) && |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
27 (l > 0) && (list[i].name[l] == '*')) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
28 if(strncasecmp(list[i].name,name,l) == 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
29 return &list[i]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
30 } else if(strcasecmp(list[i].name,name) == 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
31 return &list[i]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
32 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
33 return NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
34 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
35 |
10641 | 36 // Default function that just does a memcpy |
8164 | 37 |
38 static void copy_opt(m_option_t* opt,void* dst,void* src) { | |
39 if(dst && src) | |
40 memcpy(dst,src,opt->type->size); | |
41 } | |
42 | |
43 // Helper for the print funcs (from man printf) | |
44 static char* dup_printf(const char *fmt, ...) { | |
45 /* Guess we need no more than 50 bytes. */ | |
46 int n, size = 50; | |
47 char *p; | |
48 va_list ap; | |
49 if ((p = malloc (size)) == NULL) | |
50 return NULL; | |
51 while (1) { | |
52 /* Try to print in the allocated space. */ | |
53 va_start(ap, fmt); | |
54 n = vsnprintf (p, size, fmt, ap); | |
55 va_end(ap); | |
56 /* If that worked, return the string. */ | |
57 if (n > -1 && n < size) | |
58 return p; | |
59 /* Else try again with more space. */ | |
60 if (n > -1) /* glibc 2.1 */ | |
61 size = n+1; /* precisely what is needed */ | |
62 else /* glibc 2.0 */ | |
63 size *= 2; /* twice the old size */ | |
64 if ((p = realloc (p, size)) == NULL) | |
65 return NULL; | |
66 } | |
67 } | |
68 | |
69 | |
70 // Flag | |
71 | |
72 #define VAL(x) (*(int*)(x)) | |
73 | |
74 static int parse_flag(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
75 if (src == M_CONFIG_FILE) { | |
10355
b39a943c902f
Fix the segfault in case of missing arg for flag options
albeu
parents:
10236
diff
changeset
|
76 if(!param) return M_OPT_MISSING_PARAM; |
8164 | 77 if (!strcasecmp(param, "yes") || /* any other language? */ |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
78 !strcasecmp(param, "on") || |
8164 | 79 !strcasecmp(param, "ja") || |
80 !strcasecmp(param, "si") || | |
81 !strcasecmp(param, "igen") || | |
82 !strcasecmp(param, "y") || | |
83 !strcasecmp(param, "j") || | |
84 !strcasecmp(param, "i") || | |
11781 | 85 !strcasecmp(param, "tak") || |
11785 | 86 !strcasecmp(param, "ja") || |
8164 | 87 !strcmp(param, "1")) { |
88 if(dst) VAL(dst) = opt->max; | |
89 } else if (!strcasecmp(param, "no") || | |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
90 !strcasecmp(param, "off") || |
8164 | 91 !strcasecmp(param, "nein") || |
92 !strcasecmp(param, "nicht") || | |
93 !strcasecmp(param, "nem") || | |
94 !strcasecmp(param, "n") || | |
11781 | 95 !strcasecmp(param, "nie") || |
11785 | 96 !strcasecmp(param, "nej") || |
8164 | 97 !strcmp(param, "0")) { |
98 if(dst) VAL(dst) = opt->min; | |
99 } else { | |
10641 | 100 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid parameter for %s flag: %s\n",name, param); |
8164 | 101 return M_OPT_INVALID; |
102 } | |
103 return 1; | |
104 } else { | |
105 if(dst) VAL(dst) = opt->max; | |
106 return 0; | |
107 } | |
108 } | |
109 | |
110 static char* print_flag(m_option_t* opt, void* val) { | |
111 if(VAL(val) == opt->min) | |
112 return strdup("no"); | |
113 else | |
114 return strdup("yes"); | |
115 } | |
116 | |
117 m_option_type_t m_option_type_flag = { | |
118 "Flag", | |
119 "need yes or no in config files", | |
120 sizeof(int), | |
121 0, | |
122 parse_flag, | |
123 print_flag, | |
124 copy_opt, | |
125 copy_opt, | |
126 NULL, | |
127 NULL | |
128 }; | |
129 | |
130 // Integer | |
131 | |
132 static int parse_int(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
133 long tmp_int; | |
134 char *endptr; | |
135 src = 0; | |
136 | |
137 if (param == NULL) | |
138 return M_OPT_MISSING_PARAM; | |
139 | |
140 tmp_int = strtol(param, &endptr, 0); | |
141 if (*endptr) { | |
142 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be an integer: %s\n",name, param); | |
143 return M_OPT_INVALID; | |
144 } | |
145 | |
146 if ((opt->flags & M_OPT_MIN) && (tmp_int < opt->min)) { | |
147 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be >= %d: %s\n", name, (int) opt->min, param); | |
148 return M_OPT_OUT_OF_RANGE; | |
149 } | |
150 | |
151 if ((opt->flags & M_OPT_MAX) && (tmp_int > opt->max)) { | |
152 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be <= %d: %s\n",name, (int) opt->max, param); | |
153 return M_OPT_OUT_OF_RANGE; | |
154 } | |
155 | |
156 if(dst) VAL(dst) = tmp_int; | |
157 | |
158 return 1; | |
159 } | |
160 | |
161 static char* print_int(m_option_t* opt, void* val) { | |
162 opt = NULL; | |
163 return dup_printf("%d",VAL(val)); | |
164 } | |
165 | |
166 m_option_type_t m_option_type_int = { | |
167 "Integer", | |
168 "", | |
169 sizeof(int), | |
170 0, | |
171 parse_int, | |
172 print_int, | |
173 copy_opt, | |
174 copy_opt, | |
175 NULL, | |
176 NULL | |
177 }; | |
178 | |
179 // Float | |
180 | |
181 #undef VAL | |
182 #define VAL(x) (*(float*)(x)) | |
183 | |
184 static int parse_float(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
185 float tmp_float; | |
186 char* endptr; | |
187 src = 0; | |
188 | |
189 if (param == NULL) | |
190 return M_OPT_MISSING_PARAM; | |
191 | |
192 tmp_float = strtod(param, &endptr); | |
193 | |
194 switch(*endptr) { | |
195 case ':': | |
196 case '/': | |
197 tmp_float /= strtod(endptr+1, &endptr); | |
198 break; | |
199 case '.': | |
200 case ',': | |
201 /* we also handle floats specified with | |
202 * non-locale decimal point ::atmos | |
203 */ | |
204 if(tmp_float<0) | |
205 tmp_float -= 1.0/pow(10,strlen(endptr+1)) * strtod(endptr+1, &endptr); | |
206 else | |
207 tmp_float += 1.0/pow(10,strlen(endptr+1)) * strtod(endptr+1, &endptr); | |
208 break; | |
209 } | |
210 | |
211 if (*endptr) { | |
212 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be a floating point " | |
213 "number or a ratio (numerator[:/]denominator): %s\n",name, param); | |
214 return M_OPT_INVALID; | |
215 } | |
216 | |
217 if (opt->flags & M_OPT_MIN) | |
218 if (tmp_float < opt->min) { | |
219 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be >= %f: %s\n", name, opt->min, param); | |
220 return M_OPT_OUT_OF_RANGE; | |
221 } | |
222 | |
223 if (opt->flags & M_OPT_MAX) | |
224 if (tmp_float > opt->max) { | |
225 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be <= %f: %s\n", name, opt->max, param); | |
226 return M_OPT_OUT_OF_RANGE; | |
227 } | |
228 | |
229 if(dst) VAL(dst) = tmp_float; | |
230 return 1; | |
231 } | |
232 | |
233 static char* print_float(m_option_t* opt, void* val) { | |
234 opt = NULL; | |
235 return dup_printf("%f",VAL(val)); | |
236 } | |
237 | |
238 m_option_type_t m_option_type_float = { | |
239 "Float", | |
240 "floating point number or ratio (numerator[:/]denominator)", | |
241 sizeof(float), | |
242 0, | |
243 parse_float, | |
244 print_float, | |
245 copy_opt, | |
246 copy_opt, | |
247 NULL, | |
248 NULL | |
249 }; | |
250 | |
251 ///////////// Position | |
252 #undef VAL | |
253 #define VAL(x) (*(off_t*)(x)) | |
254 | |
255 static int parse_position(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
256 off_t tmp_off; | |
257 char dummy; | |
258 | |
259 if (param == NULL) | |
260 return M_OPT_MISSING_PARAM; | |
261 if (sscanf(param, sizeof(off_t) == sizeof(int) ? | |
262 "%d%c" : "%lld%c", &tmp_off, &dummy) != 1) { | |
263 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be an integer: %s\n",opt->name,param); | |
264 return M_OPT_INVALID; | |
265 } | |
266 | |
267 if (opt->flags & M_OPT_MIN) | |
268 if (tmp_off < opt->min) { | |
269 mp_msg(MSGT_CFGPARSER, MSGL_ERR, | |
270 (sizeof(off_t) == sizeof(int) ? | |
271 "The %s option must be >= %d: %s\n" : | |
272 "The %s option must be >= %lld: %s\n"), | |
9913 | 273 name, (off_t) opt->min, param); |
8164 | 274 return M_OPT_OUT_OF_RANGE; |
275 } | |
276 | |
277 if (opt->flags & M_OPT_MAX) | |
278 if (tmp_off > opt->max) { | |
279 mp_msg(MSGT_CFGPARSER, MSGL_ERR, | |
280 (sizeof(off_t) == sizeof(int) ? | |
281 "The %s option must be <= %d: %s\n" : | |
282 "The %s option must be <= %lld: %s\n"), | |
9913 | 283 name, (off_t) opt->max, param); |
8164 | 284 return M_OPT_OUT_OF_RANGE; |
285 } | |
286 | |
287 if(dst) | |
288 VAL(dst) = tmp_off; | |
289 return 1; | |
290 } | |
291 | |
292 static char* print_position(m_option_t* opt, void* val) { | |
293 return dup_printf(sizeof(off_t) == sizeof(int) ? "%d" : "%lld",VAL(val)); | |
294 } | |
295 | |
296 m_option_type_t m_option_type_position = { | |
297 "Position", | |
298 "Integer (off_t)", | |
299 sizeof(off_t), | |
300 0, | |
301 parse_position, | |
302 print_position, | |
303 copy_opt, | |
304 copy_opt, | |
305 NULL, | |
306 NULL | |
307 }; | |
308 | |
309 | |
310 ///////////// String | |
311 | |
312 #undef VAL | |
313 #define VAL(x) (*(char**)(x)) | |
314 | |
315 static int parse_str(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
316 | |
317 | |
318 if (param == NULL) | |
319 return M_OPT_MISSING_PARAM; | |
320 | |
321 if ((opt->flags & M_OPT_MIN) && (strlen(param) < opt->min)) { | |
10641 | 322 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Parameter must be >= %d chars: %s\n", |
8164 | 323 (int) opt->min, param); |
324 return M_OPT_OUT_OF_RANGE; | |
325 } | |
326 | |
327 if ((opt->flags & M_OPT_MAX) && (strlen(param) > opt->max)) { | |
10641 | 328 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Parameter must be <= %d chars: %s\n", |
8164 | 329 (int) opt->max, param); |
330 return M_OPT_OUT_OF_RANGE; | |
331 } | |
332 | |
333 if(dst) { | |
334 if(VAL(dst)) | |
335 free(VAL(dst)); | |
336 VAL(dst) = strdup(param); | |
337 } | |
338 | |
339 return 1; | |
340 | |
341 } | |
342 | |
343 static char* print_str(m_option_t* opt, void* val) { | |
8168 | 344 return (val && VAL(val) && strlen(VAL(val)) > 0) ? strdup(VAL(val)) : NULL; |
8164 | 345 } |
346 | |
347 static void copy_str(m_option_t* opt,void* dst, void* src) { | |
348 if(dst && src) { | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
349 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
350 if(VAL(dst)) free(VAL(dst)); //FIXME!!! |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
351 #endif |
8164 | 352 VAL(dst) = VAL(src) ? strdup(VAL(src)) : NULL; |
353 } | |
354 } | |
355 | |
356 static void free_str(void* src) { | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
357 if(src && VAL(src)){ |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
358 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
359 free(VAL(src)); //FIXME!!! |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
360 #endif |
8164 | 361 VAL(src) = NULL; |
362 } | |
363 } | |
364 | |
365 m_option_type_t m_option_type_string = { | |
366 "String", | |
367 "", | |
368 sizeof(char*), | |
369 M_OPT_TYPE_DYNAMIC, | |
370 parse_str, | |
371 print_str, | |
372 copy_str, | |
373 copy_str, | |
374 copy_str, | |
375 free_str | |
376 }; | |
377 | |
378 //////////// String list | |
379 | |
380 #define LIST_SEPARATOR ',' | |
381 #undef VAL | |
382 #define VAL(x) (*(char***)(x)) | |
383 | |
384 #define OP_NONE 0 | |
385 #define OP_ADD 1 | |
386 #define OP_PRE 2 | |
387 #define OP_DEL 3 | |
388 #define OP_CLR 4 | |
389 | |
390 static void free_str_list(void* dst) { | |
391 char** d; | |
392 int i; | |
393 | |
394 if(!dst || !VAL(dst)) return; | |
395 d = VAL(dst); | |
396 | |
9177
01a713dcaf23
disable free() in string and string_list parsers. yes, it's a hack
arpi
parents:
8736
diff
changeset
|
397 // FIXME!!! |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
398 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
399 for(i = 0 ; d[i] != NULL ; i++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
400 free(d[i]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
401 free(d); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
402 #endif |
8164 | 403 VAL(dst) = NULL; |
404 } | |
405 | |
406 static int str_list_add(char** add, int n,void* dst,int pre) { | |
407 char** lst = VAL(dst); | |
408 int ln; | |
409 | |
410 if(!dst) return M_OPT_PARSER_ERR; | |
411 lst = VAL(dst); | |
412 | |
413 for(ln = 0 ; lst && lst[ln] ; ln++) | |
414 /**/; | |
415 | |
416 lst = realloc(lst,(n+ln+1)*sizeof(char*)); | |
417 | |
418 if(pre) { | |
419 memmove(&lst[n],lst,(ln+1)*sizeof(char*)); | |
420 memcpy(lst,add,n*sizeof(char*)); | |
421 } else | |
422 memcpy(&lst[ln],add,(n+1)*sizeof(char*)); | |
423 | |
424 free(add); | |
425 | |
426 VAL(dst) = lst; | |
427 | |
428 return 1; | |
429 } | |
430 | |
431 static int str_list_del(char** del, int n,void* dst) { | |
432 char **lst,*ep,**d; | |
433 int i,ln,s; | |
434 long idx; | |
435 | |
436 if(!dst) return M_OPT_PARSER_ERR; | |
437 lst = VAL(dst); | |
438 | |
439 for(ln = 0 ; lst && lst[ln] ; ln++) | |
440 /**/; | |
441 s = ln; | |
442 | |
443 for(i = 0 ; del[i] != NULL ; i++) { | |
444 idx = strtol(del[i], &ep, 0); | |
445 if(*ep) { | |
446 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid index: %s\n",del[i]); | |
447 free(del[i]); | |
448 continue; | |
449 } | |
450 free(del[i]); | |
451 if(idx < 0 || idx >= ln) { | |
10641 | 452 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Index %ld is out of range.\n",idx); |
8164 | 453 continue; |
454 } else if(!lst[idx]) | |
455 continue; | |
456 free(lst[idx]); | |
457 lst[idx] = NULL; | |
458 s--; | |
459 } | |
460 free(del); | |
461 | |
462 if(s == 0) { | |
463 if(lst) free(lst); | |
464 VAL(dst) = NULL; | |
465 return 1; | |
466 } | |
467 | |
468 d = calloc(s+1,sizeof(char*)); | |
469 for(i = 0, n = 0 ; i < ln ; i++) { | |
470 if(!lst[i]) continue; | |
471 d[n] = lst[i]; | |
472 n++; | |
473 } | |
474 d[s] = NULL; | |
475 | |
476 if(lst) free(lst); | |
477 VAL(dst) = d; | |
478 | |
479 return 1; | |
480 } | |
481 | |
482 | |
483 static int parse_str_list(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
484 int n = 0,len = strlen(opt->name); | |
485 char *ptr = param, *last_ptr, **res; | |
486 int op = OP_NONE; | |
487 | |
488 if(opt->name[len-1] == '*' && ((int)strlen(name) > len - 1)) { | |
489 char* n = &name[len-1]; | |
490 if(strcasecmp(n,"-add") == 0) | |
491 op = OP_ADD; | |
492 else if(strcasecmp(n,"-pre") == 0) | |
493 op = OP_PRE; | |
494 else if(strcasecmp(n,"-del") == 0) | |
495 op = OP_DEL; | |
496 else if(strcasecmp(n,"-clr") == 0) | |
497 op = OP_CLR; | |
498 else | |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
499 return M_OPT_UNKNOWN; |
8164 | 500 } |
501 | |
502 // Clear the list ?? | |
503 if(op == OP_CLR) { | |
504 if(dst) | |
505 free_str_list(dst); | |
506 return 0; | |
507 } | |
508 | |
10641 | 509 // All other ops need a param |
8164 | 510 if (param == NULL || strlen(param) == 0) |
511 return M_OPT_MISSING_PARAM; | |
512 | |
513 | |
514 while(ptr[0] != '\0') { | |
515 last_ptr = ptr; | |
516 ptr = strchr(ptr,LIST_SEPARATOR); | |
517 if(!ptr) { | |
518 n++; | |
519 break; | |
520 } | |
521 ptr++; | |
522 n++; | |
523 } | |
524 if(n == 0) | |
525 return M_OPT_INVALID; | |
526 if( ((opt->flags & M_OPT_MIN) && (n < opt->min)) || | |
527 ((opt->flags & M_OPT_MAX) && (n > opt->max)) ) | |
528 return M_OPT_OUT_OF_RANGE; | |
529 | |
530 if(!dst) return 1; | |
531 | |
8384
7a7980b874f5
fixed 'mplayer -nosound xxx' sig11 if configfile have string list options
arpi
parents:
8262
diff
changeset
|
532 res = malloc((n+2)*sizeof(char*)); |
8164 | 533 ptr = param; |
534 n = 0; | |
535 | |
536 while(1) { | |
537 last_ptr = ptr; | |
538 ptr = strchr(ptr,LIST_SEPARATOR); | |
539 if(!ptr) { | |
540 res[n] = strdup(last_ptr); | |
541 n++; | |
542 break; | |
543 } | |
544 len = ptr - last_ptr; | |
545 res[n] = (char*)malloc(len + 1); | |
546 if(len) strncpy(res[n],last_ptr,len); | |
547 res[n][len] = '\0'; | |
548 ptr++; | |
549 n++; | |
550 } | |
551 res[n] = NULL; | |
552 | |
553 switch(op) { | |
554 case OP_ADD: | |
555 return str_list_add(res,n,dst,0); | |
556 case OP_PRE: | |
557 return str_list_add(res,n,dst,1); | |
558 case OP_DEL: | |
559 return str_list_del(res,n,dst); | |
560 } | |
561 | |
562 if(VAL(dst)) | |
563 free_str_list(dst); | |
564 VAL(dst) = res; | |
565 | |
566 return 1; | |
567 } | |
568 | |
569 static void copy_str_list(m_option_t* opt,void* dst, void* src) { | |
570 int n; | |
571 char **d,**s; | |
572 | |
573 if(!(dst && src)) return; | |
574 s = VAL(src); | |
575 | |
576 if(VAL(dst)) | |
577 free_str_list(dst); | |
578 | |
579 if(!s) { | |
580 VAL(dst) = NULL; | |
581 return; | |
582 } | |
583 | |
584 for(n = 0 ; s[n] != NULL ; n++) | |
585 /* NOTHING */; | |
586 d = (char**)malloc((n+1)*sizeof(char*)); | |
587 for( ; n >= 0 ; n--) | |
588 d[n] = s[n] ? strdup(s[n]) : NULL; | |
589 | |
590 VAL(dst) = d; | |
591 } | |
592 | |
593 static char* print_str_list(m_option_t* opt, void* src) { | |
8168 | 594 char **lst = NULL; |
595 char *ret = NULL,*last = NULL; | |
596 int i; | |
597 | |
598 if(!(src && VAL(src))) return NULL; | |
599 lst = VAL(src); | |
600 | |
601 for(i = 0 ; lst[i] ; i++) { | |
602 if(last) { | |
603 ret = dup_printf("%s,%s",last,lst[i]); | |
604 free(last); | |
605 } else | |
606 ret = strdup(lst[i]); | |
607 last = ret; | |
608 } | |
609 if(last && last != ret) free(last); | |
610 return ret; | |
8164 | 611 } |
612 | |
613 m_option_type_t m_option_type_string_list = { | |
614 "String list", | |
10641 | 615 "A list of strings separated by ','\n" |
616 "Option with a name ending in an * permits using the following suffix: \n" | |
617 "\t-add: Add the given parameters at the end of the list.\n" | |
618 "\t-pre: Add the given parameters at the begining of the list.\n" | |
619 "\t-del: Remove the entry at the given indices.\n" | |
620 "\t-clr: Clear the list.\n" | |
11261 | 621 "e.g: -vf-add flip,mirror -vf-del 2,5\n", |
8164 | 622 sizeof(char**), |
623 M_OPT_TYPE_DYNAMIC | M_OPT_TYPE_ALLOW_WILDCARD, | |
624 parse_str_list, | |
625 print_str_list, | |
626 copy_str_list, | |
627 copy_str_list, | |
628 copy_str_list, | |
629 free_str_list | |
630 }; | |
631 | |
632 | |
633 /////////////////// Func based options | |
634 | |
635 // A chained list to save the various calls for func_param and func_full | |
636 typedef struct m_func_save m_func_save_t; | |
637 struct m_func_save { | |
638 m_func_save_t* next; | |
639 char* name; | |
640 char* param; | |
641 }; | |
642 | |
643 #undef VAL | |
644 #define VAL(x) (*(m_func_save_t**)(x)) | |
645 | |
646 static void free_func_pf(void* src) { | |
647 m_func_save_t *s,*n; | |
648 | |
649 if(!src) return; | |
650 | |
651 s = VAL(src); | |
652 | |
653 while(s) { | |
654 n = s->next; | |
655 free(s->name); | |
656 if(s->param) free(s->param); | |
657 free(s); | |
658 s = n; | |
659 } | |
660 VAL(src) = NULL; | |
661 } | |
662 | |
663 // Parser for func_param and func_full | |
664 static int parse_func_pf(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
665 m_func_save_t *s,*p; | |
666 | |
667 if(!dst) | |
668 return 1; | |
669 | |
670 s = (m_func_save_t*)calloc(1,sizeof(m_func_save_t)); | |
671 s->name = strdup(name); | |
672 s->param = param ? strdup(param) : NULL; | |
673 | |
674 p = VAL(dst); | |
675 if(p) { | |
676 for( ; p->next != NULL ; p = p->next) | |
677 /**/; | |
678 p->next = s; | |
679 } else | |
680 VAL(dst) = s; | |
681 | |
682 return 1; | |
683 } | |
684 | |
685 static void copy_func_pf(m_option_t* opt,void* dst, void* src) { | |
686 m_func_save_t *d = NULL, *s,* last = NULL; | |
687 | |
688 if(!(dst && src)) return; | |
689 s = VAL(src); | |
690 | |
691 if(VAL(dst)) | |
692 free_func_pf(dst); | |
693 | |
694 while(s) { | |
695 d = (m_func_save_t*)malloc(sizeof(m_func_save_t)); | |
696 d->name = strdup(s->name); | |
697 d->param = s->param ? strdup(s->param) : NULL; | |
698 if(last) | |
699 last->next = d; | |
700 else | |
701 VAL(dst) = d; | |
702 last = d; | |
703 s = s->next; | |
704 } | |
705 | |
706 | |
707 } | |
708 | |
709 /////////////////// Func_param | |
710 | |
711 static void set_func_param(m_option_t* opt, void* dst, void* src) { | |
712 m_func_save_t* s; | |
713 | |
714 if(!src) return; | |
715 s = VAL(src); | |
716 | |
717 if(!s) return; | |
718 | |
719 // Revert if needed | |
720 if(opt->priv) ((m_opt_default_func_t)opt->priv)(opt,opt->name); | |
721 for( ; s != NULL ; s = s->next) | |
722 ((m_opt_func_param_t) opt->p)(opt,s->param); | |
723 } | |
724 | |
725 m_option_type_t m_option_type_func_param = { | |
726 "Func param", | |
727 "", | |
728 sizeof(m_func_save_t*), | |
729 M_OPT_TYPE_INDIRECT, | |
730 parse_func_pf, | |
731 NULL, | |
732 NULL, // Nothing to do on save | |
733 set_func_param, | |
734 copy_func_pf, | |
735 free_func_pf | |
736 }; | |
737 | |
738 /////////////////// Func_full | |
739 | |
740 static void set_func_full(m_option_t* opt, void* dst, void* src) { | |
741 m_func_save_t* s; | |
742 | |
743 if(!src) return; | |
744 | |
745 for(s = VAL(src) ; s ; s = s->next) { | |
746 // Revert if needed | |
747 if(opt->priv) ((m_opt_default_func_t)opt->priv)(opt,s->name); | |
748 ((m_opt_func_full_t) opt->p)(opt,s->name,s->param); | |
749 } | |
750 } | |
751 | |
752 m_option_type_t m_option_type_func_full = { | |
753 "Func full", | |
754 "", | |
755 sizeof(m_func_save_t*), | |
756 M_OPT_TYPE_ALLOW_WILDCARD|M_OPT_TYPE_INDIRECT, | |
757 parse_func_pf, | |
758 NULL, | |
759 NULL, // Nothing to do on save | |
760 set_func_full, | |
761 copy_func_pf, | |
762 free_func_pf | |
763 }; | |
764 | |
765 /////////////// Func | |
766 | |
767 #undef VAL | |
768 #define VAL(x) (*(int*)(x)) | |
769 | |
770 static int parse_func(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
771 if(dst) | |
772 VAL(dst) += 1; | |
773 return 0; | |
774 } | |
775 | |
776 static void set_func(m_option_t* opt,void* dst, void* src) { | |
777 int i; | |
778 if(opt->priv) ((m_opt_default_func_t)opt->priv)(opt,opt->name); | |
779 for(i = 0 ; i < VAL(src) ; i++) | |
780 ((m_opt_func_t) opt->p)(opt); | |
781 } | |
782 | |
783 m_option_type_t m_option_type_func = { | |
784 "Func", | |
785 "", | |
786 sizeof(int), | |
787 M_OPT_TYPE_INDIRECT, | |
788 parse_func, | |
789 NULL, | |
790 NULL, // Nothing to do on save | |
791 set_func, | |
792 NULL, | |
793 NULL | |
794 }; | |
795 | |
796 /////////////////// Print | |
797 | |
798 static int parse_print(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
8736 | 799 if(opt->type->flags&M_OPT_TYPE_INDIRECT) |
800 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", *(char **) opt->p); | |
801 else | |
802 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", (char *) opt->p); | |
803 | |
8164 | 804 if(opt->priv == NULL) |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
805 return M_OPT_EXIT; |
8164 | 806 return 1; |
807 } | |
808 | |
809 m_option_type_t m_option_type_print = { | |
810 "Print", | |
811 "", | |
812 0, | |
813 0, | |
814 parse_print, | |
815 NULL, | |
816 NULL, | |
817 NULL, | |
818 NULL, | |
819 NULL | |
820 }; | |
821 | |
8736 | 822 m_option_type_t m_option_type_print_indirect = { |
823 "Print", | |
824 "", | |
825 0, | |
826 M_OPT_TYPE_INDIRECT, | |
827 parse_print, | |
828 NULL, | |
829 NULL, | |
830 NULL, | |
831 NULL, | |
832 NULL | |
833 }; | |
834 | |
835 | |
8164 | 836 /////////////////////// Subconfig |
837 #undef VAL | |
838 #define VAL(x) (*(char***)(x)) | |
839 | |
840 static int parse_subconf(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
841 char *subparam; | |
842 char *subopt; | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
843 int nr = 0,i,r; |
8164 | 844 m_option_t *subopts; |
845 char *token; | |
846 char *p; | |
847 char** lst = NULL; | |
848 | |
849 if (param == NULL || strlen(param) == 0) | |
850 return M_OPT_MISSING_PARAM; | |
851 | |
852 subparam = malloc(strlen(param)+1); | |
853 subopt = malloc(strlen(param)+1); | |
854 p = strdup(param); // In case that param is a static string (cf man strtok) | |
855 | |
856 subopts = opt->p; | |
857 | |
858 token = strtok(p, (char *)&(":")); | |
859 while(token) | |
860 { | |
861 int sscanf_ret; | |
862 /* clear out */ | |
863 subopt[0] = subparam[0] = 0; | |
864 | |
865 sscanf_ret = sscanf(token, "%[^=]=%[^:]", subopt, subparam); | |
866 | |
867 mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "token: '%s', subopt='%s', subparam='%s' (ret: %d)\n", token, subopt, subparam, sscanf_ret); | |
868 switch(sscanf_ret) | |
869 { | |
870 case 1: | |
871 subparam[0] = 0; | |
872 case 2: | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
873 for(i = 0 ; subopts[i].name ; i++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
874 if(!strcmp(subopts[i].name,subopt)) break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
875 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
876 if(!subopts[i].name) { |
10397 | 877 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Unknown suboption %s\n",name,subopt); |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
878 return M_OPT_UNKNOWN; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
879 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
880 r = m_option_parse(&subopts[i],subopt, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
881 subparam[0] == 0 ? NULL : subparam,NULL,src); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
882 if(r < 0) return r; |
8164 | 883 if(dst) { |
884 lst = (char**)realloc(lst,2 * (nr+2) * sizeof(char*)); | |
885 lst[2*nr] = strdup(subopt); | |
886 lst[2*nr+1] = subparam[0] == 0 ? NULL : strdup(subparam); | |
887 memset(&lst[2*(nr+1)],0,2*sizeof(char*)); | |
888 nr++; | |
889 } | |
890 break; | |
891 default: | |
892 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid subconfig argument! ('%s')\n", token); | |
893 return M_OPT_INVALID; | |
894 } | |
895 token = strtok(NULL, (char *)&(":")); | |
896 } | |
897 | |
898 free(subparam); | |
899 free(subopt); | |
900 free(p); | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
901 if(dst) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
902 VAL(dst) = lst; |
8164 | 903 |
904 return 1; | |
905 } | |
906 | |
907 m_option_type_t m_option_type_subconfig = { | |
908 "Subconfig", | |
909 "The syntax is -option opt1=foo:flag:opt2=blah", | |
910 sizeof(int), | |
911 M_OPT_TYPE_HAS_CHILD, | |
912 parse_subconf, | |
913 NULL, | |
914 NULL, | |
915 NULL, | |
916 NULL, | |
917 NULL | |
918 }; | |
919 | |
920 #include "libmpcodecs/img_format.h" | |
9600 | 921 |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
922 /* FIXME: snyc with img_format.h */ |
9600 | 923 static struct { |
924 char* name; | |
925 unsigned int fmt; | |
926 } mp_imgfmt_list[] = { | |
927 {"444p", IMGFMT_444P}, | |
928 {"422p", IMGFMT_422P}, | |
929 {"411p", IMGFMT_411P}, | |
930 {"yuy2", IMGFMT_YUY2}, | |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
931 {"uyvy", IMGFMT_UYVY}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
932 {"yvu9", IMGFMT_YVU9}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
933 {"if09", IMGFMT_IF09}, |
9600 | 934 {"yv12", IMGFMT_YV12}, |
935 {"i420", IMGFMT_I420}, | |
936 {"iyuv", IMGFMT_IYUV}, | |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
937 {"clpl", IMGFMT_CLPL}, |
11688 | 938 {"hm12", IMGFMT_HM12}, |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
939 {"y800", IMGFMT_Y800}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
940 {"y8", IMGFMT_Y8}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
941 {"nv12", IMGFMT_NV12}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
942 {"nv21", IMGFMT_NV21}, |
9600 | 943 {"bgr24", IMGFMT_BGR24}, |
944 {"bgr32", IMGFMT_BGR32}, | |
945 {"bgr16", IMGFMT_BGR16}, | |
946 {"bgr15", IMGFMT_BGR15}, | |
947 {"bgr8", IMGFMT_BGR8}, | |
948 {"bgr4", IMGFMT_BGR4}, | |
949 {"bg4b", IMGFMT_BG4B}, | |
950 {"bgr1", IMGFMT_BGR1}, | |
951 {"rgb24", IMGFMT_RGB24}, | |
952 {"rgb32", IMGFMT_RGB32}, | |
953 {"rgb16", IMGFMT_RGB16}, | |
954 {"rgb15", IMGFMT_RGB15}, | |
955 {"rgb8", IMGFMT_RGB8}, | |
956 {"rgb4", IMGFMT_RGB4}, | |
957 {"rg4b", IMGFMT_RG4B}, | |
958 {"rgb1", IMGFMT_RGB1}, | |
959 { NULL, 0 } | |
960 }; | |
8164 | 961 |
962 static int parse_imgfmt(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
963 uint32_t fmt = 0; | |
9600 | 964 int i; |
8164 | 965 |
966 if (param == NULL || strlen(param) == 0) | |
967 return M_OPT_MISSING_PARAM; | |
968 | |
9600 | 969 if(!strcmp(param,"help")) { |
10641 | 970 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "Available formats:"); |
9600 | 971 for(i = 0 ; mp_imgfmt_list[i].name ; i++) |
972 mp_msg(MSGT_CFGPARSER, MSGL_INFO, " %s",mp_imgfmt_list[i].name); | |
973 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\n"); | |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
974 return M_OPT_EXIT; |
9600 | 975 } |
10597
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
976 |
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
977 if (sscanf(param, "0x%x", &fmt) != 1) |
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
978 { |
9600 | 979 for(i = 0 ; mp_imgfmt_list[i].name ; i++) { |
980 if(!strcasecmp(param,mp_imgfmt_list[i].name)) { | |
981 fmt=mp_imgfmt_list[i].fmt; | |
982 break; | |
983 } | |
984 } | |
985 if(!mp_imgfmt_list[i].name) { | |
986 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: unknown format name: '%s'\n",name,param); | |
8164 | 987 return M_OPT_INVALID; |
988 } | |
10597
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
989 } |
8164 | 990 |
991 if(dst) | |
992 *((uint32_t*)dst) = fmt; | |
993 | |
994 return 1; | |
995 } | |
996 | |
997 m_option_type_t m_option_type_imgfmt = { | |
9600 | 998 "Image format", |
10641 | 999 "Please report any missing colorspaces.", |
8164 | 1000 sizeof(uint32_t), |
1001 0, | |
1002 parse_imgfmt, | |
1003 NULL, | |
1004 copy_opt, | |
1005 copy_opt, | |
1006 NULL, | |
1007 NULL | |
1008 }; | |
1009 | |
10641 | 1010 //// Objects (i.e. filters, etc) settings |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1011 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1012 #include "m_struct.h" |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1013 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1014 #undef VAL |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1015 #define VAL(x) (*(m_obj_settings_t**)(x)) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1016 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1017 static int find_obj_desc(char* name,m_obj_list_t* l,m_struct_t** ret) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1018 int i; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1019 char* n; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1020 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1021 for(i = 0 ; l->list[i] ; i++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1022 n = M_ST_MB(char*,l->list[i],l->name_off); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1023 if(!strcmp(n,name)) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1024 *ret = M_ST_MB(m_struct_t*,l->list[i],l->desc_off); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1025 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1026 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1027 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1028 return 0; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1029 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1030 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1031 static int get_obj_param(char* opt_name,char* obj_name, m_struct_t* desc, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1032 char* str,int* nold,int oldmax,char** dst) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1033 char* eq,param; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1034 m_option_t* opt; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1035 int r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1036 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1037 eq = strchr(str,'='); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1038 if(eq && eq == str) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1039 eq = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1040 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1041 if(eq) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1042 char* p = eq + 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1043 if(p[0] == '\0') p = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1044 eq[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1045 opt = m_option_list_find(desc->fields,str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1046 if(!opt) { |
10641 | 1047 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: %s doesn't have a %s parameter.\n",opt_name,obj_name,str); |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
1048 return M_OPT_UNKNOWN; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1049 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1050 r = m_option_parse(opt,str,p,NULL,M_CONFIG_FILE); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1051 if(r < 0) { |
10641 | 1052 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while parsing %s parameter %s (%s)\n",opt_name,obj_name,str,p); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1053 eq[0] = '='; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1054 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1055 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1056 if(dst) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1057 dst[0] = strdup(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1058 dst[1] = p ? strdup(p) : NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1059 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1060 eq[0] = '='; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1061 } else { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1062 if((*nold) >= oldmax) { |
10641 | 1063 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: %s has only %d params, so you can't give more than %d unnamed params.\n", |
10660 | 1064 opt_name,obj_name,oldmax,oldmax); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1065 return M_OPT_OUT_OF_RANGE; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1066 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1067 opt = &desc->fields[(*nold)]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1068 r = m_option_parse(opt,opt->name,str,NULL,M_CONFIG_FILE); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1069 if(r < 0) { |
10641 | 1070 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while parsing %s parameter %s (%s)\n",opt_name,obj_name,opt->name,str); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1071 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1072 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1073 if(dst) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1074 dst[0] = strdup(opt->name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1075 dst[1] = strdup(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1076 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1077 (*nold)++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1078 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1079 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1080 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1081 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1082 static int get_obj_params(char* opt_name, char* name,char* params, |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1083 m_struct_t* desc,char separator, char*** _ret) { |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1084 int n = 0,nold = 0, nopts,r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1085 char* ptr,*last_ptr = params,*eq; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1086 char** ret; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1087 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1088 if(!strcmp(params,"help")) { // Help |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1089 char min[50],max[50]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1090 if(!desc->fields) { |
10641 | 1091 printf("%s doesn't have any options.\n\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1092 return M_OPT_EXIT; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1093 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1094 printf("\n Name Type Min Max\n\n"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1095 for(n = 0 ; desc->fields[n].name ; n++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1096 m_option_t* opt = &desc->fields[n]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1097 if(opt->type->flags & M_OPT_TYPE_HAS_CHILD) continue; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1098 if(opt->flags & M_OPT_MIN) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1099 sprintf(min,"%-8.0f",opt->min); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1100 else |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1101 strcpy(min,"No"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1102 if(opt->flags & M_OPT_MAX) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1103 sprintf(max,"%-8.0f",opt->max); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1104 else |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1105 strcpy(max,"No"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1106 printf(" %-20.20s %-15.15s %-10.10s %-10.10s\n", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1107 opt->name, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1108 opt->type->name, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1109 min, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1110 max); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1111 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1112 printf("\n"); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1113 return M_OPT_EXIT; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1114 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1115 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1116 for(nopts = 0 ; desc->fields[nopts].name ; nopts++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1117 /* NOP */; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1118 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1119 // TODO : Check that each opt can be parsed |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1120 r = 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1121 while(last_ptr && last_ptr[0] != '\0') { |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1122 ptr = strchr(last_ptr,separator); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1123 if(!ptr) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1124 r = get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,NULL); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1125 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1126 break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1127 } |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1128 if(ptr == last_ptr) { // Empty field, count it and go on |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1129 nold++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1130 last_ptr = ptr+1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1131 continue; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1132 } |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1133 ptr[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1134 r = get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,NULL); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1135 ptr[0] = separator; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1136 if(r < 0) break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1137 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1138 last_ptr = ptr+1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1139 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1140 if(r < 0) return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1141 if(!_ret) // Just test |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1142 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1143 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1144 ret = malloc((n+2)*2*sizeof(char*)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1145 n = nold = 0; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1146 last_ptr = params; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1147 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1148 while(last_ptr && last_ptr[0] != '\0') { |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1149 ptr = strchr(last_ptr,separator); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1150 if(!ptr) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1151 get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,&ret[n*2]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1152 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1153 break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1154 } |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1155 if(ptr == last_ptr) { // Empty field, count it and go on |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1156 last_ptr = ptr+1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1157 nold++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1158 continue; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1159 } |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1160 ptr[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1161 get_obj_param(opt_name,name,desc,last_ptr,&nold,nopts,&ret[n*2]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1162 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1163 last_ptr = ptr+1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1164 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1165 ret[n*2] = ret[n*2+1] = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1166 *_ret = ret; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1167 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1168 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1169 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1170 |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1171 static int parse_obj_params(m_option_t* opt,char *name, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1172 char *param, void* dst, int src) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1173 char** opts; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1174 int r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1175 m_obj_params_t* p = opt->priv; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1176 m_struct_t* desc = p->desc; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1177 char* cpy = strdup(param); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1178 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1179 // We need the object desc |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1180 if(!p) |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1181 return M_OPT_INVALID; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1182 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1183 r = get_obj_params(name,desc->name,cpy,desc,p->separator,&opts); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1184 free(cpy); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1185 if(r < 0) |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1186 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1187 if(!dst) |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1188 return 1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1189 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1190 for(r = 0 ; opts[r] ; r += 2) |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1191 m_struct_set(desc,dst,opts[r],opts[r+1]); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1192 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1193 return 1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1194 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1195 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1196 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1197 m_option_type_t m_option_type_obj_params = { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1198 "Object params", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1199 "", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1200 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1201 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1202 parse_obj_params, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1203 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1204 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1205 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1206 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1207 NULL |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1208 }; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1209 |
10641 | 1210 /// Some predefined types as a definition would be quite lengthy |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1211 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1212 /// Span arguments |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1213 static m_span_t m_span_params_dflts = { -1, -1 }; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1214 static m_option_t m_span_params_fields[] = { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1215 {"start", M_ST_OFF(m_span_t,start), CONF_TYPE_INT, M_OPT_MIN, 1 ,0, NULL}, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1216 {"end", M_ST_OFF(m_span_t,end), CONF_TYPE_INT, M_OPT_MIN , 1 ,0, NULL}, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1217 { NULL, NULL, 0, 0, 0, 0, NULL } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1218 }; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1219 static struct m_struct_st m_span_opts = { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1220 "m_span", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1221 sizeof(m_span_t), |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1222 &m_span_params_dflts, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1223 m_span_params_fields |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1224 }; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1225 m_obj_params_t m_span_params_def = { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1226 &m_span_opts, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1227 '-' |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1228 }; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1229 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1230 static int parse_obj_settings(char* opt,char* str,m_obj_list_t* list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1231 m_obj_settings_t **_ret, int ret_n) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1232 int r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1233 char *param,**plist = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1234 m_struct_t* desc; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1235 m_obj_settings_t *ret = _ret ? *_ret : NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1236 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1237 |
10641 | 1238 // Now check that the object exists |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1239 param = strchr(str,'='); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1240 if(param) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1241 param[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1242 param++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1243 if(strlen(param) <= 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1244 param = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1245 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1246 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1247 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1248 if(!find_obj_desc(str,list,&desc)) { |
10641 | 1249 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: %s doesn't exist.\n",opt,str); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1250 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1251 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1252 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1253 if(param) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1254 if(!desc && _ret) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1255 plist = calloc(4,sizeof(char*)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1256 plist[0] = strdup("_oldargs_"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1257 plist[1] = strdup(param); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1258 } else if(desc) { |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1259 r = get_obj_params(opt,str,param,desc,':',_ret ? &plist : NULL); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1260 if(r < 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1261 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1262 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1263 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1264 if(!_ret) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1265 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1266 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1267 ret = realloc(ret,(ret_n+2)*sizeof(m_obj_settings_t)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1268 memset(&ret[ret_n],0,2*sizeof(m_obj_settings_t)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1269 ret[ret_n].name = strdup(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1270 ret[ret_n].attribs = plist; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1271 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1272 *_ret = ret; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1273 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1274 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1275 |
9913 | 1276 static void free_obj_settings_list(void* dst); |
1277 | |
1278 static int obj_settings_list_del(char *opt_name,char *param,void* dst, int src) { | |
1279 char** str_list = NULL; | |
1280 int r,i,idx_max = 0; | |
1281 char* rem_id = "_removed_marker_"; | |
1282 m_option_t list_opt = {opt_name , NULL, CONF_TYPE_STRING_LIST, | |
1283 0, 0, 0, NULL }; | |
1284 m_obj_settings_t* obj_list = dst ? VAL(dst) : NULL; | |
1285 | |
1286 if(dst && !obj_list) { | |
1287 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: the list is empty.\n",opt_name); | |
1288 return 1; | |
1289 } else if(obj_list) { | |
1290 for(idx_max = 0 ; obj_list[idx_max].name != NULL ; idx_max++) | |
1291 /* NOP */; | |
1292 } | |
1293 | |
1294 r = m_option_parse(&list_opt,opt_name,param,&str_list,src); | |
1295 if(r < 0 || !str_list) | |
1296 return r; | |
1297 | |
1298 for(r = 0 ; str_list[r] ; r++) { | |
1299 int id; | |
1300 char* endptr; | |
1301 id = strtol(str_list[r],&endptr,0); | |
1302 if(endptr == str_list[r]) { | |
10660 | 1303 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid parameter. We need a list of integers which are the indices of the elements to remove.\n",opt_name); |
9913 | 1304 m_option_free(&list_opt,&str_list); |
1305 return M_OPT_INVALID; | |
1306 } | |
1307 if(!obj_list) continue; | |
1308 if(id >= idx_max || id < -idx_max) { | |
10641 | 1309 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: Index %d is out of range.\n",opt_name,id); |
9913 | 1310 continue; |
1311 } | |
1312 if(id < 0) | |
1313 id = idx_max + id; | |
1314 free(obj_list[id].name); | |
1315 free_str_list(&(obj_list[id].attribs)); | |
1316 obj_list[id].name = rem_id; | |
1317 } | |
1318 | |
1319 if(!dst) { | |
1320 m_option_free(&list_opt,&str_list); | |
1321 return 1; | |
1322 } | |
1323 | |
1324 for(i = 0 ; obj_list[i].name ; i++) { | |
1325 while(obj_list[i].name == rem_id) { | |
1326 memmove(&obj_list[i],&obj_list[i+1],sizeof(m_obj_settings_t)*(idx_max - i)); | |
1327 idx_max--; | |
1328 } | |
1329 } | |
1330 obj_list = realloc(obj_list,sizeof(m_obj_settings_t)*(idx_max+1)); | |
1331 VAL(dst) = obj_list; | |
1332 | |
1333 return 1; | |
1334 } | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1335 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1336 static int parse_obj_settings_list(m_option_t* opt,char *name, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1337 char *param, void* dst, int src) { |
9913 | 1338 int n = 0,r,len = strlen(opt->name); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1339 char *str; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1340 char *ptr, *last_ptr; |
9913 | 1341 m_obj_settings_t *res = NULL,*queue = NULL,*head = NULL; |
1342 int op = OP_NONE; | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1343 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1344 // We need the objects list |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1345 if(!opt->priv) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1346 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1347 |
9913 | 1348 if(opt->name[len-1] == '*' && ((int)strlen(name) > len - 1)) { |
1349 char* n = &name[len-1]; | |
1350 if(strcasecmp(n,"-add") == 0) | |
1351 op = OP_ADD; | |
1352 else if(strcasecmp(n,"-pre") == 0) | |
1353 op = OP_PRE; | |
1354 else if(strcasecmp(n,"-del") == 0) | |
1355 op = OP_DEL; | |
1356 else if(strcasecmp(n,"-clr") == 0) | |
1357 op = OP_CLR; | |
1358 else { | |
1359 char prefix[len]; | |
1360 strncpy(prefix,opt->name,len-1); | |
1361 prefix[len-1] = '\0'; | |
10608 | 1362 mp_msg(MSGT_VFILTER,MSGL_ERR, "Option %s: unknown postfix %s\n" |
1363 "Supported postfixes are:\n" | |
9913 | 1364 " %3$s-add\n" |
1365 " Append the given list to the current list\n\n" | |
1366 " %3$s-pre\n" | |
1367 " Prepend the given list to the current list\n\n" | |
1368 " %3$s-del x,y,...\n" | |
1369 " Remove the given elements. Take the list element index (starting from 0).\n" | |
10641 | 1370 " Negative index can be used (i.e. -1 is the last element)\n\n" |
9913 | 1371 " %3$s-clr\n" |
10608 | 1372 " Clear the current list.\n",name,n,prefix); |
9913 | 1373 |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
1374 return M_OPT_UNKNOWN; |
9913 | 1375 } |
1376 } | |
1377 | |
1378 // Clear the list ?? | |
1379 if(op == OP_CLR) { | |
1380 if(dst) | |
1381 free_obj_settings_list(dst); | |
1382 return 0; | |
1383 } | |
1384 | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1385 if (param == NULL || strlen(param) == 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1386 return M_OPT_MISSING_PARAM; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1387 |
9913 | 1388 switch(op) { |
1389 case OP_ADD: | |
1390 if(dst) head = VAL(dst); | |
1391 break; | |
1392 case OP_PRE: | |
1393 if(dst) queue = VAL(dst); | |
1394 break; | |
1395 case OP_DEL: | |
1396 return obj_settings_list_del(name,param,dst,src); | |
1397 case OP_NONE: | |
1398 if(dst && VAL(dst)) | |
1399 free_obj_settings_list(dst); | |
1400 break; | |
1401 default: | |
1402 mp_msg(MSGT_VFILTER,MSGL_ERR, "Option %s: FIXME\n",name); | |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
1403 return M_OPT_UNKNOWN; |
9913 | 1404 } |
1405 | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1406 if(!strcmp(param,"help")) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1407 m_obj_list_t* ol = opt->priv; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1408 for(n = 0 ; ol->list[n] ; n++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1409 mp_msg(MSGT_VFILTER,MSGL_INFO," %-15s: %s\n", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1410 M_ST_MB(char*,ol->list[n],ol->name_off), |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1411 M_ST_MB(char*,ol->list[n],ol->info_off)); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1412 return M_OPT_EXIT; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1413 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1414 ptr = str = strdup(param); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1415 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1416 while(ptr[0] != '\0') { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1417 last_ptr = ptr; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1418 ptr = strchr(ptr,LIST_SEPARATOR); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1419 if(!ptr) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1420 r = parse_obj_settings(name,last_ptr,opt->priv,dst ? &res : NULL,n); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1421 if(r < 0) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1422 free(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1423 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1424 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1425 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1426 break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1427 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1428 ptr[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1429 r = parse_obj_settings(name,last_ptr,opt->priv,dst ? &res : NULL,n); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1430 if(r < 0) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1431 free(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1432 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1433 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1434 ptr++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1435 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1436 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1437 free(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1438 if(n == 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1439 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1440 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1441 if( ((opt->flags & M_OPT_MIN) && (n < opt->min)) || |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1442 ((opt->flags & M_OPT_MAX) && (n > opt->max)) ) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1443 return M_OPT_OUT_OF_RANGE; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1444 |
9913 | 1445 if(dst) { |
1446 if(queue) { | |
1447 int qsize; | |
1448 for(qsize = 0 ; queue[qsize].name ; qsize++) | |
1449 /* NOP */; | |
1450 res = realloc(res,(qsize+n+1)*sizeof(m_obj_settings_t)); | |
1451 memcpy(&res[n],queue,(qsize+1)*sizeof(m_obj_settings_t)); | |
1452 n += qsize; | |
1453 free(queue); | |
1454 } | |
1455 if(head) { | |
1456 int hsize; | |
1457 for(hsize = 0 ; head[hsize].name ; hsize++) | |
1458 /* NOP */; | |
1459 head = realloc(head,(hsize+n+1)*sizeof(m_obj_settings_t)); | |
1460 memcpy(&head[hsize],res,(n+1)*sizeof(m_obj_settings_t)); | |
1461 free(res); | |
1462 res = head; | |
1463 } | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1464 VAL(dst) = res; |
9913 | 1465 } |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1466 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1467 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1468 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1469 static void free_obj_settings_list(void* dst) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1470 int n; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1471 m_obj_settings_t *d; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1472 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1473 if(!dst || !VAL(dst)) return; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1474 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1475 d = VAL(dst); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1476 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1477 for(n = 0 ; d[n].name ; n++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1478 free(d[n].name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1479 free_str_list(&(d[n].attribs)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1480 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1481 free(d); |
8164 | 1482 #endif |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1483 VAL(dst) = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1484 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1485 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1486 static void copy_obj_settings_list(m_option_t* opt,void* dst, void* src) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1487 m_obj_settings_t *d,*s; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1488 int n; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1489 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1490 if(!(dst && src)) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1491 return; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1492 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1493 s = VAL(src); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1494 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1495 if(VAL(dst)) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1496 free_obj_settings_list(dst); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1497 if(!s) return; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1498 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1499 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1500 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1501 for(n = 0 ; s[n].name ; n++) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1502 /* NOP */; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1503 d = malloc((n+1)*sizeof(m_obj_settings_t)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1504 for(n = 0 ; s[n].name ; n++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1505 d[n].name = strdup(s[n].name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1506 d[n].attribs = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1507 copy_str_list(NULL,&(d[n].attribs),&(s[n].attribs)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1508 } |
10236 | 1509 d[n].name = NULL; |
1510 d[n].attribs = NULL; | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1511 VAL(dst) = d; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1512 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1513 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1514 m_option_type_t m_option_type_obj_settings_list = { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1515 "Object settings list", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1516 "", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1517 sizeof(m_obj_settings_t*), |
9913 | 1518 M_OPT_TYPE_DYNAMIC|M_OPT_TYPE_ALLOW_WILDCARD, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1519 parse_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1520 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1521 copy_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1522 copy_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1523 copy_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1524 free_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1525 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1526 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1527 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1528 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1529 static int parse_obj_presets(m_option_t* opt,char *name, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1530 char *param, void* dst, int src) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1531 m_obj_presets_t* obj_p = (m_obj_presets_t*)opt->priv; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1532 m_struct_t *in_desc,*out_desc; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1533 int s,i; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1534 unsigned char* pre = obj_p->presets; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1535 char* pre_name = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1536 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1537 if(!obj_p) { |
10641 | 1538 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Presets need a pointer to a m_obj_presets_t in the priv field.\n",name); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1539 return M_OPT_PARSER_ERR; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1540 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1541 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1542 if(!param) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1543 return M_OPT_MISSING_PARAM; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1544 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1545 in_desc = obj_p->in_desc; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1546 out_desc = obj_p->out_desc ? obj_p->out_desc : obj_p->in_desc; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1547 s = in_desc->size; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1548 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1549 if(!strcmp(param,"help")) { |
10641 | 1550 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "Available presets for %s->%s:",out_desc->name,name); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1551 for(pre = obj_p->presets;(pre_name = M_ST_MB(char*,pre,obj_p->name_off)) ; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1552 pre += s) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1553 mp_msg(MSGT_CFGPARSER, MSGL_ERR, " %s",pre_name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1554 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "\n"); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1555 return M_OPT_EXIT; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1556 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1557 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1558 for(pre_name = M_ST_MB(char*,pre,obj_p->name_off) ; pre_name ; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1559 pre += s, pre_name = M_ST_MB(char*,pre,obj_p->name_off)) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1560 if(!strcmp(pre_name,param)) break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1561 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1562 if(!pre_name) { |
10641 | 1563 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: There is no preset named %s\n" |
1564 "Available presets are:",name,param); | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1565 for(pre = obj_p->presets;(pre_name = M_ST_MB(char*,pre,obj_p->name_off)) ; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1566 pre += s) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1567 mp_msg(MSGT_CFGPARSER, MSGL_ERR, " %s",pre_name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1568 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "\n"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1569 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1570 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1571 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1572 if(!dst) return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1573 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1574 for(i = 0 ; in_desc->fields[i].name ; i++) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1575 m_option_t* out_opt = m_option_list_find(out_desc->fields, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1576 in_desc->fields[i].name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1577 if(!out_opt) { |
10641 | 1578 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Unable to find the target option for field %s.\nPlease report this to the developers.\n",name,in_desc->fields[i].name); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1579 return M_OPT_PARSER_ERR; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1580 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1581 m_option_copy(out_opt,M_ST_MB_P(dst,out_opt->p),M_ST_MB_P(pre,in_desc->fields[i].p)); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1582 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1583 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1584 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1585 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1586 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1587 m_option_type_t m_option_type_obj_presets = { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1588 "Object presets", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1589 "", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1590 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1591 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1592 parse_obj_presets, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1593 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1594 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1595 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1596 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1597 NULL |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1598 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1599 |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1600 static int parse_custom_url(m_option_t* opt,char *name, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1601 char *url, void* dst, int src) { |
11771
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1602 int pos1, pos2, r, v6addr = 0; |
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1603 char *ptr1=NULL, *ptr2=NULL, *ptr3=NULL, *ptr4=NULL; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1604 m_struct_t* desc = opt->priv; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1605 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1606 if(!desc) { |
10641 | 1607 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Custom URL needs a pointer to a m_struct_t in the priv field.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1608 return M_OPT_PARSER_ERR; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1609 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1610 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1611 // extract the protocol |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1612 ptr1 = strstr(url, "://"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1613 if( ptr1==NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1614 // Filename only |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1615 if(m_option_list_find(desc->fields,"filename")) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1616 m_struct_set(desc,dst,"filename",url); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1617 return 1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1618 } |
10641 | 1619 mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Option %s: URL doesn't have a valid protocol!\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1620 return M_OPT_INVALID; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1621 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1622 pos1 = ptr1-url; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1623 if(dst && m_option_list_find(desc->fields,"protocol")) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1624 ptr1[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1625 r = m_struct_set(desc,dst,"protocol",url); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1626 ptr1[0] = ':'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1627 if(r < 0) { |
10641 | 1628 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while setting protocol.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1629 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1630 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1631 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1632 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1633 // jump the "://" |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1634 ptr1 += 3; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1635 pos1 += 3; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1636 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1637 // check if a username:password is given |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1638 ptr2 = strstr(ptr1, "@"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1639 ptr3 = strstr(ptr1, "/"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1640 if( ptr3!=NULL && ptr3<ptr2 ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1641 // it isn't really a username but rather a part of the path |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1642 ptr2 = NULL; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1643 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1644 if( ptr2!=NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1645 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1646 // We got something, at least a username... |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1647 int len = ptr2-ptr1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1648 if(!m_option_list_find(desc->fields,"username")) { |
10641 | 1649 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: This URL doesn't have a username part.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1650 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1651 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1652 ptr3 = strstr(ptr1, ":"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1653 if( ptr3!=NULL && ptr3<ptr2 ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1654 // We also have a password |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1655 int len2 = ptr2-ptr3-1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1656 if(!m_option_list_find(desc->fields,"password")) { |
10641 | 1657 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: This URL doesn't have a password part.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1658 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1659 } else { // Username and password |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1660 if(dst) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1661 ptr3[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1662 r = m_struct_set(desc,dst,"username",ptr1); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1663 ptr3[0] = ':'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1664 if(r < 0) { |
10641 | 1665 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while setting username.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1666 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1667 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1668 ptr2[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1669 r = m_struct_set(desc,dst,"password",ptr3+1); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1670 ptr2[0] = '@'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1671 if(r < 0) { |
10641 | 1672 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while setting password.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1673 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1674 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1675 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1676 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1677 } else { // User name only |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1678 ptr2[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1679 r = m_struct_set(desc,dst,"username",ptr1); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1680 ptr2[0] = '@'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1681 if(r < 0) { |
10641 | 1682 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while setting username.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1683 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1684 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1685 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1686 } |
10592
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1687 ptr1 = ptr2+1; |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1688 pos1 = ptr1-url; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1689 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1690 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1691 // before looking for a port number check if we have an IPv6 type numeric address |
10641 | 1692 // in an IPv6 URL the numeric address should be inside square braces. |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1693 ptr2 = strstr(ptr1, "["); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1694 ptr3 = strstr(ptr1, "]"); |
11771
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1695 // If the [] is after the first it isn't the hostname |
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1696 ptr4 = strstr(ptr1, "/"); |
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1697 if( ptr2!=NULL && ptr3!=NULL && (ptr2 < ptr3) && (!ptr4 || ptr4 > ptr3)) { |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1698 // we have an IPv6 numeric address |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1699 ptr1++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1700 pos1++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1701 ptr2 = ptr3; |
11771
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1702 v6addr = 1; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1703 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1704 ptr2 = ptr1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1705 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1706 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1707 // look if the port is given |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1708 ptr2 = strstr(ptr2, ":"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1709 // If the : is after the first / it isn't the port |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1710 ptr3 = strstr(ptr1, "/"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1711 if(ptr3 && ptr3 - ptr2 < 0) ptr2 = NULL; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1712 if( ptr2==NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1713 // No port is given |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1714 // Look if a path is given |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1715 if( ptr3==NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1716 // No path/filename |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1717 // So we have an URL like http://www.hostname.com |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1718 pos2 = strlen(url); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1719 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1720 // We have an URL like http://www.hostname.com/file.txt |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1721 pos2 = ptr3-url; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1722 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1723 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1724 // We have an URL beginning like http://www.hostname.com:1212 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1725 // Get the port number |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1726 if(!m_option_list_find(desc->fields,"port")) { |
10641 | 1727 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: This URL doesn't have a port part.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1728 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1729 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1730 if(dst) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1731 int p = atoi(ptr2+1); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1732 char tmp[100]; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1733 snprintf(tmp,99,"%d",p); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1734 r = m_struct_set(desc,dst,"port",tmp); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1735 if(r < 0) { |
10641 | 1736 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while setting port.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1737 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1738 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1739 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1740 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1741 pos2 = ptr2-url; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1742 } |
11771
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1743 if( v6addr ) pos2--; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1744 // Get the hostname |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1745 if(pos2-pos1 > 0) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1746 if(!m_option_list_find(desc->fields,"hostname")) { |
10641 | 1747 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: This URL doesn't have a hostname part.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1748 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1749 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1750 char tmp[pos2-pos1+1]; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1751 strncpy(tmp,ptr1, pos2-pos1); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1752 tmp[pos2-pos1] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1753 r = m_struct_set(desc,dst,"hostname",tmp); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1754 if(r < 0) { |
10641 | 1755 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while setting hostname.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1756 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1757 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1758 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1759 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1760 // Look if a path is given |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1761 ptr2 = strstr(ptr1, "/"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1762 if( ptr2!=NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1763 // A path/filename is given |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1764 // check if it's not a trailing '/' |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1765 if( strlen(ptr2)>1 ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1766 // copy the path/filename in the URL container |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1767 if(!m_option_list_find(desc->fields,"filename")) { |
10641 | 1768 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: This URL doesn't have a hostname part.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1769 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1770 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1771 if(dst) { |
10592
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1772 int l = strlen(ptr2+1) + 1; |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1773 char* fname = ptr2+1; |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1774 if(l > 1) { |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1775 fname = malloc(l); |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1776 url_unescape_string(fname,ptr2+1); |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1777 } |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1778 r = m_struct_set(desc,dst,"filename",fname); |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1779 if(fname != ptr2+1) |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
1780 free(fname); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1781 if(r < 0) { |
10641 | 1782 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Error while setting filename.\n",name); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1783 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1784 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1785 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1786 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1787 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1788 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1789 return 1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1790 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1791 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1792 /// TODO : Write the other needed funcs for 'normal' options |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1793 m_option_type_t m_option_type_custom_url = { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1794 "Custom URL", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1795 "", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1796 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1797 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1798 parse_custom_url, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1799 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1800 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1801 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1802 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1803 NULL |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1804 }; |