annotate m_option.c @ 18066:2ee39341b7a6

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