Mercurial > mplayer.hg
annotate m_option.c @ 23572:a00685941686
demux_mkv very long seek fix
The seek code searching for the closest position in the index used
"int64_t min_diff=0xFFFFFFFL" as the initial "further from the goal
than any real alternative" value. The unit is milliseconds so seeks more
than about 75 hours past the end of the file would fail to recognize the
last index position as the best match. This was triggered in practice by
chapter seek code which apparently uses a seek of 1000000000 seconds
forward to mean "seek to the end". The practical effect was that trying
to seek to the next chapter in a file without chapters made MPlayer
block until it finished reading the file from the current position to
the end.
Fixed by increasing the initial value from FFFFFFF to FFFFFFFFFFFFFFF.
author | uau |
---|---|
date | Wed, 20 Jun 2007 18:19:03 +0000 |
parents | 6b18c979dd45 |
children | 9fb716ab06a3 |
rev | line source |
---|---|
18258 | 1 |
2 /// \file | |
3 /// \ingroup Options | |
4 | |
8164 | 5 #include "config.h" |
6 | |
7 #include <stdlib.h> | |
8 #include <string.h> | |
9 #include <math.h> | |
10 #include <stdio.h> | |
11 #include <stdarg.h> | |
12 #include <inttypes.h> | |
8262 | 13 #include <unistd.h> |
8164 | 14 |
15 #include "m_option.h" | |
16 //#include "m_config.h" | |
17 #include "mp_msg.h" | |
19271
64d82a45a05d
introduce new 'stream' directory for all stream layer related components and split them from libmpdemux
ben
parents:
19194
diff
changeset
|
18 #include "stream/url.h" |
8164 | 19 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
20 // 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
|
21 #ifndef MP_DEBUG |
16425
7ca9d8c0ae47
Do not define NO_FREE, it causes a giant memleak with -loop 0 and a short file.
reimar
parents:
16345
diff
changeset
|
22 //#define NO_FREE |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
23 #endif |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
24 |
19053
75327b24e06f
marks several string parameters as const, as they are not modified inside the function, Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18958
diff
changeset
|
25 m_option_t* m_option_list_find(m_option_t* list,const char* name) { |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
26 int i; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
27 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
28 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
|
29 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
|
30 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
|
31 (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
|
32 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
|
33 return &list[i]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
34 } 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
|
35 return &list[i]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
36 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
37 return NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
38 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
39 |
10641 | 40 // Default function that just does a memcpy |
8164 | 41 |
42 static void copy_opt(m_option_t* opt,void* dst,void* src) { | |
43 if(dst && src) | |
44 memcpy(dst,src,opt->type->size); | |
45 } | |
46 | |
47 // Helper for the print funcs (from man printf) | |
48 static char* dup_printf(const char *fmt, ...) { | |
49 /* Guess we need no more than 50 bytes. */ | |
50 int n, size = 50; | |
51 char *p; | |
52 va_list ap; | |
53 if ((p = malloc (size)) == NULL) | |
54 return NULL; | |
55 while (1) { | |
56 /* Try to print in the allocated space. */ | |
57 va_start(ap, fmt); | |
58 n = vsnprintf (p, size, fmt, ap); | |
59 va_end(ap); | |
60 /* If that worked, return the string. */ | |
61 if (n > -1 && n < size) | |
62 return p; | |
63 /* Else try again with more space. */ | |
64 if (n > -1) /* glibc 2.1 */ | |
65 size = n+1; /* precisely what is needed */ | |
66 else /* glibc 2.0 */ | |
67 size *= 2; /* twice the old size */ | |
68 if ((p = realloc (p, size)) == NULL) | |
69 return NULL; | |
70 } | |
71 } | |
72 | |
73 | |
74 // Flag | |
75 | |
76 #define VAL(x) (*(int*)(x)) | |
77 | |
78 static int parse_flag(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
79 if (src == M_CONFIG_FILE) { | |
10355
b39a943c902f
Fix the segfault in case of missing arg for flag options
albeu
parents:
10236
diff
changeset
|
80 if(!param) return M_OPT_MISSING_PARAM; |
8164 | 81 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
|
82 !strcasecmp(param, "on") || |
8164 | 83 !strcasecmp(param, "ja") || |
84 !strcasecmp(param, "si") || | |
85 !strcasecmp(param, "igen") || | |
86 !strcasecmp(param, "y") || | |
87 !strcasecmp(param, "j") || | |
88 !strcasecmp(param, "i") || | |
11781 | 89 !strcasecmp(param, "tak") || |
11785 | 90 !strcasecmp(param, "ja") || |
12775 | 91 !strcasecmp(param, "true") || |
8164 | 92 !strcmp(param, "1")) { |
93 if(dst) VAL(dst) = opt->max; | |
94 } 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
|
95 !strcasecmp(param, "off") || |
8164 | 96 !strcasecmp(param, "nein") || |
97 !strcasecmp(param, "nicht") || | |
98 !strcasecmp(param, "nem") || | |
99 !strcasecmp(param, "n") || | |
11781 | 100 !strcasecmp(param, "nie") || |
11785 | 101 !strcasecmp(param, "nej") || |
12775 | 102 !strcasecmp(param, "false") || |
8164 | 103 !strcmp(param, "0")) { |
104 if(dst) VAL(dst) = opt->min; | |
105 } else { | |
10641 | 106 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid parameter for %s flag: %s\n",name, param); |
8164 | 107 return M_OPT_INVALID; |
108 } | |
109 return 1; | |
110 } else { | |
111 if(dst) VAL(dst) = opt->max; | |
112 return 0; | |
113 } | |
114 } | |
115 | |
116 static char* print_flag(m_option_t* opt, void* val) { | |
117 if(VAL(val) == opt->min) | |
118 return strdup("no"); | |
119 else | |
120 return strdup("yes"); | |
121 } | |
122 | |
123 m_option_type_t m_option_type_flag = { | |
124 "Flag", | |
125 "need yes or no in config files", | |
126 sizeof(int), | |
127 0, | |
128 parse_flag, | |
129 print_flag, | |
130 copy_opt, | |
131 copy_opt, | |
132 NULL, | |
133 NULL | |
134 }; | |
135 | |
136 // Integer | |
137 | |
138 static int parse_int(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
139 long tmp_int; | |
140 char *endptr; | |
141 src = 0; | |
142 | |
143 if (param == NULL) | |
144 return M_OPT_MISSING_PARAM; | |
145 | |
18718
7ef29a590f3f
Do not parse numbers as octal, strip leading zeroes instead.
reimar
parents:
18258
diff
changeset
|
146 tmp_int = strtol(param, &endptr, 10); |
7ef29a590f3f
Do not parse numbers as octal, strip leading zeroes instead.
reimar
parents:
18258
diff
changeset
|
147 if (*endptr) |
8164 | 148 tmp_int = strtol(param, &endptr, 0); |
149 if (*endptr) { | |
150 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be an integer: %s\n",name, param); | |
151 return M_OPT_INVALID; | |
152 } | |
153 | |
154 if ((opt->flags & M_OPT_MIN) && (tmp_int < opt->min)) { | |
155 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be >= %d: %s\n", name, (int) opt->min, param); | |
156 return M_OPT_OUT_OF_RANGE; | |
157 } | |
158 | |
159 if ((opt->flags & M_OPT_MAX) && (tmp_int > opt->max)) { | |
160 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be <= %d: %s\n",name, (int) opt->max, param); | |
161 return M_OPT_OUT_OF_RANGE; | |
162 } | |
163 | |
164 if(dst) VAL(dst) = tmp_int; | |
165 | |
166 return 1; | |
167 } | |
168 | |
169 static char* print_int(m_option_t* opt, void* val) { | |
170 opt = NULL; | |
171 return dup_printf("%d",VAL(val)); | |
172 } | |
173 | |
174 m_option_type_t m_option_type_int = { | |
175 "Integer", | |
176 "", | |
177 sizeof(int), | |
178 0, | |
179 parse_int, | |
180 print_int, | |
181 copy_opt, | |
182 copy_opt, | |
183 NULL, | |
184 NULL | |
185 }; | |
186 | |
187 // Float | |
188 | |
189 #undef VAL | |
11947 | 190 #define VAL(x) (*(double*)(x)) |
8164 | 191 |
11947 | 192 static int parse_double(m_option_t* opt,char *name, char *param, void* dst, int src) { |
193 double tmp_float; | |
8164 | 194 char* endptr; |
195 src = 0; | |
196 | |
197 if (param == NULL) | |
198 return M_OPT_MISSING_PARAM; | |
199 | |
200 tmp_float = strtod(param, &endptr); | |
201 | |
202 switch(*endptr) { | |
203 case ':': | |
204 case '/': | |
205 tmp_float /= strtod(endptr+1, &endptr); | |
206 break; | |
207 case '.': | |
208 case ',': | |
209 /* we also handle floats specified with | |
210 * non-locale decimal point ::atmos | |
211 */ | |
212 if(tmp_float<0) | |
213 tmp_float -= 1.0/pow(10,strlen(endptr+1)) * strtod(endptr+1, &endptr); | |
214 else | |
215 tmp_float += 1.0/pow(10,strlen(endptr+1)) * strtod(endptr+1, &endptr); | |
216 break; | |
217 } | |
218 | |
219 if (*endptr) { | |
220 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be a floating point " | |
221 "number or a ratio (numerator[:/]denominator): %s\n",name, param); | |
222 return M_OPT_INVALID; | |
223 } | |
224 | |
225 if (opt->flags & M_OPT_MIN) | |
226 if (tmp_float < opt->min) { | |
227 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be >= %f: %s\n", name, opt->min, param); | |
228 return M_OPT_OUT_OF_RANGE; | |
229 } | |
230 | |
231 if (opt->flags & M_OPT_MAX) | |
232 if (tmp_float > opt->max) { | |
233 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be <= %f: %s\n", name, opt->max, param); | |
234 return M_OPT_OUT_OF_RANGE; | |
235 } | |
236 | |
237 if(dst) VAL(dst) = tmp_float; | |
238 return 1; | |
239 } | |
240 | |
11947 | 241 static char* print_double(m_option_t* opt, void* val) { |
242 opt = NULL; | |
243 return dup_printf("%f",VAL(val)); | |
244 } | |
245 | |
246 m_option_type_t m_option_type_double = { | |
247 "Double", | |
248 "double precission floating point number or ratio (numerator[:/]denominator)", | |
249 sizeof(double), | |
250 0, | |
251 parse_double, | |
252 print_double, | |
253 copy_opt, | |
254 copy_opt, | |
255 NULL, | |
256 NULL | |
257 }; | |
258 | |
259 #undef VAL | |
260 #define VAL(x) (*(float*)(x)) | |
261 | |
262 static int parse_float(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
263 double tmp; | |
264 int r= parse_double(opt, name, param, &tmp, src); | |
265 if(r==1 && dst) VAL(dst) = tmp; | |
11950 | 266 return r; |
11947 | 267 } |
268 | |
8164 | 269 static char* print_float(m_option_t* opt, void* val) { |
270 opt = NULL; | |
271 return dup_printf("%f",VAL(val)); | |
272 } | |
273 | |
274 m_option_type_t m_option_type_float = { | |
275 "Float", | |
276 "floating point number or ratio (numerator[:/]denominator)", | |
277 sizeof(float), | |
278 0, | |
279 parse_float, | |
280 print_float, | |
281 copy_opt, | |
282 copy_opt, | |
283 NULL, | |
284 NULL | |
285 }; | |
286 | |
287 ///////////// Position | |
288 #undef VAL | |
289 #define VAL(x) (*(off_t*)(x)) | |
290 | |
291 static int parse_position(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
292 off_t tmp_off; | |
293 char dummy; | |
294 | |
295 if (param == NULL) | |
296 return M_OPT_MISSING_PARAM; | |
297 if (sscanf(param, sizeof(off_t) == sizeof(int) ? | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16741
diff
changeset
|
298 "%d%c" : "%"PRId64"%c", &tmp_off, &dummy) != 1) { |
8164 | 299 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be an integer: %s\n",opt->name,param); |
300 return M_OPT_INVALID; | |
301 } | |
302 | |
303 if (opt->flags & M_OPT_MIN) | |
304 if (tmp_off < opt->min) { | |
305 mp_msg(MSGT_CFGPARSER, MSGL_ERR, | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16741
diff
changeset
|
306 "The %s option must be >= %"PRId64": %s\n", |
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16741
diff
changeset
|
307 name, (int64_t) opt->min, param); |
8164 | 308 return M_OPT_OUT_OF_RANGE; |
309 } | |
310 | |
311 if (opt->flags & M_OPT_MAX) | |
312 if (tmp_off > opt->max) { | |
313 mp_msg(MSGT_CFGPARSER, MSGL_ERR, | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16741
diff
changeset
|
314 "The %s option must be <= %"PRId64": %s\n", |
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16741
diff
changeset
|
315 name, (int64_t) opt->max, param); |
8164 | 316 return M_OPT_OUT_OF_RANGE; |
317 } | |
318 | |
319 if(dst) | |
320 VAL(dst) = tmp_off; | |
321 return 1; | |
322 } | |
323 | |
324 static char* print_position(m_option_t* opt, void* val) { | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16741
diff
changeset
|
325 return dup_printf("%"PRId64,(int64_t)VAL(val)); |
8164 | 326 } |
327 | |
328 m_option_type_t m_option_type_position = { | |
329 "Position", | |
330 "Integer (off_t)", | |
331 sizeof(off_t), | |
332 0, | |
333 parse_position, | |
334 print_position, | |
335 copy_opt, | |
336 copy_opt, | |
337 NULL, | |
338 NULL | |
339 }; | |
340 | |
341 | |
342 ///////////// String | |
343 | |
344 #undef VAL | |
345 #define VAL(x) (*(char**)(x)) | |
346 | |
347 static int parse_str(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
348 | |
349 | |
350 if (param == NULL) | |
351 return M_OPT_MISSING_PARAM; | |
352 | |
353 if ((opt->flags & M_OPT_MIN) && (strlen(param) < opt->min)) { | |
10641 | 354 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Parameter must be >= %d chars: %s\n", |
8164 | 355 (int) opt->min, param); |
356 return M_OPT_OUT_OF_RANGE; | |
357 } | |
358 | |
359 if ((opt->flags & M_OPT_MAX) && (strlen(param) > opt->max)) { | |
10641 | 360 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Parameter must be <= %d chars: %s\n", |
8164 | 361 (int) opt->max, param); |
362 return M_OPT_OUT_OF_RANGE; | |
363 } | |
364 | |
365 if(dst) { | |
366 if(VAL(dst)) | |
367 free(VAL(dst)); | |
368 VAL(dst) = strdup(param); | |
369 } | |
370 | |
371 return 1; | |
372 | |
373 } | |
374 | |
375 static char* print_str(m_option_t* opt, void* val) { | |
8168 | 376 return (val && VAL(val) && strlen(VAL(val)) > 0) ? strdup(VAL(val)) : NULL; |
8164 | 377 } |
378 | |
379 static void copy_str(m_option_t* opt,void* dst, void* src) { | |
380 if(dst && src) { | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
381 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
382 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
|
383 #endif |
8164 | 384 VAL(dst) = VAL(src) ? strdup(VAL(src)) : NULL; |
385 } | |
386 } | |
387 | |
388 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
|
389 if(src && VAL(src)){ |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
390 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
391 free(VAL(src)); //FIXME!!! |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
392 #endif |
8164 | 393 VAL(src) = NULL; |
394 } | |
395 } | |
396 | |
397 m_option_type_t m_option_type_string = { | |
398 "String", | |
399 "", | |
400 sizeof(char*), | |
401 M_OPT_TYPE_DYNAMIC, | |
402 parse_str, | |
403 print_str, | |
404 copy_str, | |
405 copy_str, | |
406 copy_str, | |
407 free_str | |
408 }; | |
409 | |
410 //////////// String list | |
411 | |
412 #define LIST_SEPARATOR ',' | |
413 #undef VAL | |
414 #define VAL(x) (*(char***)(x)) | |
415 | |
416 #define OP_NONE 0 | |
417 #define OP_ADD 1 | |
418 #define OP_PRE 2 | |
419 #define OP_DEL 3 | |
420 #define OP_CLR 4 | |
421 | |
422 static void free_str_list(void* dst) { | |
423 char** d; | |
424 int i; | |
425 | |
426 if(!dst || !VAL(dst)) return; | |
427 d = VAL(dst); | |
428 | |
9177
01a713dcaf23
disable free() in string and string_list parsers. yes, it's a hack
arpi
parents:
8736
diff
changeset
|
429 // FIXME!!! |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
430 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
431 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
|
432 free(d[i]); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
433 free(d); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
434 #endif |
8164 | 435 VAL(dst) = NULL; |
436 } | |
437 | |
438 static int str_list_add(char** add, int n,void* dst,int pre) { | |
439 char** lst = VAL(dst); | |
440 int ln; | |
441 | |
442 if(!dst) return M_OPT_PARSER_ERR; | |
443 lst = VAL(dst); | |
444 | |
445 for(ln = 0 ; lst && lst[ln] ; ln++) | |
446 /**/; | |
447 | |
448 lst = realloc(lst,(n+ln+1)*sizeof(char*)); | |
449 | |
450 if(pre) { | |
451 memmove(&lst[n],lst,(ln+1)*sizeof(char*)); | |
452 memcpy(lst,add,n*sizeof(char*)); | |
453 } else | |
454 memcpy(&lst[ln],add,(n+1)*sizeof(char*)); | |
455 | |
456 free(add); | |
457 | |
458 VAL(dst) = lst; | |
459 | |
460 return 1; | |
461 } | |
462 | |
463 static int str_list_del(char** del, int n,void* dst) { | |
464 char **lst,*ep,**d; | |
465 int i,ln,s; | |
466 long idx; | |
467 | |
468 if(!dst) return M_OPT_PARSER_ERR; | |
469 lst = VAL(dst); | |
470 | |
471 for(ln = 0 ; lst && lst[ln] ; ln++) | |
472 /**/; | |
473 s = ln; | |
474 | |
475 for(i = 0 ; del[i] != NULL ; i++) { | |
476 idx = strtol(del[i], &ep, 0); | |
477 if(*ep) { | |
478 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid index: %s\n",del[i]); | |
479 free(del[i]); | |
480 continue; | |
481 } | |
482 free(del[i]); | |
483 if(idx < 0 || idx >= ln) { | |
10641 | 484 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Index %ld is out of range.\n",idx); |
8164 | 485 continue; |
486 } else if(!lst[idx]) | |
487 continue; | |
488 free(lst[idx]); | |
489 lst[idx] = NULL; | |
490 s--; | |
491 } | |
492 free(del); | |
493 | |
494 if(s == 0) { | |
495 if(lst) free(lst); | |
496 VAL(dst) = NULL; | |
497 return 1; | |
498 } | |
499 | |
500 d = calloc(s+1,sizeof(char*)); | |
501 for(i = 0, n = 0 ; i < ln ; i++) { | |
502 if(!lst[i]) continue; | |
503 d[n] = lst[i]; | |
504 n++; | |
505 } | |
506 d[s] = NULL; | |
507 | |
508 if(lst) free(lst); | |
509 VAL(dst) = d; | |
510 | |
511 return 1; | |
512 } | |
513 | |
22133 | 514 static char *get_nextsep(char *ptr, char sep, int modify) { |
515 char *last_ptr = ptr; | |
516 for(;;){ | |
517 ptr = strchr(ptr, sep); | |
518 if(ptr && ptr>last_ptr && ptr[-1]=='\\'){ | |
519 if (modify) memmove(ptr-1, ptr, strlen(ptr)+1); | |
520 else ptr++; | |
521 }else | |
522 break; | |
523 } | |
524 return ptr; | |
525 } | |
8164 | 526 |
527 static int parse_str_list(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
528 int n = 0,len = strlen(opt->name); | |
22133 | 529 char *str; |
8164 | 530 char *ptr = param, *last_ptr, **res; |
531 int op = OP_NONE; | |
532 | |
533 if(opt->name[len-1] == '*' && ((int)strlen(name) > len - 1)) { | |
534 char* n = &name[len-1]; | |
535 if(strcasecmp(n,"-add") == 0) | |
536 op = OP_ADD; | |
537 else if(strcasecmp(n,"-pre") == 0) | |
538 op = OP_PRE; | |
539 else if(strcasecmp(n,"-del") == 0) | |
540 op = OP_DEL; | |
541 else if(strcasecmp(n,"-clr") == 0) | |
542 op = OP_CLR; | |
543 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
|
544 return M_OPT_UNKNOWN; |
8164 | 545 } |
546 | |
547 // Clear the list ?? | |
548 if(op == OP_CLR) { | |
549 if(dst) | |
550 free_str_list(dst); | |
551 return 0; | |
552 } | |
553 | |
10641 | 554 // All other ops need a param |
8164 | 555 if (param == NULL || strlen(param) == 0) |
556 return M_OPT_MISSING_PARAM; | |
557 | |
558 | |
559 while(ptr[0] != '\0') { | |
22133 | 560 ptr = get_nextsep(ptr, LIST_SEPARATOR, 0); |
8164 | 561 if(!ptr) { |
562 n++; | |
563 break; | |
564 } | |
565 ptr++; | |
566 n++; | |
567 } | |
568 if(n == 0) | |
569 return M_OPT_INVALID; | |
570 if( ((opt->flags & M_OPT_MIN) && (n < opt->min)) || | |
571 ((opt->flags & M_OPT_MAX) && (n > opt->max)) ) | |
572 return M_OPT_OUT_OF_RANGE; | |
573 | |
574 if(!dst) return 1; | |
575 | |
8384
7a7980b874f5
fixed 'mplayer -nosound xxx' sig11 if configfile have string list options
arpi
parents:
8262
diff
changeset
|
576 res = malloc((n+2)*sizeof(char*)); |
22133 | 577 ptr = str = strdup(param); |
8164 | 578 n = 0; |
579 | |
580 while(1) { | |
581 last_ptr = ptr; | |
22133 | 582 ptr = get_nextsep(ptr, LIST_SEPARATOR, 1); |
8164 | 583 if(!ptr) { |
584 res[n] = strdup(last_ptr); | |
585 n++; | |
586 break; | |
587 } | |
588 len = ptr - last_ptr; | |
18869 | 589 res[n] = malloc(len + 1); |
8164 | 590 if(len) strncpy(res[n],last_ptr,len); |
591 res[n][len] = '\0'; | |
592 ptr++; | |
593 n++; | |
594 } | |
595 res[n] = NULL; | |
22133 | 596 free(str); |
8164 | 597 |
598 switch(op) { | |
599 case OP_ADD: | |
600 return str_list_add(res,n,dst,0); | |
601 case OP_PRE: | |
602 return str_list_add(res,n,dst,1); | |
603 case OP_DEL: | |
604 return str_list_del(res,n,dst); | |
605 } | |
606 | |
607 if(VAL(dst)) | |
608 free_str_list(dst); | |
609 VAL(dst) = res; | |
610 | |
611 return 1; | |
612 } | |
613 | |
614 static void copy_str_list(m_option_t* opt,void* dst, void* src) { | |
615 int n; | |
616 char **d,**s; | |
617 | |
618 if(!(dst && src)) return; | |
619 s = VAL(src); | |
620 | |
621 if(VAL(dst)) | |
622 free_str_list(dst); | |
623 | |
624 if(!s) { | |
625 VAL(dst) = NULL; | |
626 return; | |
627 } | |
628 | |
629 for(n = 0 ; s[n] != NULL ; n++) | |
630 /* NOTHING */; | |
18869 | 631 d = malloc((n+1)*sizeof(char*)); |
8164 | 632 for( ; n >= 0 ; n--) |
633 d[n] = s[n] ? strdup(s[n]) : NULL; | |
634 | |
635 VAL(dst) = d; | |
636 } | |
637 | |
638 static char* print_str_list(m_option_t* opt, void* src) { | |
8168 | 639 char **lst = NULL; |
640 char *ret = NULL,*last = NULL; | |
641 int i; | |
642 | |
643 if(!(src && VAL(src))) return NULL; | |
644 lst = VAL(src); | |
645 | |
646 for(i = 0 ; lst[i] ; i++) { | |
647 if(last) { | |
648 ret = dup_printf("%s,%s",last,lst[i]); | |
649 free(last); | |
650 } else | |
651 ret = strdup(lst[i]); | |
652 last = ret; | |
653 } | |
654 if(last && last != ret) free(last); | |
655 return ret; | |
8164 | 656 } |
657 | |
658 m_option_type_t m_option_type_string_list = { | |
659 "String list", | |
10641 | 660 "A list of strings separated by ','\n" |
661 "Option with a name ending in an * permits using the following suffix: \n" | |
662 "\t-add: Add the given parameters at the end of the list.\n" | |
663 "\t-pre: Add the given parameters at the begining of the list.\n" | |
664 "\t-del: Remove the entry at the given indices.\n" | |
665 "\t-clr: Clear the list.\n" | |
11261 | 666 "e.g: -vf-add flip,mirror -vf-del 2,5\n", |
8164 | 667 sizeof(char**), |
668 M_OPT_TYPE_DYNAMIC | M_OPT_TYPE_ALLOW_WILDCARD, | |
669 parse_str_list, | |
670 print_str_list, | |
671 copy_str_list, | |
672 copy_str_list, | |
673 copy_str_list, | |
674 free_str_list | |
675 }; | |
676 | |
677 | |
678 /////////////////// Func based options | |
679 | |
680 // A chained list to save the various calls for func_param and func_full | |
681 typedef struct m_func_save m_func_save_t; | |
682 struct m_func_save { | |
683 m_func_save_t* next; | |
684 char* name; | |
685 char* param; | |
686 }; | |
687 | |
688 #undef VAL | |
689 #define VAL(x) (*(m_func_save_t**)(x)) | |
690 | |
691 static void free_func_pf(void* src) { | |
692 m_func_save_t *s,*n; | |
693 | |
694 if(!src) return; | |
695 | |
696 s = VAL(src); | |
697 | |
698 while(s) { | |
699 n = s->next; | |
700 free(s->name); | |
701 if(s->param) free(s->param); | |
702 free(s); | |
703 s = n; | |
704 } | |
705 VAL(src) = NULL; | |
706 } | |
707 | |
708 // Parser for func_param and func_full | |
709 static int parse_func_pf(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
710 m_func_save_t *s,*p; | |
711 | |
712 if(!dst) | |
713 return 1; | |
714 | |
18879 | 715 s = calloc(1,sizeof(m_func_save_t)); |
8164 | 716 s->name = strdup(name); |
717 s->param = param ? strdup(param) : NULL; | |
718 | |
719 p = VAL(dst); | |
720 if(p) { | |
721 for( ; p->next != NULL ; p = p->next) | |
722 /**/; | |
723 p->next = s; | |
724 } else | |
725 VAL(dst) = s; | |
726 | |
727 return 1; | |
728 } | |
729 | |
730 static void copy_func_pf(m_option_t* opt,void* dst, void* src) { | |
731 m_func_save_t *d = NULL, *s,* last = NULL; | |
732 | |
733 if(!(dst && src)) return; | |
734 s = VAL(src); | |
735 | |
736 if(VAL(dst)) | |
737 free_func_pf(dst); | |
738 | |
739 while(s) { | |
18879 | 740 d = calloc(1,sizeof(m_func_save_t)); |
8164 | 741 d->name = strdup(s->name); |
742 d->param = s->param ? strdup(s->param) : NULL; | |
743 if(last) | |
744 last->next = d; | |
745 else | |
746 VAL(dst) = d; | |
747 last = d; | |
748 s = s->next; | |
749 } | |
750 | |
751 | |
752 } | |
753 | |
754 /////////////////// Func_param | |
755 | |
756 static void set_func_param(m_option_t* opt, void* dst, void* src) { | |
757 m_func_save_t* s; | |
758 | |
759 if(!src) return; | |
760 s = VAL(src); | |
761 | |
762 if(!s) return; | |
763 | |
764 // Revert if needed | |
765 if(opt->priv) ((m_opt_default_func_t)opt->priv)(opt,opt->name); | |
766 for( ; s != NULL ; s = s->next) | |
767 ((m_opt_func_param_t) opt->p)(opt,s->param); | |
768 } | |
769 | |
770 m_option_type_t m_option_type_func_param = { | |
771 "Func param", | |
772 "", | |
773 sizeof(m_func_save_t*), | |
774 M_OPT_TYPE_INDIRECT, | |
775 parse_func_pf, | |
776 NULL, | |
777 NULL, // Nothing to do on save | |
778 set_func_param, | |
779 copy_func_pf, | |
780 free_func_pf | |
781 }; | |
782 | |
783 /////////////////// Func_full | |
784 | |
785 static void set_func_full(m_option_t* opt, void* dst, void* src) { | |
786 m_func_save_t* s; | |
787 | |
788 if(!src) return; | |
789 | |
790 for(s = VAL(src) ; s ; s = s->next) { | |
791 // Revert if needed | |
792 if(opt->priv) ((m_opt_default_func_t)opt->priv)(opt,s->name); | |
793 ((m_opt_func_full_t) opt->p)(opt,s->name,s->param); | |
794 } | |
795 } | |
796 | |
797 m_option_type_t m_option_type_func_full = { | |
798 "Func full", | |
799 "", | |
800 sizeof(m_func_save_t*), | |
801 M_OPT_TYPE_ALLOW_WILDCARD|M_OPT_TYPE_INDIRECT, | |
802 parse_func_pf, | |
803 NULL, | |
804 NULL, // Nothing to do on save | |
805 set_func_full, | |
806 copy_func_pf, | |
807 free_func_pf | |
808 }; | |
809 | |
810 /////////////// Func | |
811 | |
812 #undef VAL | |
813 #define VAL(x) (*(int*)(x)) | |
814 | |
815 static int parse_func(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
816 if(dst) | |
817 VAL(dst) += 1; | |
818 return 0; | |
819 } | |
820 | |
821 static void set_func(m_option_t* opt,void* dst, void* src) { | |
822 int i; | |
823 if(opt->priv) ((m_opt_default_func_t)opt->priv)(opt,opt->name); | |
824 for(i = 0 ; i < VAL(src) ; i++) | |
825 ((m_opt_func_t) opt->p)(opt); | |
826 } | |
827 | |
828 m_option_type_t m_option_type_func = { | |
829 "Func", | |
830 "", | |
831 sizeof(int), | |
832 M_OPT_TYPE_INDIRECT, | |
833 parse_func, | |
834 NULL, | |
835 NULL, // Nothing to do on save | |
836 set_func, | |
837 NULL, | |
838 NULL | |
839 }; | |
840 | |
841 /////////////////// Print | |
842 | |
843 static int parse_print(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
17468
41d8991c3632
Fix misuse of the M_OPT_TYPE_INDIRECT flag, it has nothing to do
albeu
parents:
16854
diff
changeset
|
844 if(opt->type == CONF_TYPE_PRINT_INDIRECT) |
8736 | 845 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", *(char **) opt->p); |
17470
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
846 else if(opt->type == CONF_TYPE_PRINT_FUNC) |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
847 return ((m_opt_func_full_t) opt->p)(opt,name,param); |
8736 | 848 else |
849 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", (char *) opt->p); | |
850 | |
8164 | 851 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
|
852 return M_OPT_EXIT; |
8164 | 853 return 1; |
854 } | |
855 | |
856 m_option_type_t m_option_type_print = { | |
857 "Print", | |
858 "", | |
859 0, | |
860 0, | |
861 parse_print, | |
862 NULL, | |
863 NULL, | |
864 NULL, | |
865 NULL, | |
866 NULL | |
867 }; | |
868 | |
8736 | 869 m_option_type_t m_option_type_print_indirect = { |
870 "Print", | |
871 "", | |
872 0, | |
17468
41d8991c3632
Fix misuse of the M_OPT_TYPE_INDIRECT flag, it has nothing to do
albeu
parents:
16854
diff
changeset
|
873 0, |
8736 | 874 parse_print, |
875 NULL, | |
876 NULL, | |
877 NULL, | |
878 NULL, | |
879 NULL | |
880 }; | |
881 | |
17470
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
882 m_option_type_t m_option_type_print_func = { |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
883 "Print", |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
884 "", |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
885 0, |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
886 M_OPT_TYPE_ALLOW_WILDCARD, |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
887 parse_print, |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
888 NULL, |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
889 NULL, |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
890 NULL, |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
891 NULL, |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
892 NULL |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
893 }; |
21123e349463
New option type to print help text with a function.
albeu
parents:
17468
diff
changeset
|
894 |
8736 | 895 |
8164 | 896 /////////////////////// Subconfig |
897 #undef VAL | |
898 #define VAL(x) (*(char***)(x)) | |
899 | |
900 static int parse_subconf(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
901 char *subparam; | |
902 char *subopt; | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
903 int nr = 0,i,r; |
8164 | 904 m_option_t *subopts; |
905 char *p; | |
906 char** lst = NULL; | |
907 | |
908 if (param == NULL || strlen(param) == 0) | |
909 return M_OPT_MISSING_PARAM; | |
910 | |
911 subparam = malloc(strlen(param)+1); | |
912 subopt = malloc(strlen(param)+1); | |
16741
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
913 p = param; |
8164 | 914 |
915 subopts = opt->p; | |
916 | |
16741
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
917 while(p[0]) |
8164 | 918 { |
16741
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
919 int sscanf_ret = 1; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
920 int optlen = strcspn(p, ":="); |
8164 | 921 /* clear out */ |
922 subopt[0] = subparam[0] = 0; | |
16854
3898e1089a29
fix incorrect use of strl* functions (patch by reimar)
rfelker
parents:
16750
diff
changeset
|
923 strlcpy(subopt, p, optlen + 1); |
16741
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
924 p = &p[optlen]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
925 if (p[0] == '=') { |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
926 sscanf_ret = 2; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
927 p = &p[1]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
928 if (p[0] == '"') { |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
929 p = &p[1]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
930 optlen = strcspn(p, "\""); |
16854
3898e1089a29
fix incorrect use of strl* functions (patch by reimar)
rfelker
parents:
16750
diff
changeset
|
931 strlcpy(subparam, p, optlen + 1); |
16741
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
932 p = &p[optlen]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
933 if (p[0] != '"') { |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
934 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Terminating '\"' missing for '%s'\n", subopt); |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
935 return M_OPT_INVALID; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
936 } |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
937 p = &p[1]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
938 } else if (p[0] == '%') { |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
939 p = &p[1]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
940 optlen = (int)strtol(p, &p, 0); |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
941 if (!p || p[0] != '%' || (optlen > strlen(p) - 1)) { |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
942 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid length %i for '%s'\n", optlen, subopt); |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
943 return M_OPT_INVALID; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
944 } |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
945 p = &p[1]; |
16854
3898e1089a29
fix incorrect use of strl* functions (patch by reimar)
rfelker
parents:
16750
diff
changeset
|
946 strlcpy(subparam, p, optlen + 1); |
16741
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
947 p = &p[optlen]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
948 } else { |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
949 optlen = strcspn(p, ":"); |
16854
3898e1089a29
fix incorrect use of strl* functions (patch by reimar)
rfelker
parents:
16750
diff
changeset
|
950 strlcpy(subparam, p, optlen + 1); |
16741
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
951 p = &p[optlen]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
952 } |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
953 } |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
954 if (p[0] == ':') |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
955 p = &p[1]; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
956 else if (p[0]) { |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
957 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Incorrect termination for '%s'\n", subopt); |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
958 return M_OPT_INVALID; |
ec4a53c1c40b
Add support for suboption escaping via both "" and %n%str syntax
reimar
parents:
16425
diff
changeset
|
959 } |
8164 | 960 |
961 switch(sscanf_ret) | |
962 { | |
963 case 1: | |
964 subparam[0] = 0; | |
965 case 2: | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
966 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
|
967 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
|
968 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
969 if(!subopts[i].name) { |
10397 | 970 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
|
971 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
|
972 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
973 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
|
974 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
|
975 if(r < 0) return r; |
8164 | 976 if(dst) { |
977 lst = (char**)realloc(lst,2 * (nr+2) * sizeof(char*)); | |
978 lst[2*nr] = strdup(subopt); | |
979 lst[2*nr+1] = subparam[0] == 0 ? NULL : strdup(subparam); | |
980 memset(&lst[2*(nr+1)],0,2*sizeof(char*)); | |
981 nr++; | |
982 } | |
983 break; | |
984 } | |
985 } | |
986 | |
987 free(subparam); | |
988 free(subopt); | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
989 if(dst) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
990 VAL(dst) = lst; |
8164 | 991 |
992 return 1; | |
993 } | |
994 | |
995 m_option_type_t m_option_type_subconfig = { | |
996 "Subconfig", | |
997 "The syntax is -option opt1=foo:flag:opt2=blah", | |
998 sizeof(int), | |
999 M_OPT_TYPE_HAS_CHILD, | |
1000 parse_subconf, | |
1001 NULL, | |
1002 NULL, | |
1003 NULL, | |
1004 NULL, | |
1005 NULL | |
1006 }; | |
1007 | |
1008 #include "libmpcodecs/img_format.h" | |
9600 | 1009 |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1010 /* FIXME: snyc with img_format.h */ |
9600 | 1011 static struct { |
19194
5949a654e2d4
marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents:
19053
diff
changeset
|
1012 const char* name; |
9600 | 1013 unsigned int fmt; |
1014 } mp_imgfmt_list[] = { | |
1015 {"444p", IMGFMT_444P}, | |
1016 {"422p", IMGFMT_422P}, | |
1017 {"411p", IMGFMT_411P}, | |
1018 {"yuy2", IMGFMT_YUY2}, | |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1019 {"uyvy", IMGFMT_UYVY}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1020 {"yvu9", IMGFMT_YVU9}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1021 {"if09", IMGFMT_IF09}, |
9600 | 1022 {"yv12", IMGFMT_YV12}, |
1023 {"i420", IMGFMT_I420}, | |
1024 {"iyuv", IMGFMT_IYUV}, | |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1025 {"clpl", IMGFMT_CLPL}, |
11688 | 1026 {"hm12", IMGFMT_HM12}, |
10746
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1027 {"y800", IMGFMT_Y800}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1028 {"y8", IMGFMT_Y8}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1029 {"nv12", IMGFMT_NV12}, |
0e5e55232e9d
added nv12/nv21 and some other fourccs (still not synced)
alex
parents:
10660
diff
changeset
|
1030 {"nv21", IMGFMT_NV21}, |
9600 | 1031 {"bgr24", IMGFMT_BGR24}, |
1032 {"bgr32", IMGFMT_BGR32}, | |
1033 {"bgr16", IMGFMT_BGR16}, | |
1034 {"bgr15", IMGFMT_BGR15}, | |
1035 {"bgr8", IMGFMT_BGR8}, | |
1036 {"bgr4", IMGFMT_BGR4}, | |
1037 {"bg4b", IMGFMT_BG4B}, | |
1038 {"bgr1", IMGFMT_BGR1}, | |
1039 {"rgb24", IMGFMT_RGB24}, | |
1040 {"rgb32", IMGFMT_RGB32}, | |
1041 {"rgb16", IMGFMT_RGB16}, | |
1042 {"rgb15", IMGFMT_RGB15}, | |
1043 {"rgb8", IMGFMT_RGB8}, | |
1044 {"rgb4", IMGFMT_RGB4}, | |
1045 {"rg4b", IMGFMT_RG4B}, | |
1046 {"rgb1", IMGFMT_RGB1}, | |
12999 | 1047 {"rgba", IMGFMT_RGBA}, |
1048 {"argb", IMGFMT_ARGB}, | |
1049 {"bgra", IMGFMT_BGRA}, | |
1050 {"abgr", IMGFMT_ABGR}, | |
23423 | 1051 {"mjpeg", IMGFMT_MJPEG}, |
1052 {"mjpg", IMGFMT_MJPEG}, | |
9600 | 1053 { NULL, 0 } |
1054 }; | |
8164 | 1055 |
1056 static int parse_imgfmt(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
1057 uint32_t fmt = 0; | |
9600 | 1058 int i; |
8164 | 1059 |
1060 if (param == NULL || strlen(param) == 0) | |
1061 return M_OPT_MISSING_PARAM; | |
1062 | |
9600 | 1063 if(!strcmp(param,"help")) { |
10641 | 1064 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "Available formats:"); |
9600 | 1065 for(i = 0 ; mp_imgfmt_list[i].name ; i++) |
1066 mp_msg(MSGT_CFGPARSER, MSGL_INFO, " %s",mp_imgfmt_list[i].name); | |
1067 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\n"); | |
16345
feb16d0117c8
allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents:
15789
diff
changeset
|
1068 return M_OPT_EXIT - 1; |
9600 | 1069 } |
10597
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
1070 |
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
1071 if (sscanf(param, "0x%x", &fmt) != 1) |
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
1072 { |
9600 | 1073 for(i = 0 ; mp_imgfmt_list[i].name ; i++) { |
1074 if(!strcasecmp(param,mp_imgfmt_list[i].name)) { | |
1075 fmt=mp_imgfmt_list[i].fmt; | |
1076 break; | |
1077 } | |
1078 } | |
1079 if(!mp_imgfmt_list[i].name) { | |
1080 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: unknown format name: '%s'\n",name,param); | |
8164 | 1081 return M_OPT_INVALID; |
1082 } | |
10597
697688503349
CONF_TYPE_IMGFMT now supports 0xffffffff (hexa)-style fourccs too
alex
parents:
10595
diff
changeset
|
1083 } |
8164 | 1084 |
1085 if(dst) | |
1086 *((uint32_t*)dst) = fmt; | |
1087 | |
1088 return 1; | |
1089 } | |
1090 | |
1091 m_option_type_t m_option_type_imgfmt = { | |
9600 | 1092 "Image format", |
10641 | 1093 "Please report any missing colorspaces.", |
8164 | 1094 sizeof(uint32_t), |
1095 0, | |
1096 parse_imgfmt, | |
1097 NULL, | |
1098 copy_opt, | |
1099 copy_opt, | |
1100 NULL, | |
1101 NULL | |
1102 }; | |
1103 | |
14246 | 1104 #include "libaf/af_format.h" |
1105 | |
1106 /* FIXME: snyc with af_format.h */ | |
1107 static struct { | |
19194
5949a654e2d4
marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents:
19053
diff
changeset
|
1108 const char* name; |
14246 | 1109 unsigned int fmt; |
1110 } mp_afmt_list[] = { | |
1111 // SPECIAL | |
1112 {"mulaw", AF_FORMAT_MU_LAW}, | |
1113 {"alaw", AF_FORMAT_A_LAW}, | |
1114 {"mpeg2", AF_FORMAT_MPEG2}, | |
1115 {"ac3", AF_FORMAT_AC3}, | |
1116 {"imaadpcm", AF_FORMAT_IMA_ADPCM}, | |
1117 // ORIDNARY | |
1118 {"u8", AF_FORMAT_U8}, | |
1119 {"s8", AF_FORMAT_S8}, | |
1120 {"u16le", AF_FORMAT_U16_LE}, | |
1121 {"u16be", AF_FORMAT_U16_BE}, | |
1122 {"u16ne", AF_FORMAT_U16_NE}, | |
1123 {"s16le", AF_FORMAT_S16_LE}, | |
1124 {"s16be", AF_FORMAT_S16_BE}, | |
1125 {"s16ne", AF_FORMAT_S16_NE}, | |
1126 {"u24le", AF_FORMAT_U24_LE}, | |
1127 {"u24be", AF_FORMAT_U24_BE}, | |
1128 {"u24ne", AF_FORMAT_U24_NE}, | |
1129 {"s24le", AF_FORMAT_S24_LE}, | |
1130 {"s24be", AF_FORMAT_S24_BE}, | |
1131 {"s24ne", AF_FORMAT_S24_NE}, | |
1132 {"u32le", AF_FORMAT_U32_LE}, | |
1133 {"u32be", AF_FORMAT_U32_BE}, | |
1134 {"u32ne", AF_FORMAT_U32_NE}, | |
1135 {"s32le", AF_FORMAT_S32_LE}, | |
1136 {"s32be", AF_FORMAT_S32_BE}, | |
1137 {"s32ne", AF_FORMAT_S32_NE}, | |
1138 {"floatle", AF_FORMAT_FLOAT_LE}, | |
1139 {"floatbe", AF_FORMAT_FLOAT_BE}, | |
1140 {"floatne", AF_FORMAT_FLOAT_NE}, | |
1141 { NULL, 0 } | |
1142 }; | |
1143 | |
1144 static int parse_afmt(m_option_t* opt,char *name, char *param, void* dst, int src) { | |
1145 uint32_t fmt = 0; | |
1146 int i; | |
1147 | |
1148 if (param == NULL || strlen(param) == 0) | |
1149 return M_OPT_MISSING_PARAM; | |
1150 | |
1151 if(!strcmp(param,"help")) { | |
1152 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "Available formats:"); | |
1153 for(i = 0 ; mp_afmt_list[i].name ; i++) | |
1154 mp_msg(MSGT_CFGPARSER, MSGL_INFO, " %s",mp_afmt_list[i].name); | |
1155 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\n"); | |
16345
feb16d0117c8
allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents:
15789
diff
changeset
|
1156 return M_OPT_EXIT - 1; |
14246 | 1157 } |
1158 | |
1159 if (sscanf(param, "0x%x", &fmt) != 1) | |
1160 { | |
1161 for(i = 0 ; mp_afmt_list[i].name ; i++) { | |
1162 if(!strcasecmp(param,mp_afmt_list[i].name)) { | |
1163 fmt=mp_afmt_list[i].fmt; | |
1164 break; | |
1165 } | |
1166 } | |
1167 if(!mp_afmt_list[i].name) { | |
1168 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: unknown format name: '%s'\n",name,param); | |
1169 return M_OPT_INVALID; | |
1170 } | |
1171 } | |
1172 | |
1173 if(dst) | |
1174 *((uint32_t*)dst) = fmt; | |
1175 | |
1176 return 1; | |
1177 } | |
1178 | |
1179 m_option_type_t m_option_type_afmt = { | |
1180 "Audio format", | |
1181 "Please report any missing formats.", | |
1182 sizeof(uint32_t), | |
1183 0, | |
1184 parse_afmt, | |
1185 NULL, | |
1186 copy_opt, | |
1187 copy_opt, | |
1188 NULL, | |
1189 NULL | |
1190 }; | |
1191 | |
1192 | |
22312 | 1193 static double parse_timestring(char *str) |
1194 { | |
1195 int a, b; | |
1196 double d; | |
1197 if (sscanf(str, "%d:%d:%lf", &a, &b, &d) == 3) | |
1198 return 3600*a + 60*b + d; | |
1199 else if (sscanf(str, "%d:%lf", &a, &d) == 2) | |
1200 return 60*a + d; | |
1201 else if (sscanf(str, "%lf", &d) == 1) | |
1202 return d; | |
1203 return -1e100; | |
1204 } | |
1205 | |
1206 | |
1207 static int parse_time(m_option_t* opt,char *name, char *param, void* dst, int src) | |
1208 { | |
22356 | 1209 double time; |
1210 | |
22312 | 1211 if (param == NULL || strlen(param) == 0) |
1212 return M_OPT_MISSING_PARAM; | |
1213 | |
22356 | 1214 time = parse_timestring(param); |
22312 | 1215 if (time == -1e100) { |
1216 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid time: '%s'\n", | |
1217 name,param); | |
1218 return M_OPT_INVALID; | |
1219 } | |
1220 | |
1221 if (dst) | |
1222 *(double *)dst = time; | |
1223 return 1; | |
1224 } | |
1225 | |
1226 m_option_type_t m_option_type_time = { | |
1227 "Time", | |
1228 "", | |
1229 sizeof(double), | |
1230 0, | |
1231 parse_time, | |
23415 | 1232 print_double, |
22312 | 1233 copy_opt, |
1234 copy_opt, | |
1235 NULL, | |
1236 NULL | |
1237 }; | |
1238 | |
1239 | |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1240 // Time or size (-endpos) |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1241 |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1242 static int parse_time_size(m_option_t* opt,char *name, char *param, void* dst, int src) { |
20003
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1243 m_time_size_t ts; |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1244 char unit[4]; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1245 double end_at; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1246 |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1247 if (param == NULL || strlen(param) == 0) |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1248 return M_OPT_MISSING_PARAM; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1249 |
20003
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1250 ts.pos=0; |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1251 /* End at size parsing */ |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1252 if(sscanf(param, "%lf%3s", &end_at, unit) == 2) { |
20003
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1253 ts.type = END_AT_SIZE; |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1254 if(!strcasecmp(unit, "b")) |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1255 ; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1256 else if(!strcasecmp(unit, "kb")) |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1257 end_at *= 1024; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1258 else if(!strcasecmp(unit, "mb")) |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1259 end_at *= 1024*1024; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1260 else if(!strcasecmp(unit, "gb")) |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1261 end_at *= 1024*1024*1024; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1262 else |
20003
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1263 ts.type = END_AT_NONE; |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1264 |
20003
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1265 if (ts.type == END_AT_SIZE) { |
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1266 ts.pos = end_at; |
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1267 goto out; |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1268 } |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1269 } |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1270 |
22312 | 1271 /* End at time parsing. This has to be last because the parsing accepts |
1272 * even a number followed by garbage */ | |
1273 if ((end_at = parse_timestring(param)) == -1e100) { | |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1274 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid time or size: '%s'\n", |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1275 name,param); |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1276 return M_OPT_INVALID; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1277 } |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1278 |
20003
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1279 ts.type = END_AT_TIME; |
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1280 ts.pos = end_at; |
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1281 out: |
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1282 if(dst) |
9f256c4066ff
Fix broken parse_time_size, it would cause MPlayer to parse its parameter twice,
reimar
parents:
19973
diff
changeset
|
1283 *(m_time_size_t *)dst = ts; |
19973
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1284 return 1; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1285 } |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1286 |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1287 m_option_type_t m_option_type_time_size = { |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1288 "Time or size", |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1289 "", |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1290 sizeof(m_time_size_t), |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1291 0, |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1292 parse_time_size, |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1293 NULL, |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1294 copy_opt, |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1295 copy_opt, |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1296 NULL, |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1297 NULL |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1298 }; |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1299 |
02a18c52a42a
after a long time, finally i could add -endpos option to mplayer executable.
ptt
parents:
19358
diff
changeset
|
1300 |
10641 | 1301 //// 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
|
1302 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1303 #include "m_struct.h" |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1304 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1305 #undef VAL |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1306 #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
|
1307 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1308 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
|
1309 int i; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1310 char* n; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1311 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1312 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
|
1313 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
|
1314 if(!strcmp(n,name)) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1315 *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
|
1316 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1317 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1318 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1319 return 0; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1320 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1321 |
19053
75327b24e06f
marks several string parameters as const, as they are not modified inside the function, Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18958
diff
changeset
|
1322 static int get_obj_param(const char* opt_name,const char* obj_name, m_struct_t* desc, |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1323 char* str,int* nold,int oldmax,char** dst) { |
18958
a8e681ad7c90
Remove unused variables, patch by Stefan Huehner stefan at huehner org.
diego
parents:
18879
diff
changeset
|
1324 char* eq; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1325 m_option_t* opt; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1326 int r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1327 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1328 eq = strchr(str,'='); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1329 if(eq && eq == str) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1330 eq = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1331 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1332 if(eq) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1333 char* p = eq + 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1334 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
|
1335 eq[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1336 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
|
1337 if(!opt) { |
10641 | 1338 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
|
1339 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
|
1340 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1341 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
|
1342 if(r < 0) { |
17874 | 1343 if(r > M_OPT_EXIT) |
1344 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
|
1345 eq[0] = '='; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1346 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1347 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1348 if(dst) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1349 dst[0] = strdup(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1350 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
|
1351 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1352 eq[0] = '='; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1353 } else { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1354 if((*nold) >= oldmax) { |
10641 | 1355 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 | 1356 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
|
1357 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
|
1358 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1359 opt = &desc->fields[(*nold)]; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1360 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
|
1361 if(r < 0) { |
17874 | 1362 if(r > M_OPT_EXIT) |
1363 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
|
1364 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1365 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1366 if(dst) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1367 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
|
1368 dst[1] = strdup(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1369 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1370 (*nold)++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1371 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1372 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1373 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1374 |
19053
75327b24e06f
marks several string parameters as const, as they are not modified inside the function, Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18958
diff
changeset
|
1375 static int get_obj_params(const char* opt_name, const 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
|
1376 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
|
1377 int n = 0,nold = 0, nopts,r; |
18958
a8e681ad7c90
Remove unused variables, patch by Stefan Huehner stefan at huehner org.
diego
parents:
18879
diff
changeset
|
1378 char* ptr,*last_ptr = params; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1379 char** ret; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1380 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1381 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
|
1382 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
|
1383 if(!desc->fields) { |
10641 | 1384 printf("%s doesn't have any options.\n\n",name); |
16345
feb16d0117c8
allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents:
15789
diff
changeset
|
1385 return M_OPT_EXIT - 1; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1386 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1387 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
|
1388 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
|
1389 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
|
1390 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
|
1391 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
|
1392 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
|
1393 else |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1394 strcpy(min,"No"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1395 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
|
1396 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
|
1397 else |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1398 strcpy(max,"No"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1399 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
|
1400 opt->name, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1401 opt->type->name, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1402 min, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1403 max); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1404 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1405 printf("\n"); |
16345
feb16d0117c8
allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents:
15789
diff
changeset
|
1406 return M_OPT_EXIT - 1; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1407 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1408 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1409 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
|
1410 /* NOP */; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1411 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1412 // 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
|
1413 r = 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1414 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
|
1415 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
|
1416 if(!ptr) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1417 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
|
1418 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1419 break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1420 } |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1421 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
|
1422 nold++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1423 last_ptr = ptr+1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1424 continue; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1425 } |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1426 ptr[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1427 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
|
1428 ptr[0] = separator; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1429 if(r < 0) break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1430 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1431 last_ptr = ptr+1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1432 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1433 if(r < 0) return r; |
15743 | 1434 if (!last_ptr[0]) // count an empty field at the end, too |
1435 nold++; | |
1436 if (nold > nopts) { | |
1437 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Too many options for %s\n", name); | |
1438 return M_OPT_OUT_OF_RANGE; | |
1439 } | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1440 if(!_ret) // Just test |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1441 return 1; |
15743 | 1442 if (n == 0) // No options or only empty options |
1443 return 1; | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1444 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1445 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
|
1446 n = nold = 0; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1447 last_ptr = params; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1448 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1449 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
|
1450 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
|
1451 if(!ptr) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1452 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
|
1453 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1454 break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1455 } |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1456 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
|
1457 last_ptr = ptr+1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1458 nold++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1459 continue; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1460 } |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1461 ptr[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1462 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
|
1463 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1464 last_ptr = ptr+1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1465 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1466 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
|
1467 *_ret = ret; |
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 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1470 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1471 |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1472 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
|
1473 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
|
1474 char** opts; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1475 int r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1476 m_obj_params_t* p = opt->priv; |
20098 | 1477 m_struct_t* desc; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1478 char* cpy = strdup(param); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1479 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1480 // 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
|
1481 if(!p) |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1482 return M_OPT_INVALID; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1483 |
20098 | 1484 desc = p->desc; |
20101
4ccb2a53b859
Avoid memleak when calling parse_obj_params only for syntax-checking (dst == NULL)
reimar
parents:
20098
diff
changeset
|
1485 r = get_obj_params(name,desc->name,cpy,desc,p->separator,dst ? &opts : NULL); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1486 free(cpy); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1487 if(r < 0) |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1488 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1489 if(!dst) |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1490 return 1; |
15743 | 1491 if (!opts) // no arguments given |
1492 return 1; | |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1493 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1494 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
|
1495 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
|
1496 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1497 return 1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1498 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1499 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1500 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1501 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
|
1502 "Object params", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1503 "", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1504 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1505 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1506 parse_obj_params, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1507 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1508 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1509 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1510 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1511 NULL |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1512 }; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1513 |
10641 | 1514 /// 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
|
1515 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1516 /// Span arguments |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1517 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
|
1518 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
|
1519 {"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
|
1520 {"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
|
1521 { 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
|
1522 }; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1523 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
|
1524 "m_span", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1525 sizeof(m_span_t), |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1526 &m_span_params_dflts, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1527 m_span_params_fields |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1528 }; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1529 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
|
1530 &m_span_opts, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1531 '-' |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1532 }; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1533 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1534 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
|
1535 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
|
1536 int r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1537 char *param,**plist = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1538 m_struct_t* desc; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1539 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
|
1540 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1541 |
10641 | 1542 // 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
|
1543 param = strchr(str,'='); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1544 if(param) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1545 param[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1546 param++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1547 if(strlen(param) <= 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1548 param = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1549 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1550 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1551 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1552 if(!find_obj_desc(str,list,&desc)) { |
10641 | 1553 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
|
1554 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1555 } |
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 if(param) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1558 if(!desc && _ret) { |
17874 | 1559 if(!strcmp(param,"help")) { |
1560 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "Option %s: %s have no option description.\n",opt,str); | |
1561 return M_OPT_EXIT - 1; | |
1562 } | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1563 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
|
1564 plist[0] = strdup("_oldargs_"); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1565 plist[1] = strdup(param); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1566 } else if(desc) { |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1567 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
|
1568 if(r < 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1569 return r; |
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(!_ret) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1573 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1574 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1575 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
|
1576 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
|
1577 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
|
1578 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
|
1579 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1580 *_ret = ret; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1581 return 1; |
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 |
9913 | 1584 static void free_obj_settings_list(void* dst); |
1585 | |
1586 static int obj_settings_list_del(char *opt_name,char *param,void* dst, int src) { | |
1587 char** str_list = NULL; | |
1588 int r,i,idx_max = 0; | |
1589 char* rem_id = "_removed_marker_"; | |
1590 m_option_t list_opt = {opt_name , NULL, CONF_TYPE_STRING_LIST, | |
1591 0, 0, 0, NULL }; | |
1592 m_obj_settings_t* obj_list = dst ? VAL(dst) : NULL; | |
1593 | |
1594 if(dst && !obj_list) { | |
1595 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: the list is empty.\n",opt_name); | |
1596 return 1; | |
1597 } else if(obj_list) { | |
1598 for(idx_max = 0 ; obj_list[idx_max].name != NULL ; idx_max++) | |
1599 /* NOP */; | |
1600 } | |
1601 | |
1602 r = m_option_parse(&list_opt,opt_name,param,&str_list,src); | |
1603 if(r < 0 || !str_list) | |
1604 return r; | |
1605 | |
1606 for(r = 0 ; str_list[r] ; r++) { | |
1607 int id; | |
1608 char* endptr; | |
1609 id = strtol(str_list[r],&endptr,0); | |
1610 if(endptr == str_list[r]) { | |
10660 | 1611 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 | 1612 m_option_free(&list_opt,&str_list); |
1613 return M_OPT_INVALID; | |
1614 } | |
1615 if(!obj_list) continue; | |
1616 if(id >= idx_max || id < -idx_max) { | |
10641 | 1617 mp_msg(MSGT_CFGPARSER, MSGL_WARN, "Option %s: Index %d is out of range.\n",opt_name,id); |
9913 | 1618 continue; |
1619 } | |
1620 if(id < 0) | |
1621 id = idx_max + id; | |
1622 free(obj_list[id].name); | |
1623 free_str_list(&(obj_list[id].attribs)); | |
1624 obj_list[id].name = rem_id; | |
1625 } | |
1626 | |
1627 if(!dst) { | |
1628 m_option_free(&list_opt,&str_list); | |
1629 return 1; | |
1630 } | |
1631 | |
1632 for(i = 0 ; obj_list[i].name ; i++) { | |
1633 while(obj_list[i].name == rem_id) { | |
1634 memmove(&obj_list[i],&obj_list[i+1],sizeof(m_obj_settings_t)*(idx_max - i)); | |
1635 idx_max--; | |
1636 } | |
1637 } | |
1638 obj_list = realloc(obj_list,sizeof(m_obj_settings_t)*(idx_max+1)); | |
1639 VAL(dst) = obj_list; | |
1640 | |
1641 return 1; | |
1642 } | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1643 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1644 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
|
1645 char *param, void* dst, int src) { |
9913 | 1646 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
|
1647 char *str; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1648 char *ptr, *last_ptr; |
9913 | 1649 m_obj_settings_t *res = NULL,*queue = NULL,*head = NULL; |
1650 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
|
1651 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1652 // 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
|
1653 if(!opt->priv) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1654 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1655 |
9913 | 1656 if(opt->name[len-1] == '*' && ((int)strlen(name) > len - 1)) { |
1657 char* n = &name[len-1]; | |
1658 if(strcasecmp(n,"-add") == 0) | |
1659 op = OP_ADD; | |
1660 else if(strcasecmp(n,"-pre") == 0) | |
1661 op = OP_PRE; | |
1662 else if(strcasecmp(n,"-del") == 0) | |
1663 op = OP_DEL; | |
1664 else if(strcasecmp(n,"-clr") == 0) | |
1665 op = OP_CLR; | |
1666 else { | |
1667 char prefix[len]; | |
1668 strncpy(prefix,opt->name,len-1); | |
1669 prefix[len-1] = '\0'; | |
10608 | 1670 mp_msg(MSGT_VFILTER,MSGL_ERR, "Option %s: unknown postfix %s\n" |
1671 "Supported postfixes are:\n" | |
12653 | 1672 " %s-add\n" |
9913 | 1673 " Append the given list to the current list\n\n" |
12653 | 1674 " %s-pre\n" |
9913 | 1675 " Prepend the given list to the current list\n\n" |
12653 | 1676 " %s-del x,y,...\n" |
9913 | 1677 " Remove the given elements. Take the list element index (starting from 0).\n" |
10641 | 1678 " Negative index can be used (i.e. -1 is the last element)\n\n" |
12653 | 1679 " %s-clr\n" |
1680 " Clear the current list.\n",name,n,prefix,prefix,prefix,prefix); | |
9913 | 1681 |
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
|
1682 return M_OPT_UNKNOWN; |
9913 | 1683 } |
1684 } | |
1685 | |
1686 // Clear the list ?? | |
1687 if(op == OP_CLR) { | |
1688 if(dst) | |
1689 free_obj_settings_list(dst); | |
1690 return 0; | |
1691 } | |
1692 | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1693 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
|
1694 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
|
1695 |
9913 | 1696 switch(op) { |
1697 case OP_ADD: | |
1698 if(dst) head = VAL(dst); | |
1699 break; | |
1700 case OP_PRE: | |
1701 if(dst) queue = VAL(dst); | |
1702 break; | |
1703 case OP_DEL: | |
1704 return obj_settings_list_del(name,param,dst,src); | |
1705 case OP_NONE: | |
1706 if(dst && VAL(dst)) | |
1707 free_obj_settings_list(dst); | |
1708 break; | |
1709 default: | |
1710 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
|
1711 return M_OPT_UNKNOWN; |
9913 | 1712 } |
1713 | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1714 if(!strcmp(param,"help")) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1715 m_obj_list_t* ol = opt->priv; |
14085 | 1716 mp_msg(MSGT_VFILTER,MSGL_INFO,"Available video filters:\n"); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
17874
diff
changeset
|
1717 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_FILTERS\n"); |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1718 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
|
1719 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
|
1720 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
|
1721 M_ST_MB(char*,ol->list[n],ol->info_off)); |
17727
096cb1dfb591
Make -xy help output consistent, output an empty line before and after.
diego
parents:
17667
diff
changeset
|
1722 mp_msg(MSGT_VFILTER,MSGL_INFO,"\n"); |
16345
feb16d0117c8
allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents:
15789
diff
changeset
|
1723 return M_OPT_EXIT - 1; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1724 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1725 ptr = str = strdup(param); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1726 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1727 while(ptr[0] != '\0') { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1728 last_ptr = ptr; |
22133 | 1729 ptr = get_nextsep(ptr, LIST_SEPARATOR, 1); |
20314 | 1730 |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1731 if(!ptr) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1732 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
|
1733 if(r < 0) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1734 free(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1735 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1736 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1737 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1738 break; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1739 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1740 ptr[0] = '\0'; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1741 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
|
1742 if(r < 0) { |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1743 free(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1744 return r; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1745 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1746 ptr++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1747 n++; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1748 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1749 free(str); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1750 if(n == 0) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1751 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1752 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1753 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
|
1754 ((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
|
1755 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
|
1756 |
9913 | 1757 if(dst) { |
1758 if(queue) { | |
1759 int qsize; | |
1760 for(qsize = 0 ; queue[qsize].name ; qsize++) | |
1761 /* NOP */; | |
1762 res = realloc(res,(qsize+n+1)*sizeof(m_obj_settings_t)); | |
1763 memcpy(&res[n],queue,(qsize+1)*sizeof(m_obj_settings_t)); | |
1764 n += qsize; | |
1765 free(queue); | |
1766 } | |
1767 if(head) { | |
1768 int hsize; | |
1769 for(hsize = 0 ; head[hsize].name ; hsize++) | |
1770 /* NOP */; | |
1771 head = realloc(head,(hsize+n+1)*sizeof(m_obj_settings_t)); | |
1772 memcpy(&head[hsize],res,(n+1)*sizeof(m_obj_settings_t)); | |
1773 free(res); | |
1774 res = head; | |
1775 } | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1776 VAL(dst) = res; |
9913 | 1777 } |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1778 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1779 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1780 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1781 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
|
1782 int n; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1783 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
|
1784 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1785 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
|
1786 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1787 d = VAL(dst); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1788 #ifndef NO_FREE |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1789 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
|
1790 free(d[n].name); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1791 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
|
1792 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1793 free(d); |
8164 | 1794 #endif |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1795 VAL(dst) = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1796 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1797 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1798 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
|
1799 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
|
1800 int n; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1801 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1802 if(!(dst && src)) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1803 return; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1804 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1805 s = VAL(src); |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1806 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1807 if(VAL(dst)) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1808 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
|
1809 if(!s) return; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1810 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1811 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1812 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1813 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
|
1814 /* NOP */; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1815 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
|
1816 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
|
1817 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
|
1818 d[n].attribs = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1819 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
|
1820 } |
10236 | 1821 d[n].name = NULL; |
1822 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
|
1823 VAL(dst) = d; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1824 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1825 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1826 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
|
1827 "Object settings list", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1828 "", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1829 sizeof(m_obj_settings_t*), |
9913 | 1830 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
|
1831 parse_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1832 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1833 copy_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1834 copy_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1835 copy_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1836 free_obj_settings_list, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1837 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1838 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1839 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1840 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1841 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
|
1842 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
|
1843 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
|
1844 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
|
1845 int s,i; |
20097 | 1846 unsigned char* pre; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1847 char* pre_name = NULL; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1848 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1849 if(!obj_p) { |
10641 | 1850 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
|
1851 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
|
1852 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1853 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1854 if(!param) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1855 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
|
1856 |
20097 | 1857 pre = obj_p->presets; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1858 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
|
1859 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
|
1860 s = in_desc->size; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1861 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1862 if(!strcmp(param,"help")) { |
10641 | 1863 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
|
1864 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
|
1865 pre += s) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1866 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
|
1867 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "\n"); |
16345
feb16d0117c8
allow multiple help clauses on the command line, Patch by kiriuja " mplayer-patches AH en-directo POUM net "
gpoirier
parents:
15789
diff
changeset
|
1868 return M_OPT_EXIT - 1; |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1869 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1870 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1871 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
|
1872 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
|
1873 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
|
1874 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1875 if(!pre_name) { |
10641 | 1876 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: There is no preset named %s\n" |
1877 "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
|
1878 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
|
1879 pre += s) |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1880 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
|
1881 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
|
1882 return M_OPT_INVALID; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1883 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1884 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1885 if(!dst) return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1886 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1887 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
|
1888 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
|
1889 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
|
1890 if(!out_opt) { |
10641 | 1891 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
|
1892 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
|
1893 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1894 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
|
1895 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1896 return 1; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1897 } |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1898 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1899 |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1900 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
|
1901 "Object presets", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1902 "", |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1903 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1904 0, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1905 parse_obj_presets, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1906 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1907 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1908 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1909 NULL, |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1910 NULL |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1911 }; |
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9177
diff
changeset
|
1912 |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1913 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
|
1914 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
|
1915 int pos1, pos2, r, v6addr = 0; |
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
1916 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
|
1917 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
|
1918 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1919 if(!desc) { |
10641 | 1920 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
|
1921 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
|
1922 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1923 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1924 // extract the protocol |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1925 ptr1 = strstr(url, "://"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1926 if( ptr1==NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1927 // Filename only |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1928 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
|
1929 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
|
1930 return 1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1931 } |
10641 | 1932 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
|
1933 return M_OPT_INVALID; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1934 } |
15460
fa8c3f5b7ec2
introduced -string- parameter to match everything after :// syntax
nicodvb
parents:
14246
diff
changeset
|
1935 if(m_option_list_find(desc->fields,"string")) { |
fa8c3f5b7ec2
introduced -string- parameter to match everything after :// syntax
nicodvb
parents:
14246
diff
changeset
|
1936 if(strlen(ptr1)>3) { |
fa8c3f5b7ec2
introduced -string- parameter to match everything after :// syntax
nicodvb
parents:
14246
diff
changeset
|
1937 m_struct_set(desc,dst,"string",ptr1+3); |
fa8c3f5b7ec2
introduced -string- parameter to match everything after :// syntax
nicodvb
parents:
14246
diff
changeset
|
1938 return 1; |
fa8c3f5b7ec2
introduced -string- parameter to match everything after :// syntax
nicodvb
parents:
14246
diff
changeset
|
1939 } |
fa8c3f5b7ec2
introduced -string- parameter to match everything after :// syntax
nicodvb
parents:
14246
diff
changeset
|
1940 } |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1941 pos1 = ptr1-url; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1942 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
|
1943 ptr1[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1944 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
|
1945 ptr1[0] = ':'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1946 if(r < 0) { |
10641 | 1947 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
|
1948 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1949 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1950 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1951 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1952 // jump the "://" |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1953 ptr1 += 3; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1954 pos1 += 3; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1955 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1956 // 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
|
1957 ptr2 = strstr(ptr1, "@"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1958 ptr3 = strstr(ptr1, "/"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1959 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
|
1960 // 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
|
1961 ptr2 = NULL; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1962 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1963 if( ptr2!=NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1964 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1965 // 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
|
1966 if(!m_option_list_find(desc->fields,"username")) { |
10641 | 1967 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
|
1968 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1969 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1970 ptr3 = strstr(ptr1, ":"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1971 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
|
1972 // 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
|
1973 if(!m_option_list_find(desc->fields,"password")) { |
10641 | 1974 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
|
1975 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1976 } else { // Username and password |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1977 if(dst) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1978 ptr3[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1979 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
|
1980 ptr3[0] = ':'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1981 if(r < 0) { |
10641 | 1982 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
|
1983 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1984 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1985 ptr2[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1986 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
|
1987 ptr2[0] = '@'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1988 if(r < 0) { |
10641 | 1989 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
|
1990 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1991 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1992 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1993 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1994 } else { // User name only |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1995 ptr2[0] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1996 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
|
1997 ptr2[0] = '@'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
1998 if(r < 0) { |
10641 | 1999 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
|
2000 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2001 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2002 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2003 } |
10592
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2004 ptr1 = ptr2+1; |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2005 pos1 = ptr1-url; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2006 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2007 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2008 // before looking for a port number check if we have an IPv6 type numeric address |
10641 | 2009 // 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
|
2010 ptr2 = strstr(ptr1, "["); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2011 ptr3 = strstr(ptr1, "]"); |
11771
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
2012 // 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
|
2013 ptr4 = strstr(ptr1, "/"); |
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
2014 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
|
2015 // 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
|
2016 ptr1++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2017 pos1++; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2018 ptr2 = ptr3; |
11771
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
2019 v6addr = 1; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2020 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2021 ptr2 = ptr1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2022 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2023 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2024 // 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
|
2025 ptr2 = strstr(ptr2, ":"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2026 // 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
|
2027 ptr3 = strstr(ptr1, "/"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2028 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
|
2029 if( ptr2==NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2030 // No port is given |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2031 // 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
|
2032 if( ptr3==NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2033 // No path/filename |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2034 // 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
|
2035 pos2 = strlen(url); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2036 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2037 // 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
|
2038 pos2 = ptr3-url; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2039 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2040 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2041 // 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
|
2042 // Get the port number |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2043 if(!m_option_list_find(desc->fields,"port")) { |
10641 | 2044 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
|
2045 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2046 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2047 if(dst) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2048 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
|
2049 char tmp[100]; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2050 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
|
2051 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
|
2052 if(r < 0) { |
10641 | 2053 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
|
2054 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2055 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2056 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2057 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2058 pos2 = ptr2-url; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2059 } |
11771
827cae571c5c
Fix long standing bug where last (and sometimes first) char of the
albeu
parents:
11688
diff
changeset
|
2060 if( v6addr ) pos2--; |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2061 // Get the hostname |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2062 if(pos2-pos1 > 0) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2063 if(!m_option_list_find(desc->fields,"hostname")) { |
10641 | 2064 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
|
2065 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2066 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2067 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
|
2068 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
|
2069 tmp[pos2-pos1] = '\0'; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2070 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
|
2071 if(r < 0) { |
10641 | 2072 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
|
2073 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2074 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2075 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2076 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2077 // 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
|
2078 ptr2 = strstr(ptr1, "/"); |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2079 if( ptr2!=NULL ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2080 // 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
|
2081 // 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
|
2082 if( strlen(ptr2)>1 ) { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2083 // 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
|
2084 if(!m_option_list_find(desc->fields,"filename")) { |
10641 | 2085 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
|
2086 // skip |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2087 } else { |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2088 if(dst) { |
10592
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2089 int l = strlen(ptr2+1) + 1; |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2090 char* fname = ptr2+1; |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2091 if(l > 1) { |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2092 fname = malloc(l); |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2093 url_unescape_string(fname,ptr2+1); |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2094 } |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2095 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
|
2096 if(fname != ptr2+1) |
98c885b1ff06
Fix a 10l and add escaped filename support. Needed by ftp.
albeu
parents:
10397
diff
changeset
|
2097 free(fname); |
9791
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2098 if(r < 0) { |
10641 | 2099 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
|
2100 return r; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2101 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2102 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2103 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2104 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2105 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2106 return 1; |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2107 } |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2108 |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2109 /// 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
|
2110 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
|
2111 "Custom URL", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2112 "", |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2113 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2114 0, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2115 parse_custom_url, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2116 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2117 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2118 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2119 NULL, |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2120 NULL |
c5b63e88253d
Fix some 10L typo in header (m_struct_s instead of m_struct_st).
albeu
parents:
9600
diff
changeset
|
2121 }; |