annotate m_option.c @ 8164:487cfc28525d

New config system + cleanup of header inter dependency
author albeu
date Tue, 12 Nov 2002 01:56:42 +0000
parents
children ff6a98628e6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
2 #include "config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
3
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
4 #ifdef NEW_CONFIG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
5
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
6 #include <stdlib.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
7 #include <string.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
8 #include <math.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
9 #include <stdio.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
10 #include <stdarg.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
11 #include <inttypes.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
12
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
13 #include "m_option.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
14 //#include "m_config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
15 #include "mp_msg.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
16
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
17 // Default function that just do a memcpy
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
18
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
19 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
20 if(dst && src)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
21 memcpy(dst,src,opt->type->size);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
22 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
23
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
24 // Helper for the print funcs (from man printf)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
25 static char* dup_printf(const char *fmt, ...) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
26 /* Guess we need no more than 50 bytes. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
27 int n, size = 50;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
28 char *p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
29 va_list ap;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
30 if ((p = malloc (size)) == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
31 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
32 while (1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
33 /* Try to print in the allocated space. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
34 va_start(ap, fmt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
35 n = vsnprintf (p, size, fmt, ap);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
36 va_end(ap);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
37 /* If that worked, return the string. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
38 if (n > -1 && n < size)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
39 return p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
40 /* Else try again with more space. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
41 if (n > -1) /* glibc 2.1 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
42 size = n+1; /* precisely what is needed */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
43 else /* glibc 2.0 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
44 size *= 2; /* twice the old size */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
45 if ((p = realloc (p, size)) == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
46 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
47 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
48 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
49
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
50
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
51 // Flag
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
52
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
53 #define VAL(x) (*(int*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
54
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
55 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
56 if (src == M_CONFIG_FILE) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
57 if (!strcasecmp(param, "yes") || /* any other language? */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
58 !strcasecmp(param, "ja") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
59 !strcasecmp(param, "si") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
60 !strcasecmp(param, "igen") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
61 !strcasecmp(param, "y") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
62 !strcasecmp(param, "j") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
63 !strcasecmp(param, "i") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
64 !strcmp(param, "1")) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
65 if(dst) VAL(dst) = opt->max;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
66 } else if (!strcasecmp(param, "no") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
67 !strcasecmp(param, "nein") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
68 !strcasecmp(param, "nicht") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
69 !strcasecmp(param, "nem") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
70 !strcasecmp(param, "n") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
71 !strcmp(param, "0")) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
72 if(dst) VAL(dst) = opt->min;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
73 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
74 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "invalid parameter for %s flag: %s\n",name, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
75 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
76 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
77 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
78 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
79 if(dst) VAL(dst) = opt->max;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
80 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
81 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
82 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
83
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
84 static char* print_flag(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
85 if(VAL(val) == opt->min)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
86 return strdup("no");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
87 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
88 return strdup("yes");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
89 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
90
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
91 m_option_type_t m_option_type_flag = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
92 "Flag",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
93 "need yes or no in config files",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
94 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
95 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
96 parse_flag,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
97 print_flag,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
98 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
99 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
100 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
101 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
102 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
103
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
104 // Integer
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
105
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
106 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
107 long tmp_int;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
108 char *endptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
109 src = 0;
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 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
112 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
113
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
114 tmp_int = strtol(param, &endptr, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
115 if (*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
116 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
117 return M_OPT_INVALID;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
120 if ((opt->flags & M_OPT_MIN) && (tmp_int < opt->min)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
121 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
122 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
123 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
124
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
125 if ((opt->flags & M_OPT_MAX) && (tmp_int > opt->max)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
126 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
127 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
128 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
129
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
130 if(dst) VAL(dst) = tmp_int;
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 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
135 static char* print_int(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
136 opt = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
137 return dup_printf("%d",VAL(val));
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
140 m_option_type_t m_option_type_int = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
141 "Integer",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
142 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
143 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
144 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
145 parse_int,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
146 print_int,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
147 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
148 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
149 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
150 NULL
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 // Float
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
154
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
155 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
156 #define VAL(x) (*(float*)(x))
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 static int parse_float(m_option_t* opt,char *name, char *param, void* dst, int src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
159 float tmp_float;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
160 char* endptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
161 src = 0;
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 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
164 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
165
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
166 tmp_float = strtod(param, &endptr);
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 switch(*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
169 case ':':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
170 case '/':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
171 tmp_float /= strtod(endptr+1, &endptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
172 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
173 case '.':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
174 case ',':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
175 /* we also handle floats specified with
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
176 * non-locale decimal point ::atmos
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
177 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
178 if(tmp_float<0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
179 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
180 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
181 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
182 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
183 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
184
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
185 if (*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
186 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
187 "number or a ratio (numerator[:/]denominator): %s\n",name, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
188 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
189 }
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 (opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
192 if (tmp_float < opt->min) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
193 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
194 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
197 if (opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
198 if (tmp_float > opt->max) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
199 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
200 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
201 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
202
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
203 if(dst) VAL(dst) = tmp_float;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
204 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
207 static char* print_float(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
208 opt = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
209 return dup_printf("%f",VAL(val));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
210 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
211
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
212 m_option_type_t m_option_type_float = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
213 "Float",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
214 "floating point number or ratio (numerator[:/]denominator)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
215 sizeof(float),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
216 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
217 parse_float,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
218 print_float,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
219 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
220 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
221 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
222 NULL
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 ///////////// Position
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
226 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
227 #define VAL(x) (*(off_t*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
228
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
229 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
230 off_t tmp_off;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
231 char dummy;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
232
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
233 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
234 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
235 if (sscanf(param, sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
236 "%d%c" : "%lld%c", &tmp_off, &dummy) != 1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
237 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
238 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
239 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
240
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
241 if (opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
242 if (tmp_off < opt->min) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
243 mp_msg(MSGT_CFGPARSER, MSGL_ERR,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
244 (sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
245 "The %s option must be >= %d: %s\n" :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
246 "The %s option must be >= %lld: %s\n"),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
247 (off_t) opt->min, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
248 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
249 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
250
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
251 if (opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
252 if (tmp_off > opt->max) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
253 mp_msg(MSGT_CFGPARSER, MSGL_ERR,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
254 (sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
255 "The %s option must be <= %d: %s\n" :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
256 "The %s option must be <= %lld: %s\n"),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
257 (off_t) opt->max, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
258 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
259 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
260
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
261 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
262 VAL(dst) = tmp_off;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
263 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
264 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
265
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
266 static char* print_position(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
267 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
268 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
269
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
270 m_option_type_t m_option_type_position = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
271 "Position",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
272 "Integer (off_t)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
273 sizeof(off_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
274 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
275 parse_position,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
276 print_position,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
277 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
278 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
279 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
280 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
281 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
282
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
283
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
284 ///////////// String
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
285
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
286 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
287 #define VAL(x) (*(char**)(x))
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 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
290
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
291
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
292 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
293 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
294
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
295 if ((opt->flags & M_OPT_MIN) && (strlen(param) < opt->min)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
296 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "parameter must be >= %d chars: %s\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
297 (int) opt->min, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
298 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
299 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
300
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
301 if ((opt->flags & M_OPT_MAX) && (strlen(param) > opt->max)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
302 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "parameter must be <= %d chars: %s\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
303 (int) opt->max, param);
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(dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
308 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
309 free(VAL(dst));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
310 VAL(dst) = strdup(param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
311 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
312
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
313 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
314
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 static char* print_str(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
318 return (val && VAL(val) && strlen(VAL(val)) > 0) ? strdup(VAL(val)) : strdup("(empty)");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
319 }
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 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
322 if(dst && src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
323 if(VAL(dst)) free(VAL(dst));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
324 VAL(dst) = VAL(src) ? strdup(VAL(src)) : NULL;
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 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
327
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
328 static void free_str(void* src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
329 if(src && VAL(src)){
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
330 free(VAL(src));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
331 VAL(src) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
332 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
333 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
334
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
335 m_option_type_t m_option_type_string = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
336 "String",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
337 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
338 sizeof(char*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
339 M_OPT_TYPE_DYNAMIC,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
340 parse_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
341 print_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
342 copy_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
343 copy_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
344 copy_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
345 free_str
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 //////////// String list
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
349
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
350 #define LIST_SEPARATOR ','
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
351 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
352 #define VAL(x) (*(char***)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
353
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
354 #define OP_NONE 0
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
355 #define OP_ADD 1
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
356 #define OP_PRE 2
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
357 #define OP_DEL 3
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
358 #define OP_CLR 4
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
359
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
360 static void free_str_list(void* dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
361 char** d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
362 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
363
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
364 if(!dst || !VAL(dst)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
365 d = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
366
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
367
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
368 for(i = 0 ; d[i] != NULL ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
369 free(d[i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
370 free(d);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
371 VAL(dst) = NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
374 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
375 char** lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
376 int ln;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
377
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
378 if(!dst) return M_OPT_PARSER_ERR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
379 lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
380
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
381 for(ln = 0 ; lst && lst[ln] ; ln++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
382 /**/;
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 lst = realloc(lst,(n+ln+1)*sizeof(char*));
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 if(pre) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
387 memmove(&lst[n],lst,(ln+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
388 memcpy(lst,add,n*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
389 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
390 memcpy(&lst[ln],add,(n+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
391
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
392 free(add);
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 VAL(dst) = lst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
395
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
396 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
399 static int str_list_del(char** del, int n,void* dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
400 char **lst,*ep,**d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
401 int i,ln,s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
402 long idx;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
403
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
404 if(!dst) return M_OPT_PARSER_ERR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
405 lst = VAL(dst);
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 for(ln = 0 ; lst && lst[ln] ; ln++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
408 /**/;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
409 s = ln;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
410
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
411 for(i = 0 ; del[i] != NULL ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
412 idx = strtol(del[i], &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
413 if(*ep) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
414 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
415 free(del[i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
416 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
417 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
418 free(del[i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
419 if(idx < 0 || idx >= ln) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
420 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Index %d is out of range\n",idx);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
421 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
422 } else if(!lst[idx])
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
423 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
424 free(lst[idx]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
425 lst[idx] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
426 s--;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
427 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
428 free(del);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
429
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
430 if(s == 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
431 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
432 VAL(dst) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
433 return 1;
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 d = calloc(s+1,sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
437 for(i = 0, n = 0 ; i < ln ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
438 if(!lst[i]) continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
439 d[n] = lst[i];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
440 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
441 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
442 d[s] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
443
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
444 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
445 VAL(dst) = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
446
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
447 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
448 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
449
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
450
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
451 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
452 int n = 0,len = strlen(opt->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
453 char *ptr = param, *last_ptr, **res;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
454 int op = OP_NONE;
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 if(opt->name[len-1] == '*' && ((int)strlen(name) > len - 1)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
457 char* n = &name[len-1];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
458 if(strcasecmp(n,"-add") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
459 op = OP_ADD;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
460 else if(strcasecmp(n,"-pre") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
461 op = OP_PRE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
462 else if(strcasecmp(n,"-del") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
463 op = OP_DEL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
464 else if(strcasecmp(n,"-clr") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
465 op = OP_CLR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
466 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
467 return M_OPT_UNKNOW;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
470 // Clear the list ??
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
471 if(op == OP_CLR) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
472 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
473 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
474 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
475 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
476
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
477 // All other op need a param
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
478 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
479 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
480
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
481
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
482 while(ptr[0] != '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
483 last_ptr = ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
484 ptr = strchr(ptr,LIST_SEPARATOR);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
485 if(!ptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
486 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
487 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
488 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
489 ptr++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
490 n++;
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(n == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
493 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
494 if( ((opt->flags & M_OPT_MIN) && (n < opt->min)) ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
495 ((opt->flags & M_OPT_MAX) && (n > opt->max)) )
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
496 return M_OPT_OUT_OF_RANGE;
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 if(!dst) return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
499
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
500 res = malloc((n+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
501 ptr = param;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
502 n = 0;
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 while(1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
505 last_ptr = ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
506 ptr = strchr(ptr,LIST_SEPARATOR);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
507 if(!ptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
508 res[n] = strdup(last_ptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
509 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
510 break;
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 len = ptr - last_ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
513 res[n] = (char*)malloc(len + 1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
514 if(len) strncpy(res[n],last_ptr,len);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
515 res[n][len] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
516 ptr++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
517 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
518 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
519 res[n] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
520
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
521 switch(op) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
522 case OP_ADD:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
523 return str_list_add(res,n,dst,0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
524 case OP_PRE:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
525 return str_list_add(res,n,dst,1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
526 case OP_DEL:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
527 return str_list_del(res,n,dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
528 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
529
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
530 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
531 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
532 VAL(dst) = res;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
533
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
534 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
535 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
536
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
537 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
538 int n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
539 char **d,**s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
540
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
541 if(!(dst && src)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
542 s = VAL(src);
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 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
545 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
546
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
547 if(!s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
548 VAL(dst) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
549 return;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
552 for(n = 0 ; s[n] != NULL ; n++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
553 /* NOTHING */;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
554 d = (char**)malloc((n+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
555 for( ; n >= 0 ; n--)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
556 d[n] = s[n] ? strdup(s[n]) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
557
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
558 VAL(dst) = d;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
561 static char* print_str_list(m_option_t* opt, void* src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
562 return strdup("TODO ;)");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
563 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
564
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
565 m_option_type_t m_option_type_string_list = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
566 "String list",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
567 "A list of string separated by ','\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
568 "Option with name that finish by an * allow to use the following suffix : \n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
569 "\t-add : add the given parameters at the end of list\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
570 "\t-pre : add the given parameters at the begining of list\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
571 "\t-del : remove the entry at the given indexs\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
572 "\t-clr : clear the list\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
573 "e.g: -vop-add flip,mirror -vop-del 2,5\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
574 sizeof(char**),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
575 M_OPT_TYPE_DYNAMIC | M_OPT_TYPE_ALLOW_WILDCARD,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
576 parse_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
577 print_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
578 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
579 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
580 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
581 free_str_list
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
584
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
585 /////////////////// Func based options
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
586
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
587 // 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
588 typedef struct m_func_save m_func_save_t;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
589 struct m_func_save {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
590 m_func_save_t* next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
591 char* name;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
592 char* param;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
593 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
594
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
595 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
596 #define VAL(x) (*(m_func_save_t**)(x))
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 static void free_func_pf(void* src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
599 m_func_save_t *s,*n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
600
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
601 if(!src) return;
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 s = VAL(src);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
604
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
605 while(s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
606 n = s->next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
607 free(s->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
608 if(s->param) free(s->param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
609 free(s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
610 s = n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
611 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
612 VAL(src) = NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
615 // Parser for func_param and func_full
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
616 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
617 m_func_save_t *s,*p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
618
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
619 if(!dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
620 return 1;
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 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
623 s->name = strdup(name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
624 s->param = param ? strdup(param) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
625
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
626 p = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
627 if(p) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
628 for( ; p->next != NULL ; p = p->next)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
629 /**/;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
630 p->next = s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
631 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
632 VAL(dst) = s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
633
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
634 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
635 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
636
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
637 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
638 m_func_save_t *d = NULL, *s,* last = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
639
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
640 if(!(dst && src)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
641 s = VAL(src);
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 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
644 free_func_pf(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
645
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
646 while(s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
647 d = (m_func_save_t*)malloc(sizeof(m_func_save_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
648 d->name = strdup(s->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
649 d->param = s->param ? strdup(s->param) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
650 if(last)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
651 last->next = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
652 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
653 VAL(dst) = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
654 last = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
655 s = s->next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
656 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
657
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
658
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
659 }
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 /////////////////// Func_param
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 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
664 m_func_save_t* s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
665
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
666 if(!src) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
667 s = VAL(src);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
668
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
669 if(!s) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
670
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
671 // Revert if needed
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
672 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
673 for( ; s != NULL ; s = s->next)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
674 ((m_opt_func_param_t) opt->p)(opt,s->param);
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
677 m_option_type_t m_option_type_func_param = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
678 "Func param",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
679 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
680 sizeof(m_func_save_t*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
681 M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
682 parse_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
683 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
684 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
685 set_func_param,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
686 copy_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
687 free_func_pf
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
688 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
689
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
690 /////////////////// Func_full
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 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
693 m_func_save_t* s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
694
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
695 if(!src) return;
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 for(s = VAL(src) ; s ; s = s->next) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
698 // Revert if needed
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
699 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
700 ((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
701 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
702 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
703
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
704 m_option_type_t m_option_type_func_full = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
705 "Func full",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
706 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
707 sizeof(m_func_save_t*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
708 M_OPT_TYPE_ALLOW_WILDCARD|M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
709 parse_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
710 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
711 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
712 set_func_full,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
713 copy_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
714 free_func_pf
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
715 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
716
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
717 /////////////// Func
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
718
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
719 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
720 #define VAL(x) (*(int*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
721
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
722 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
723 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
724 VAL(dst) += 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
725 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
726 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
727
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
728 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
729 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
730 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
731 for(i = 0 ; i < VAL(src) ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
732 ((m_opt_func_t) opt->p)(opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
733 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
734
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
735 m_option_type_t m_option_type_func = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
736 "Func",
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 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
739 M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
740 parse_func,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
741 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
742 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
743 set_func,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
744 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
745 NULL
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
748 /////////////////// Print
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
749
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
750 static int parse_print(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
751 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", (char *) opt->p);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
752 if(opt->priv == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
753 exit(1); // Call something else instead ??
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
754 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
755 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
756
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
757 m_option_type_t m_option_type_print = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
758 "Print",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
759 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
760 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
761 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
762 parse_print,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
763 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
764 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
765 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
766 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
767 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
768 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
769
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
770 /////////////////////// Subconfig
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
771 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
772 #define VAL(x) (*(char***)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
773
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
774 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
775 char *subparam;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
776 char *subopt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
777 int nr = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
778 m_option_t *subopts;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
779 char *token;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
780 char *p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
781 char** lst = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
782
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
783 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
784 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
785
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
786 subparam = malloc(strlen(param)+1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
787 subopt = malloc(strlen(param)+1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
788 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
789
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
790 subopts = opt->p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
791
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
792 token = strtok(p, (char *)&(":"));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
793 while(token)
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 int sscanf_ret;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
796 /* clear out */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
797 subopt[0] = subparam[0] = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
798
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
799 sscanf_ret = sscanf(token, "%[^=]=%[^:]", subopt, subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
800
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
801 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
802 switch(sscanf_ret)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
803 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
804 case 1:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
805 subparam[0] = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
806 case 2:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
807 if(dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
808 lst = (char**)realloc(lst,2 * (nr+2) * sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
809 lst[2*nr] = strdup(subopt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
810 lst[2*nr+1] = subparam[0] == 0 ? NULL : strdup(subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
811 memset(&lst[2*(nr+1)],0,2*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
812 nr++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
813 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
814 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
815 default:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
816 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
817 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
818 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
819 token = strtok(NULL, (char *)&(":"));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
820 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
821
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
822 free(subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
823 free(subopt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
824 free(p);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
825 VAL(dst) = lst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
826
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
827 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
828 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
829
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
830 m_option_type_t m_option_type_subconfig = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
831 "Subconfig",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
832 "The syntax is -option opt1=foo:flag:opt2=blah",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
833 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
834 M_OPT_TYPE_HAS_CHILD,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
835 parse_subconf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
836 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
837 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
838 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
839 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
840 NULL
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
843 #include "libmpcodecs/img_format.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
844 // TODO : use an array so we parse/print easily
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
845
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
846 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
847 uint32_t fmt = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
848
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
849 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
850 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
851
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
852 // From vf_format
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
853 if(!strcasecmp(param,"444p")) fmt=IMGFMT_444P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
854 if(!strcasecmp(param,"422p")) fmt=IMGFMT_422P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
855 if(!strcasecmp(param,"411p")) fmt=IMGFMT_411P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
856 if(!strcasecmp(param,"yuy2")) fmt=IMGFMT_YUY2; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
857 if(!strcasecmp(param,"yv12")) fmt=IMGFMT_YV12; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
858 if(!strcasecmp(param,"i420")) fmt=IMGFMT_I420; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
859 if(!strcasecmp(param,"yvu9")) fmt=IMGFMT_YVU9; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
860 if(!strcasecmp(param,"if09")) fmt=IMGFMT_IF09; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
861 if(!strcasecmp(param,"iyuv")) fmt=IMGFMT_IYUV; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
862 if(!strcasecmp(param,"uyvy")) fmt=IMGFMT_UYVY; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
863 if(!strcasecmp(param,"bgr24")) fmt=IMGFMT_BGR24; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
864 if(!strcasecmp(param,"bgr32")) fmt=IMGFMT_BGR32; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
865 if(!strcasecmp(param,"bgr16")) fmt=IMGFMT_BGR16; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
866 if(!strcasecmp(param,"bgr15")) fmt=IMGFMT_BGR15; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
867 if(!strcasecmp(param,"bgr8")) fmt=IMGFMT_BGR8; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
868 if(!strcasecmp(param,"bgr4")) fmt=IMGFMT_BGR4; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
869 if(!strcasecmp(param,"bgr1")) fmt=IMGFMT_BGR1; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
870 if(!strcasecmp(param,"rgb24")) fmt=IMGFMT_RGB24; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
871 if(!strcasecmp(param,"rgb32")) fmt=IMGFMT_RGB32; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
872 if(!strcasecmp(param,"rgb16")) fmt=IMGFMT_RGB16; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
873 if(!strcasecmp(param,"rgb15")) fmt=IMGFMT_RGB15; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
874 if(!strcasecmp(param,"rgb8")) fmt=IMGFMT_RGB8; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
875 if(!strcasecmp(param,"rgb4")) fmt=IMGFMT_RGB4; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
876 if(!strcasecmp(param,"rgb1")) fmt=IMGFMT_RGB1; else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
877 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: unknown format name: '%s'\n",param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
878 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
879 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
880
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
881 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
882 *((uint32_t*)dst) = fmt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
883
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
884 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
887 m_option_type_t m_option_type_imgfmt = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
888 "Image format (aka colorspace)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
889 "Pls report any missing colorspace",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
890 sizeof(uint32_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
891 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
892 parse_imgfmt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
893 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
894 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
895 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
896 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
897 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
898 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
899
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
900 /// Span stuff : Not finished
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
901 static int parse_play_pos(m_play_pos_t* pos,char* opt, char *s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
902 char *ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
903 long tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
904 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
905
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
906 memset(pos,0,sizeof(m_play_pos_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
907
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
908 if(!s || s[0] == '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
909 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
910
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
911 // Track index
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
912 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
913 if(ep != s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
914 if(tmp < 1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
915 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: Track/Chapter index must be > 0\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
916 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
917 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
918 pos->idx = tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
919 if(ep[0] == '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
920 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
921 s = ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
922 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
923
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
924 // Span
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
925 tmp = strlen(s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
926 if(s[0] != '[' || s[tmp-1] != ']') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
927 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
928 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
929 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
930 s[tmp-1] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
931 s++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
932
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
933 // hh:mm:ss
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
934 for( i = 2 ; i >= 0 && s[0] != 0 ; i--) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
935 if(s[0] == ':') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
936 tmp = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
937 s++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
938 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
939 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
940 if(tmp < 0 || (ep[0] != '\0' && ep[0] != (i > 0 ? ':' : '.') )) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
941 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
942 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
943 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
944 pos->seconds += tmp * pow(60,i);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
945 s = ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
946 if(s[0] != '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
947 s++;
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 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
951
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
952 // sectors
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
953 if(s[0]) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
954 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
955 if(tmp < 0 || ep[0] != '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
956 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument ?\n", opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
957 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
958 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
959 pos->sectors = tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
960 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
961
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
962 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
963 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
964
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
965
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
966 static int parse_span(m_option_t* opt,char *name, char *param, void* dst, int src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
967 m_span_t* span = dst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
968 char *s = param,*e = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
969 int r = M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
970
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
971 if(param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
972 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
973
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
974 e = strchr(param,'-');
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
975 if(e) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
976 e[0] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
977 e++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
978 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
979
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
980 if(s[0] == '\0' && e[0] == '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
981 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
982 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
983 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
984
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
985 if(s[0]) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
986 r = parse_play_pos(&span->start,name,s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
987 if(r < 0) return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
988 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
989 if(e && e[0] != '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
990 r = parse_play_pos(&span->end,name,s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
991
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
992 return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
993 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
994
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
995 m_option_type_t m_option_type_span = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
996 "Span",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
997 "The syntax is 1[hh:mm:ss.zz]-5[hh:mm:ss.zz]",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
998 sizeof(m_span_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
999 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1000 parse_span,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1001 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1002 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1003 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1004 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1005 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1006 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1007
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1008 #endif