annotate m_option.c @ 9593:e9a2af584986

Add the new -vf option wich is the same as vop in reverse order. Syntax is we decided, so you can give the nomes or not with both vop and vf. vf take precedence over vop.
author albeu
date Sat, 15 Mar 2003 18:01:02 +0000
parents 01a713dcaf23
children f55ea7b2fa50
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
2 #include "config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
3
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
4 #ifdef NEW_CONFIG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
5
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
6 #include <stdlib.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
7 #include <string.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
8 #include <math.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
9 #include <stdio.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
10 #include <stdarg.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
11 #include <inttypes.h>
8262
103a2758f9c5 FreeBSD fix
nexus
parents: 8168
diff changeset
12 #include <unistd.h>
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
13
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
14 #include "m_option.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
15 //#include "m_config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
16 #include "mp_msg.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
17
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
18 // 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
19 #ifndef MP_DEBUG
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
20 #define NO_FREE
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
21 #endif
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
22
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
23 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
24 int i;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
25
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
26 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
27 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
28 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
29 (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
30 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
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 } 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
33 return &list[i];
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
34 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
35 return NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
36 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
37
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
38 // Default function that just do a memcpy
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
39
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
40 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
41 if(dst && src)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
42 memcpy(dst,src,opt->type->size);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
43 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
44
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
45 // Helper for the print funcs (from man printf)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
46 static char* dup_printf(const char *fmt, ...) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
47 /* Guess we need no more than 50 bytes. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
48 int n, size = 50;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
49 char *p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
50 va_list ap;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
51 if ((p = malloc (size)) == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
52 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
53 while (1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
54 /* Try to print in the allocated space. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
55 va_start(ap, fmt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
56 n = vsnprintf (p, size, fmt, ap);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
57 va_end(ap);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
58 /* If that worked, return the string. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
59 if (n > -1 && n < size)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
60 return p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
61 /* Else try again with more space. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
62 if (n > -1) /* glibc 2.1 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
63 size = n+1; /* precisely what is needed */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
64 else /* glibc 2.0 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
65 size *= 2; /* twice the old size */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
66 if ((p = realloc (p, size)) == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
67 return NULL;
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
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 // Flag
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 #define VAL(x) (*(int*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
75
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
76 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
77 if (src == M_CONFIG_FILE) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
78 if (!strcasecmp(param, "yes") || /* any other language? */
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") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
85 !strcmp(param, "1")) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
86 if(dst) VAL(dst) = opt->max;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
87 } else if (!strcasecmp(param, "no") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
88 !strcasecmp(param, "nein") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
89 !strcasecmp(param, "nicht") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
90 !strcasecmp(param, "nem") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
91 !strcasecmp(param, "n") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
92 !strcmp(param, "0")) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
93 if(dst) VAL(dst) = opt->min;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
94 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
95 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "invalid parameter for %s flag: %s\n",name, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
96 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
97 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
98 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
99 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
100 if(dst) VAL(dst) = opt->max;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
101 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
102 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
103 }
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 static char* print_flag(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
106 if(VAL(val) == opt->min)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
107 return strdup("no");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
108 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
109 return strdup("yes");
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 m_option_type_t m_option_type_flag = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
113 "Flag",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
114 "need yes or no in config files",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
115 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
116 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
117 parse_flag,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
118 print_flag,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
119 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
120 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
121 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
122 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
123 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
124
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
125 // Integer
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
126
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
127 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
128 long tmp_int;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
129 char *endptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
130 src = 0;
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 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
133 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
134
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
135 tmp_int = strtol(param, &endptr, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
136 if (*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
137 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
138 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
139 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
140
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
141 if ((opt->flags & M_OPT_MIN) && (tmp_int < opt->min)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
142 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
143 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
144 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
145
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
146 if ((opt->flags & M_OPT_MAX) && (tmp_int > opt->max)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
147 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
148 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
149 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
150
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
151 if(dst) VAL(dst) = tmp_int;
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 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
154 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
155
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
156 static char* print_int(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
157 opt = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
158 return dup_printf("%d",VAL(val));
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
161 m_option_type_t m_option_type_int = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
162 "Integer",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
163 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
164 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
165 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
166 parse_int,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
167 print_int,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
168 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
169 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
170 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
171 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
172 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
173
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
174 // Float
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
175
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
176 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
177 #define VAL(x) (*(float*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
178
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
179 static int parse_float(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
180 float tmp_float;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
181 char* endptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
182 src = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
183
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
184 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
185 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
186
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
187 tmp_float = strtod(param, &endptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
188
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
189 switch(*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
190 case ':':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
191 case '/':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
192 tmp_float /= strtod(endptr+1, &endptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
193 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
194 case '.':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
195 case ',':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
196 /* we also handle floats specified with
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
197 * non-locale decimal point ::atmos
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
198 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
199 if(tmp_float<0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
200 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
201 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
202 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
203 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
204 }
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 (*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
207 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
208 "number or a ratio (numerator[:/]denominator): %s\n",name, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
209 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
210 }
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 if (opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
213 if (tmp_float < opt->min) {
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 >= %f: %s\n", name, opt->min, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
215 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
216 }
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 if (opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
219 if (tmp_float > opt->max) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
220 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
221 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
222 }
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 if(dst) VAL(dst) = tmp_float;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
225 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
226 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
227
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
228 static char* print_float(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
229 opt = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
230 return dup_printf("%f",VAL(val));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
231 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
232
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
233 m_option_type_t m_option_type_float = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
234 "Float",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
235 "floating point number or ratio (numerator[:/]denominator)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
236 sizeof(float),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
237 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
238 parse_float,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
239 print_float,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
240 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
241 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
242 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
243 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
244 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
245
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
246 ///////////// Position
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
247 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
248 #define VAL(x) (*(off_t*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
249
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
250 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
251 off_t tmp_off;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
252 char dummy;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
253
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
254 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
255 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
256 if (sscanf(param, sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
257 "%d%c" : "%lld%c", &tmp_off, &dummy) != 1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
258 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
259 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
260 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
261
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
262 if (opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
263 if (tmp_off < opt->min) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
264 mp_msg(MSGT_CFGPARSER, MSGL_ERR,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
265 (sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
266 "The %s option must be >= %d: %s\n" :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
267 "The %s option must be >= %lld: %s\n"),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
268 (off_t) opt->min, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
269 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
270 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
271
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
272 if (opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
273 if (tmp_off > opt->max) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
274 mp_msg(MSGT_CFGPARSER, MSGL_ERR,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
275 (sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
276 "The %s option must be <= %d: %s\n" :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
277 "The %s option must be <= %lld: %s\n"),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
278 (off_t) opt->max, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
279 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
282 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
283 VAL(dst) = tmp_off;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
284 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
285 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
286
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
287 static char* print_position(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
288 return dup_printf(sizeof(off_t) == sizeof(int) ? "%d" : "%lld",VAL(val));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
289 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
290
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
291 m_option_type_t m_option_type_position = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
292 "Position",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
293 "Integer (off_t)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
294 sizeof(off_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
295 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
296 parse_position,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
297 print_position,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
298 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
299 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
300 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
301 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
302 };
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 ///////////// String
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
306
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
307 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
308 #define VAL(x) (*(char**)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
309
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
310 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
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 (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
314 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
315
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
316 if ((opt->flags & M_OPT_MIN) && (strlen(param) < opt->min)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
317 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "parameter must be >= %d chars: %s\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
318 (int) opt->min, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
319 return M_OPT_OUT_OF_RANGE;
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 if ((opt->flags & M_OPT_MAX) && (strlen(param) > opt->max)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
323 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "parameter must be <= %d chars: %s\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
324 (int) opt->max, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
325 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
326 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
327
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
328 if(dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
329 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
330 free(VAL(dst));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
331 VAL(dst) = strdup(param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
332 }
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 return 1;
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 }
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 static char* print_str(m_option_t* opt, void* val) {
8168
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
339 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
340 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
341
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
342 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
343 if(dst && src) {
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
344 #ifndef NO_FREE
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
345 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
346 #endif
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
347 VAL(dst) = VAL(src) ? strdup(VAL(src)) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
348 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
349 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
350
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
351 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
352 if(src && VAL(src)){
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
353 #ifndef NO_FREE
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
354 free(VAL(src)); //FIXME!!!
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
355 #endif
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
356 VAL(src) = NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
360 m_option_type_t m_option_type_string = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
361 "String",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
362 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
363 sizeof(char*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
364 M_OPT_TYPE_DYNAMIC,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
365 parse_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
366 print_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
367 copy_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
368 copy_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
369 copy_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
370 free_str
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 //////////// String list
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
374
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
375 #define LIST_SEPARATOR ','
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
376 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
377 #define VAL(x) (*(char***)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
378
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
379 #define OP_NONE 0
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
380 #define OP_ADD 1
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
381 #define OP_PRE 2
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
382 #define OP_DEL 3
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
383 #define OP_CLR 4
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
384
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
385 static void free_str_list(void* dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
386 char** d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
387 int i;
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 if(!dst || !VAL(dst)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
390 d = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
391
9177
01a713dcaf23 disable free() in string and string_list parsers. yes, it's a hack
arpi
parents: 8736
diff changeset
392 // FIXME!!!
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
393 #ifndef NO_FREE
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
394 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
395 free(d[i]);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
396 free(d);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
397 #endif
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
398 VAL(dst) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
399 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
400
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
401 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
402 char** lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
403 int ln;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
404
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
405 if(!dst) return M_OPT_PARSER_ERR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
406 lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
407
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
408 for(ln = 0 ; lst && lst[ln] ; ln++)
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
411 lst = realloc(lst,(n+ln+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
412
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
413 if(pre) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
414 memmove(&lst[n],lst,(ln+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
415 memcpy(lst,add,n*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
416 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
417 memcpy(&lst[ln],add,(n+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
418
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
419 free(add);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
420
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
421 VAL(dst) = lst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
422
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
423 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
424 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
425
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
426 static int str_list_del(char** del, int n,void* dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
427 char **lst,*ep,**d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
428 int i,ln,s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
429 long idx;
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 if(!dst) return M_OPT_PARSER_ERR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
432 lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
433
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
434 for(ln = 0 ; lst && lst[ln] ; 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 s = ln;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
437
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
438 for(i = 0 ; del[i] != NULL ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
439 idx = strtol(del[i], &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
440 if(*ep) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
441 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
442 free(del[i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
443 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
444 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
445 free(del[i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
446 if(idx < 0 || idx >= ln) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
447 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Index %d is out of range\n",idx);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
448 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
449 } else if(!lst[idx])
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
450 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
451 free(lst[idx]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
452 lst[idx] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
453 s--;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
454 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
455 free(del);
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 if(s == 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
458 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
459 VAL(dst) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
460 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
463 d = calloc(s+1,sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
464 for(i = 0, n = 0 ; i < ln ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
465 if(!lst[i]) continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
466 d[n] = lst[i];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
467 n++;
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 d[s] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
470
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
471 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
472 VAL(dst) = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
473
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
474 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
477
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
478 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
479 int n = 0,len = strlen(opt->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
480 char *ptr = param, *last_ptr, **res;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
481 int op = OP_NONE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
482
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
483 if(opt->name[len-1] == '*' && ((int)strlen(name) > len - 1)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
484 char* n = &name[len-1];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
485 if(strcasecmp(n,"-add") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
486 op = OP_ADD;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
487 else if(strcasecmp(n,"-pre") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
488 op = OP_PRE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
489 else if(strcasecmp(n,"-del") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
490 op = OP_DEL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
491 else if(strcasecmp(n,"-clr") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
492 op = OP_CLR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
493 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
494 return M_OPT_UNKNOW;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
495 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
496
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
497 // Clear the list ??
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
498 if(op == OP_CLR) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
499 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
500 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
501 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
502 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
503
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
504 // All other op need a param
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
505 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
506 return M_OPT_MISSING_PARAM;
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 while(ptr[0] != '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
510 last_ptr = ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
511 ptr = strchr(ptr,LIST_SEPARATOR);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
512 if(!ptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
513 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
514 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
515 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
516 ptr++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
517 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
518 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
519 if(n == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
520 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
521 if( ((opt->flags & M_OPT_MIN) && (n < opt->min)) ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
522 ((opt->flags & M_OPT_MAX) && (n > opt->max)) )
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
523 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
524
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
525 if(!dst) return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
526
8384
7a7980b874f5 fixed 'mplayer -nosound xxx' sig11 if configfile have string list options
arpi
parents: 8262
diff changeset
527 res = malloc((n+2)*sizeof(char*));
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
528 ptr = param;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
529 n = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
530
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
531 while(1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
532 last_ptr = ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
533 ptr = strchr(ptr,LIST_SEPARATOR);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
534 if(!ptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
535 res[n] = strdup(last_ptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
536 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
537 break;
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 len = ptr - last_ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
540 res[n] = (char*)malloc(len + 1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
541 if(len) strncpy(res[n],last_ptr,len);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
542 res[n][len] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
543 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 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
546 res[n] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
547
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
548 switch(op) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
549 case OP_ADD:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
550 return str_list_add(res,n,dst,0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
551 case OP_PRE:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
552 return str_list_add(res,n,dst,1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
553 case OP_DEL:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
554 return str_list_del(res,n,dst);
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
557 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
558 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
559 VAL(dst) = res;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
560
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
561 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
562 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
563
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
564 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
565 int n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
566 char **d,**s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
567
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
568 if(!(dst && src)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
569 s = VAL(src);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
570
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
571 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
572 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
573
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
574 if(!s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
575 VAL(dst) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
576 return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
577 }
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 for(n = 0 ; s[n] != NULL ; n++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
580 /* NOTHING */;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
581 d = (char**)malloc((n+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
582 for( ; n >= 0 ; n--)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
583 d[n] = s[n] ? strdup(s[n]) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
584
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
585 VAL(dst) = d;
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 static char* print_str_list(m_option_t* opt, void* src) {
8168
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
589 char **lst = NULL;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
590 char *ret = NULL,*last = NULL;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
591 int i;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
592
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
593 if(!(src && VAL(src))) return NULL;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
594 lst = VAL(src);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
595
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
596 for(i = 0 ; lst[i] ; i++) {
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
597 if(last) {
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
598 ret = dup_printf("%s,%s",last,lst[i]);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
599 free(last);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
600 } else
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
601 ret = strdup(lst[i]);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
602 last = ret;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
603 }
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
604 if(last && last != ret) free(last);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
605 return ret;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
606 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
607
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
608 m_option_type_t m_option_type_string_list = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
609 "String list",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
610 "A list of string separated by ','\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
611 "Option with name that finish by an * allow to use the following suffix : \n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
612 "\t-add : add the given parameters at the end of list\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
613 "\t-pre : add the given parameters at the begining of list\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
614 "\t-del : remove the entry at the given indexs\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
615 "\t-clr : clear the list\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
616 "e.g: -vop-add flip,mirror -vop-del 2,5\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
617 sizeof(char**),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
618 M_OPT_TYPE_DYNAMIC | M_OPT_TYPE_ALLOW_WILDCARD,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
619 parse_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
620 print_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
621 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
622 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
623 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
624 free_str_list
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
625 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
626
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
627
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
628 /////////////////// Func based options
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
629
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
630 // 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
631 typedef struct m_func_save m_func_save_t;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
632 struct m_func_save {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
633 m_func_save_t* next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
634 char* name;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
635 char* param;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
636 };
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 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
639 #define VAL(x) (*(m_func_save_t**)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
640
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
641 static void free_func_pf(void* src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
642 m_func_save_t *s,*n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
643
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
644 if(!src) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
645
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
646 s = VAL(src);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
647
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
648 while(s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
649 n = s->next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
650 free(s->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
651 if(s->param) free(s->param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
652 free(s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
653 s = n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
654 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
655 VAL(src) = NULL;
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 // Parser for func_param and func_full
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
659 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
660 m_func_save_t *s,*p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
661
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
662 if(!dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
663 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
664
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
665 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
666 s->name = strdup(name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
667 s->param = param ? strdup(param) : NULL;
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 p = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
670 if(p) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
671 for( ; p->next != NULL ; p = p->next)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
672 /**/;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
673 p->next = s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
674 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
675 VAL(dst) = s;
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 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
680 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
681 m_func_save_t *d = NULL, *s,* last = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
682
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
683 if(!(dst && src)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
684 s = VAL(src);
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 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
687 free_func_pf(dst);
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 while(s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
690 d = (m_func_save_t*)malloc(sizeof(m_func_save_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
691 d->name = strdup(s->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
692 d->param = s->param ? strdup(s->param) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
693 if(last)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
694 last->next = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
695 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
696 VAL(dst) = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
697 last = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
698 s = s->next;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
701
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
702 }
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 /////////////////// Func_param
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
705
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
706 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
707 m_func_save_t* s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
708
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
709 if(!src) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
710 s = VAL(src);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
711
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
712 if(!s) return;
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 // Revert if needed
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
715 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
716 for( ; s != NULL ; s = s->next)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
717 ((m_opt_func_param_t) opt->p)(opt,s->param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
718 }
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 m_option_type_t m_option_type_func_param = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
721 "Func param",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
722 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
723 sizeof(m_func_save_t*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
724 M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
725 parse_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
726 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
727 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
728 set_func_param,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
729 copy_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
730 free_func_pf
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 /////////////////// Func_full
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 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
736 m_func_save_t* s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
737
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
738 if(!src) return;
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 for(s = VAL(src) ; s ; s = s->next) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
741 // Revert if needed
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
742 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
743 ((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
744 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
745 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
746
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
747 m_option_type_t m_option_type_func_full = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
748 "Func full",
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 sizeof(m_func_save_t*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
751 M_OPT_TYPE_ALLOW_WILDCARD|M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
752 parse_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
753 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
754 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
755 set_func_full,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
756 copy_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
757 free_func_pf
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
758 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
759
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
760 /////////////// Func
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
761
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
762 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
763 #define VAL(x) (*(int*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
764
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
765 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
766 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
767 VAL(dst) += 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
768 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
769 }
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 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
772 int i;
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,opt->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
774 for(i = 0 ; i < VAL(src) ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
775 ((m_opt_func_t) opt->p)(opt);
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 = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
779 "Func",
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(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
782 M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
783 parse_func,
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,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
787 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
788 NULL
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 /////////////////// Print
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 static int parse_print(m_option_t* opt,char *name, char *param, void* dst, int src) {
8736
michael
parents: 8384
diff changeset
794 if(opt->type->flags&M_OPT_TYPE_INDIRECT)
michael
parents: 8384
diff changeset
795 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", *(char **) opt->p);
michael
parents: 8384
diff changeset
796 else
michael
parents: 8384
diff changeset
797 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", (char *) opt->p);
michael
parents: 8384
diff changeset
798
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
799 if(opt->priv == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
800 exit(1); // Call something else instead ??
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
801 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
802 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
803
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
804 m_option_type_t m_option_type_print = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
805 "Print",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
806 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
807 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
808 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
809 parse_print,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
810 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
811 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
812 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
813 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
814 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
815 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
816
8736
michael
parents: 8384
diff changeset
817 m_option_type_t m_option_type_print_indirect = {
michael
parents: 8384
diff changeset
818 "Print",
michael
parents: 8384
diff changeset
819 "",
michael
parents: 8384
diff changeset
820 0,
michael
parents: 8384
diff changeset
821 M_OPT_TYPE_INDIRECT,
michael
parents: 8384
diff changeset
822 parse_print,
michael
parents: 8384
diff changeset
823 NULL,
michael
parents: 8384
diff changeset
824 NULL,
michael
parents: 8384
diff changeset
825 NULL,
michael
parents: 8384
diff changeset
826 NULL,
michael
parents: 8384
diff changeset
827 NULL
michael
parents: 8384
diff changeset
828 };
michael
parents: 8384
diff changeset
829
michael
parents: 8384
diff changeset
830
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
831 /////////////////////// Subconfig
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
832 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
833 #define VAL(x) (*(char***)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
834
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
835 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
836 char *subparam;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
837 char *subopt;
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
838 int nr = 0,i,r;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
839 m_option_t *subopts;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
840 char *token;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
841 char *p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
842 char** lst = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
843
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
844 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
845 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
846
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
847 subparam = malloc(strlen(param)+1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
848 subopt = malloc(strlen(param)+1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
849 p = strdup(param); // In case that param is a static string (cf man strtok)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
850
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
851 subopts = opt->p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
852
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
853 token = strtok(p, (char *)&(":"));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
854 while(token)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
855 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
856 int sscanf_ret;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
857 /* clear out */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
858 subopt[0] = subparam[0] = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
859
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
860 sscanf_ret = sscanf(token, "%[^=]=%[^:]", subopt, subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
861
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
862 mp_msg(MSGT_CFGPARSER, MSGL_DBG3, "token: '%s', subopt='%s', subparam='%s' (ret: %d)\n", token, subopt, subparam, sscanf_ret);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
863 switch(sscanf_ret)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
864 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
865 case 1:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
866 subparam[0] = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
867 case 2:
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
868 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
869 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
870 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
871 if(!subopts[i].name) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
872 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Unknow suboption %s\n",name,subopt);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
873 return M_OPT_UNKNOW;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
874 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
875 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
876 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
877 if(r < 0) return r;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
878 if(dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
879 lst = (char**)realloc(lst,2 * (nr+2) * sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
880 lst[2*nr] = strdup(subopt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
881 lst[2*nr+1] = subparam[0] == 0 ? NULL : strdup(subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
882 memset(&lst[2*(nr+1)],0,2*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
883 nr++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
884 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
885 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
886 default:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
887 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid subconfig argument! ('%s')\n", token);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
888 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
889 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
890 token = strtok(NULL, (char *)&(":"));
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
893 free(subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
894 free(subopt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
895 free(p);
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
896 if(dst)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
897 VAL(dst) = lst;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
898
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
899 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
900 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
901
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
902 m_option_type_t m_option_type_subconfig = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
903 "Subconfig",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
904 "The syntax is -option opt1=foo:flag:opt2=blah",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
905 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
906 M_OPT_TYPE_HAS_CHILD,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
907 parse_subconf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
908 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
909 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
910 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
911 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
912 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
913 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
914
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
915 #include "libmpcodecs/img_format.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
916 // TODO : use an array so we parse/print easily
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
917
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
918 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
919 uint32_t fmt = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
920
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
921 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
922 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
923
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
924 // From vf_format
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
925 if(!strcasecmp(param,"444p")) fmt=IMGFMT_444P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
926 if(!strcasecmp(param,"422p")) fmt=IMGFMT_422P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
927 if(!strcasecmp(param,"411p")) fmt=IMGFMT_411P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
928 if(!strcasecmp(param,"yuy2")) fmt=IMGFMT_YUY2; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
929 if(!strcasecmp(param,"yv12")) fmt=IMGFMT_YV12; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
930 if(!strcasecmp(param,"i420")) fmt=IMGFMT_I420; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
931 if(!strcasecmp(param,"yvu9")) fmt=IMGFMT_YVU9; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
932 if(!strcasecmp(param,"if09")) fmt=IMGFMT_IF09; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
933 if(!strcasecmp(param,"iyuv")) fmt=IMGFMT_IYUV; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
934 if(!strcasecmp(param,"uyvy")) fmt=IMGFMT_UYVY; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
935 if(!strcasecmp(param,"bgr24")) fmt=IMGFMT_BGR24; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
936 if(!strcasecmp(param,"bgr32")) fmt=IMGFMT_BGR32; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
937 if(!strcasecmp(param,"bgr16")) fmt=IMGFMT_BGR16; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
938 if(!strcasecmp(param,"bgr15")) fmt=IMGFMT_BGR15; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
939 if(!strcasecmp(param,"bgr8")) fmt=IMGFMT_BGR8; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
940 if(!strcasecmp(param,"bgr4")) fmt=IMGFMT_BGR4; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
941 if(!strcasecmp(param,"bgr1")) fmt=IMGFMT_BGR1; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
942 if(!strcasecmp(param,"rgb24")) fmt=IMGFMT_RGB24; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
943 if(!strcasecmp(param,"rgb32")) fmt=IMGFMT_RGB32; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
944 if(!strcasecmp(param,"rgb16")) fmt=IMGFMT_RGB16; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
945 if(!strcasecmp(param,"rgb15")) fmt=IMGFMT_RGB15; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
946 if(!strcasecmp(param,"rgb8")) fmt=IMGFMT_RGB8; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
947 if(!strcasecmp(param,"rgb4")) fmt=IMGFMT_RGB4; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
948 if(!strcasecmp(param,"rgb1")) fmt=IMGFMT_RGB1; else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
949 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: unknown format name: '%s'\n",param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
950 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
951 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
952
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
953 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
954 *((uint32_t*)dst) = fmt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
955
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
956 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
957 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
958
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
959 m_option_type_t m_option_type_imgfmt = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
960 "Image format (aka colorspace)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
961 "Pls report any missing colorspace",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
962 sizeof(uint32_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
963 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
964 parse_imgfmt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
965 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
966 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
967 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
968 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
969 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
970 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
971
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
972 /// Span stuff : Not finished
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
973 static int parse_play_pos(m_play_pos_t* pos,char* opt, char *s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
974 char *ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
975 long tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
976 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
977
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
978 memset(pos,0,sizeof(m_play_pos_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
979
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
980 if(!s || s[0] == '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
981 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
982
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
983 // Track index
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
984 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
985 if(ep != s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
986 if(tmp < 1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
987 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Track/Chapter index must be > 0\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
988 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
989 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
990 pos->idx = tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
991 if(ep[0] == '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
992 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
993 s = ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
994 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
995
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
996 // Span
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
997 tmp = strlen(s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
998 if(s[0] != '[' || s[tmp-1] != ']') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
999 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1000 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1001 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1002 s[tmp-1] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1003 s++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1004
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1005 // hh:mm:ss
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1006 for( i = 2 ; i >= 0 && s[0] != 0 ; i--) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1007 if(s[0] == ':') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1008 tmp = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1009 s++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1010 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1011 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1012 if(tmp < 0 || (ep[0] != '\0' && ep[0] != (i > 0 ? ':' : '.') )) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1013 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1014 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1015 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1016 pos->seconds += tmp * pow(60,i);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1017 s = ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1018 if(s[0] != '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1019 s++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1020
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1021 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1022 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1023
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1024 // sectors
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1025 if(s[0]) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1026 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1027 if(tmp < 0 || ep[0] != '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1028 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1029 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1030 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1031 pos->sectors = tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1032 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1033
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1034 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1035 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1036
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1037
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1038 static int parse_span(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
1039 m_span_t* span = dst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1040 char *s = param,*e = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1041 int r = M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1042
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1043 if(param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1044 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1045
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1046 e = strchr(param,'-');
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1047 if(e) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1048 e[0] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1049 e++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1050 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1051
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1052 if(s[0] == '\0' && e[0] == '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1053 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1054 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1055 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1056
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1057 if(s[0]) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1058 r = parse_play_pos(&span->start,name,s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1059 if(r < 0) return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1060 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1061 if(e && e[0] != '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1062 r = parse_play_pos(&span->end,name,s);
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 return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1065 }
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 m_option_type_t m_option_type_span = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1068 "Span",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1069 "The syntax is 1[hh:mm:ss.zz]-5[hh:mm:ss.zz]",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1070 sizeof(m_span_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1071 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1072 parse_span,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1073 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1074 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1075 copy_opt,
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 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1078 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1079
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1080
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1081 //// Objects (ie filters, etc) settings
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1082
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1083 #include "m_struct.h"
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1084
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1085 #undef VAL
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1086 #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
1087
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1088 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
1089 int i;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1090 char* n;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1091
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1092 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
1093 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
1094 if(!strcmp(n,name)) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1095 *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
1096 return 1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1097 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1098 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1099 return 0;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1100 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1101
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1102 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
1103 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
1104 char* eq,param;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1105 m_option_t* opt;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1106 int r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1107
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1108 eq = strchr(str,'=');
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1109 if(eq && eq == str)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1110 eq = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1111
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1112 if(eq) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1113 char* p = eq + 1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1114 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
1115 eq[0] = '\0';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1116 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
1117 if(!opt) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1118 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: %s doesn't have a %s parameter\n",opt_name,obj_name,str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1119 return M_OPT_UNKNOW;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1120 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1121 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
1122 if(r < 0) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1123 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while parsing %s parameter %s (%s)\n",opt_name,obj_name,str,p);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1124 eq[0] = '=';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1125 return r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1126 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1127 if(dst) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1128 dst[0] = strdup(str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1129 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
1130 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1131 eq[0] = '=';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1132 } else {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1133 if((*nold) >= oldmax) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1134 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: %s have only %d params, so yon can't give more than that unnamed params\n",
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1135 opt_name,obj_name,oldmax);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1136 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
1137 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1138 opt = &desc->fields[(*nold)];
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1139 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
1140 if(r < 0) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1141 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: error while parsing %s parameter %s (%s)\n",opt_name,obj_name,opt->name,str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1142 return r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1143 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1144 if(dst) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1145 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
1146 dst[1] = strdup(str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1147 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1148 (*nold)++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1149 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1150 return 1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1151 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1152
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1153 static int get_obj_params(char* opt_name, char* name,char* params,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1154 m_struct_t* desc,char*** _ret) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1155 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
1156 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
1157 char** ret;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1158
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1159 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
1160 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
1161 if(!desc->fields) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1162 printf("%s doesn't have any options\n\n",name);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1163 //exit_player();
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1164 exit(0);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1165 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1166 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
1167 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
1168 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
1169 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
1170 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
1171 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
1172 else
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1173 strcpy(min,"No");
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1174 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
1175 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
1176 else
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1177 strcpy(max,"No");
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1178 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
1179 opt->name,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1180 opt->type->name,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1181 min,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1182 max);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1183 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1184 printf("\n");
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1185 //exit_player() isn't avaible in mencoder
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1186 exit(0);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1187 }
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 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
1190 /* NOP */;
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 // 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
1193 r = 1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1194 while(last_ptr && last_ptr[0] != '\0') {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1195 ptr = strchr(last_ptr,':');
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1196 if(!ptr) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1197 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
1198 n++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1199 break;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1200 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1201 ptr[0] = '\0';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1202 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
1203 ptr[0] = ':';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1204 if(r < 0) break;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1205 n++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1206 last_ptr = ptr+1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1207 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1208 if(r < 0) return r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1209 if(!_ret) // Just test
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1210 return 1;
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 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
1213 n = nold = 0;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1214 last_ptr = params;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1215
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1216 while(last_ptr && last_ptr[0] != '\0') {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1217 ptr = strchr(last_ptr,':');
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1218 if(!ptr) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1219 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
1220 n++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1221 break;
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 ptr[0] = '\0';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1224 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
1225 n++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1226 last_ptr = ptr+1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1227 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1228 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
1229 *_ret = ret;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1230
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1231 return 1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1232 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1233
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1234
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1235 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
1236 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
1237 int r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1238 char *param,**plist = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1239 m_struct_t* desc;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1240 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
1241
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 // Now check that the object exist
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1244 param = strchr(str,'=');
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1245 if(param) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1246 param[0] = '\0';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1247 param++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1248 if(strlen(param) <= 0)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1249 param = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1250 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1251
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1252
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1253 if(!find_obj_desc(str,list,&desc)) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1254 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: %s doesn't exist\n",opt,str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1255 return M_OPT_INVALID;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1256 }
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 if(param) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1259 if(!desc && _ret) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1260 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
1261 plist[0] = strdup("_oldargs_");
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1262 plist[1] = strdup(param);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1263 } else if(desc) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1264 r = get_obj_params(opt,str,param,desc,_ret ? &plist : NULL);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1265 if(r < 0)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1266 return r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1267 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1268 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1269 if(!_ret)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1270 return 1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1271
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1272 ret = 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
1273 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
1274 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
1275 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
1276
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1277 *_ret = ret;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1278 return 1;
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
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1281
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1282 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
1283 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
1284 int n = 0,r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1285 char *str;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1286 char *ptr, *last_ptr;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1287 m_obj_settings_t *res = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1288
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1289 // 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
1290 if(!opt->priv)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1291 return M_OPT_INVALID;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1292
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1293 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
1294 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
1295
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1296 if(!strcmp(param,"help")) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1297 m_obj_list_t* ol = opt->priv;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1298 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
1299 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
1300 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
1301 M_ST_MB(char*,ol->list[n],ol->info_off));
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1302 exit(0);
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 ptr = str = strdup(param);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1305
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1306 while(ptr[0] != '\0') {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1307 last_ptr = ptr;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1308 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
1309 if(!ptr) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1310 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
1311 if(r < 0) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1312 free(str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1313 return r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1314 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1315 n++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1316 break;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1317 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1318 ptr[0] = '\0';
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1319 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
1320 if(r < 0) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1321 free(str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1322 return r;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1323 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1324 ptr++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1325 n++;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1326 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1327 free(str);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1328 if(n == 0)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1329 return M_OPT_INVALID;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1330
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1331 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
1332 ((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
1333 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
1334
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1335 if(dst)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1336 VAL(dst) = res;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1337
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1338 return 1;
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
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1341 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
1342 int n;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1343 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
1344
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1345 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
1346
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1347 d = VAL(dst);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1348 #ifndef NO_FREE
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1349 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
1350 free(d[n].name);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1351 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
1352 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1353 free(d);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1354 #endif
9593
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1355 VAL(dst) = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1356 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1357
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1358 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
1359 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
1360 int n;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1361
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1362 if(!(dst && src))
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1363 return;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1364
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1365 s = VAL(src);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1366
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1367 if(VAL(dst))
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1368 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
1369 if(!s) return;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1370
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1371
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1372
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1373 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
1374 /* NOP */;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1375 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
1376 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
1377 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
1378 d[n].attribs = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1379 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
1380 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1381 d[n].name = d[n].attribs = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1382 VAL(dst) = d;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1383 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1384
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1385 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
1386 "Object settings list",
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1387 "",
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1388 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
1389 M_OPT_TYPE_DYNAMIC,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1390 parse_obj_settings_list,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1391 NULL,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1392 copy_obj_settings_list,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1393 copy_obj_settings_list,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1394 copy_obj_settings_list,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1395 free_obj_settings_list,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1396 };
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1397
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1398
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1399
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1400 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
1401 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
1402 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
1403 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
1404 int s,i;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1405 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
1406 char* pre_name = NULL;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1407
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1408 if(!obj_p) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1409 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: presets need a pointer to a m_obj_presets_t in the priv field\n",name);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1410 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
1411 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1412
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1413 if(!param)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1414 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
1415
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1416 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
1417 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
1418 s = in_desc->size;
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 if(!strcmp(param,"help")) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1421 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "Avaible presets for %s->%s :",out_desc->name,name);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1422 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
1423 pre += s)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1424 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
1425 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
1426 exit(0);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1427 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1428
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1429 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
1430 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
1431 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
1432 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1433 if(!pre_name) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1434 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: there no preset named %s\n"
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1435 "Avaible presets are :",name,param);
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1436 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
1437 pre += s)
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1438 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
1439 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
1440 return M_OPT_INVALID;
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
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1443 if(!dst) 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 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
1446 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
1447 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
1448 if(!out_opt) {
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1449 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: unable to find the target option for field %s.\nYou should report that to the developpers\n",name,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
1450 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
1451 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1452 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
1453 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1454 return 1;
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1455 }
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1456
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1457
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1458 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
1459 "Object presets",
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1460 "",
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1461 0,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1462 0,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1463 parse_obj_presets,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1464 NULL,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1465 NULL,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1466 NULL,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1467 NULL,
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1468 NULL
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1469 };
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1470
e9a2af584986 Add the new -vf option wich is the same as vop in reverse order.
albeu
parents: 9177
diff changeset
1471 #endif