annotate m_option.c @ 15533:ddf15d233d58

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