annotate m_option.c @ 9177:01a713dcaf23

disable free() in string and string_list parsers. yes, it's a hack (and a little memleak), but i can explain :) [note it's just a few kB memleak, but it's the price of stability without full code review/audit - there are hunderds of possible double free()] the old config parser didn't free() strings/stringlists, but didn't even allocate them by default. the new one always free(), and it causes memcorruption/sig11 at cases like this: char* dvd_device="/dev/dvd"; {"dvd-device", &dvd_device, CONF_TYPE_STRING, 0, 0, 0, NULL}, since string constansts (allocated in .TEXT segment) cannot be free()'d
author arpi
date Thu, 30 Jan 2003 21:28:01 +0000
parents d3b750570887
children e9a2af584986
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
2 #include "config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
3
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
4 #ifdef NEW_CONFIG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
5
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
6 #include <stdlib.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
7 #include <string.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
8 #include <math.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
9 #include <stdio.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
10 #include <stdarg.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
11 #include <inttypes.h>
8262
103a2758f9c5 FreeBSD fix
nexus
parents: 8168
diff changeset
12 #include <unistd.h>
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
13
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
14 #include "m_option.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
15 //#include "m_config.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
16 #include "mp_msg.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
17
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
18 // Default function that just do a memcpy
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
19
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
20 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
21 if(dst && src)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
22 memcpy(dst,src,opt->type->size);
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
25 // Helper for the print funcs (from man printf)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
26 static char* dup_printf(const char *fmt, ...) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
27 /* Guess we need no more than 50 bytes. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
28 int n, size = 50;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
29 char *p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
30 va_list ap;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
31 if ((p = malloc (size)) == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
32 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
33 while (1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
34 /* Try to print in the allocated space. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
35 va_start(ap, fmt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
36 n = vsnprintf (p, size, fmt, ap);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
37 va_end(ap);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
38 /* If that worked, return the string. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
39 if (n > -1 && n < size)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
40 return p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
41 /* Else try again with more space. */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
42 if (n > -1) /* glibc 2.1 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
43 size = n+1; /* precisely what is needed */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
44 else /* glibc 2.0 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
45 size *= 2; /* twice the old size */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
46 if ((p = realloc (p, size)) == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
47 return NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
52 // Flag
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
53
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
54 #define VAL(x) (*(int*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
55
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
56 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
57 if (src == M_CONFIG_FILE) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
58 if (!strcasecmp(param, "yes") || /* any other language? */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
59 !strcasecmp(param, "ja") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
60 !strcasecmp(param, "si") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
61 !strcasecmp(param, "igen") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
62 !strcasecmp(param, "y") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
63 !strcasecmp(param, "j") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
64 !strcasecmp(param, "i") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
65 !strcmp(param, "1")) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
66 if(dst) VAL(dst) = opt->max;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
67 } else if (!strcasecmp(param, "no") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
68 !strcasecmp(param, "nein") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
69 !strcasecmp(param, "nicht") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
70 !strcasecmp(param, "nem") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
71 !strcasecmp(param, "n") ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
72 !strcmp(param, "0")) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
73 if(dst) VAL(dst) = opt->min;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
74 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
75 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
76 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
77 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
78 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
79 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
80 if(dst) VAL(dst) = opt->max;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
81 return 0;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
85 static char* print_flag(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
86 if(VAL(val) == opt->min)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
87 return strdup("no");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
88 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
89 return strdup("yes");
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
92 m_option_type_t m_option_type_flag = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
93 "Flag",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
94 "need yes or no in config files",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
95 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
96 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
97 parse_flag,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
98 print_flag,
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 copy_opt,
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 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
103 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
104
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
105 // Integer
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
106
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
107 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
108 long tmp_int;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
109 char *endptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
110 src = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
111
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
112 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
113 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
114
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
115 tmp_int = strtol(param, &endptr, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
116 if (*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
117 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
118 return M_OPT_INVALID;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
121 if ((opt->flags & M_OPT_MIN) && (tmp_int < opt->min)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
122 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
123 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
126 if ((opt->flags & M_OPT_MAX) && (tmp_int > opt->max)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
127 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
128 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
131 if(dst) VAL(dst) = tmp_int;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
132
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
133 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
136 static char* print_int(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
137 opt = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
138 return dup_printf("%d",VAL(val));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
139 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
140
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
141 m_option_type_t m_option_type_int = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
142 "Integer",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
143 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
144 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
145 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
146 parse_int,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
147 print_int,
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 copy_opt,
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 NULL
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
154 // Float
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
155
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
156 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
157 #define VAL(x) (*(float*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
158
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
159 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
160 float tmp_float;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
161 char* endptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
162 src = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
163
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
164 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
165 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
166
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
167 tmp_float = strtod(param, &endptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
168
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
169 switch(*endptr) {
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 case '/':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
172 tmp_float /= strtod(endptr+1, &endptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
173 break;
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 case ',':
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
176 /* we also handle floats specified with
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
177 * non-locale decimal point ::atmos
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
178 */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
179 if(tmp_float<0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
180 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
181 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
182 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
183 break;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
186 if (*endptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
187 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
188 "number or a ratio (numerator[:/]denominator): %s\n",name, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
189 return M_OPT_INVALID;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
192 if (opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
193 if (tmp_float < opt->min) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
194 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
195 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
198 if (opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
199 if (tmp_float > opt->max) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
200 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
201 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
204 if(dst) VAL(dst) = tmp_float;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
205 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
208 static char* print_float(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
209 opt = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
210 return dup_printf("%f",VAL(val));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
211 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
212
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
213 m_option_type_t m_option_type_float = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
214 "Float",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
215 "floating point number or ratio (numerator[:/]denominator)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
216 sizeof(float),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
217 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
218 parse_float,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
219 print_float,
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 copy_opt,
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 NULL
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
226 ///////////// Position
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
227 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
228 #define VAL(x) (*(off_t*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
229
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
230 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
231 off_t tmp_off;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
232 char dummy;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
233
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
234 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
235 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
236 if (sscanf(param, sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
237 "%d%c" : "%lld%c", &tmp_off, &dummy) != 1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
238 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
239 return M_OPT_INVALID;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
242 if (opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
243 if (tmp_off < opt->min) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
244 mp_msg(MSGT_CFGPARSER, MSGL_ERR,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
245 (sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
246 "The %s option must be >= %d: %s\n" :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
247 "The %s option must be >= %lld: %s\n"),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
248 (off_t) opt->min, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
249 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
252 if (opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
253 if (tmp_off > opt->max) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
254 mp_msg(MSGT_CFGPARSER, MSGL_ERR,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
255 (sizeof(off_t) == sizeof(int) ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
256 "The %s option must be <= %d: %s\n" :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
257 "The %s option must be <= %lld: %s\n"),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
258 (off_t) opt->max, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
259 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
260 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
261
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
262 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
263 VAL(dst) = tmp_off;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
264 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
267 static char* print_position(m_option_t* opt, void* val) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
268 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
269 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
270
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
271 m_option_type_t m_option_type_position = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
272 "Position",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
273 "Integer (off_t)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
274 sizeof(off_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
275 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
276 parse_position,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
277 print_position,
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 copy_opt,
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 NULL
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
285 ///////////// String
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
286
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
287 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
288 #define VAL(x) (*(char**)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
289
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
290 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
291
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
292
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
293 if (param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
294 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
295
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
296 if ((opt->flags & M_OPT_MIN) && (strlen(param) < opt->min)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
297 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
298 (int) opt->min, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
299 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
302 if ((opt->flags & M_OPT_MAX) && (strlen(param) > opt->max)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
303 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
304 (int) opt->max, param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
305 return M_OPT_OUT_OF_RANGE;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
308 if(dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
309 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
310 free(VAL(dst));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
311 VAL(dst) = strdup(param);
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
314 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
318 static char* print_str(m_option_t* opt, void* val) {
8168
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
319 return (val && VAL(val) && strlen(VAL(val)) > 0) ? strdup(VAL(val)) : NULL;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
320 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
321
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
322 static void copy_str(m_option_t* opt,void* dst, void* src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
323 if(dst && src) {
9177
01a713dcaf23 disable free() in string and string_list parsers. yes, it's a hack
arpi
parents: 8736
diff changeset
324 // if(VAL(dst)) free(VAL(dst)); //FIXME!!!
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
325 VAL(dst) = VAL(src) ? strdup(VAL(src)) : NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
329 static void free_str(void* src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
330 if(src && VAL(src)){
9177
01a713dcaf23 disable free() in string and string_list parsers. yes, it's a hack
arpi
parents: 8736
diff changeset
331 // free(VAL(src)); //FIXME!!!
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
332 VAL(src) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
333 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
334 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
335
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
336 m_option_type_t m_option_type_string = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
337 "String",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
338 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
339 sizeof(char*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
340 M_OPT_TYPE_DYNAMIC,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
341 parse_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
342 print_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 copy_str,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
346 free_str
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
349 //////////// String list
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
350
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
351 #define LIST_SEPARATOR ','
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
352 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
353 #define VAL(x) (*(char***)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
354
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
355 #define OP_NONE 0
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
356 #define OP_ADD 1
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
357 #define OP_PRE 2
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
358 #define OP_DEL 3
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
359 #define OP_CLR 4
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
360
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
361 static void free_str_list(void* dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
362 char** d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
363 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
364
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
365 if(!dst || !VAL(dst)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
366 d = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
367
9177
01a713dcaf23 disable free() in string and string_list parsers. yes, it's a hack
arpi
parents: 8736
diff changeset
368 // FIXME!!!
01a713dcaf23 disable free() in string and string_list parsers. yes, it's a hack
arpi
parents: 8736
diff changeset
369 // for(i = 0 ; d[i] != NULL ; i++)
01a713dcaf23 disable free() in string and string_list parsers. yes, it's a hack
arpi
parents: 8736
diff changeset
370 // free(d[i]);
01a713dcaf23 disable free() in string and string_list parsers. yes, it's a hack
arpi
parents: 8736
diff changeset
371 // free(d);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
372 VAL(dst) = NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
375 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
376 char** lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
377 int ln;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
378
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
379 if(!dst) return M_OPT_PARSER_ERR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
380 lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
381
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
382 for(ln = 0 ; lst && lst[ln] ; ln++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
383 /**/;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
384
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
385 lst = realloc(lst,(n+ln+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
386
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
387 if(pre) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
388 memmove(&lst[n],lst,(ln+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
389 memcpy(lst,add,n*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
390 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
391 memcpy(&lst[ln],add,(n+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
392
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
393 free(add);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
394
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
395 VAL(dst) = lst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
396
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
397 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
400 static int str_list_del(char** del, int n,void* dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
401 char **lst,*ep,**d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
402 int i,ln,s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
403 long idx;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
404
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
405 if(!dst) return M_OPT_PARSER_ERR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
406 lst = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
407
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
408 for(ln = 0 ; lst && lst[ln] ; ln++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
409 /**/;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
410 s = ln;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
411
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
412 for(i = 0 ; del[i] != NULL ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
413 idx = strtol(del[i], &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
414 if(*ep) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
415 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
416 free(del[i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
417 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
418 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
419 free(del[i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
420 if(idx < 0 || idx >= ln) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
421 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
422 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
423 } else if(!lst[idx])
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
424 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
425 free(lst[idx]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
426 lst[idx] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
427 s--;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
428 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
429 free(del);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
430
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
431 if(s == 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
432 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
433 VAL(dst) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
434 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
437 d = calloc(s+1,sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
438 for(i = 0, n = 0 ; i < ln ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
439 if(!lst[i]) continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
440 d[n] = lst[i];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
441 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
442 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
443 d[s] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
444
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
445 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
446 VAL(dst) = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
447
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
448 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
452 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
453 int n = 0,len = strlen(opt->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
454 char *ptr = param, *last_ptr, **res;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
455 int op = OP_NONE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
456
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
457 if(opt->name[len-1] == '*' && ((int)strlen(name) > len - 1)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
458 char* n = &name[len-1];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
459 if(strcasecmp(n,"-add") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
460 op = OP_ADD;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
461 else if(strcasecmp(n,"-pre") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
462 op = OP_PRE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
463 else if(strcasecmp(n,"-del") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
464 op = OP_DEL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
465 else if(strcasecmp(n,"-clr") == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
466 op = OP_CLR;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
467 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
468 return M_OPT_UNKNOW;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
471 // Clear the list ??
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
472 if(op == OP_CLR) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
473 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
474 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
475 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
476 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
477
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
478 // All other op need a param
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
479 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
480 return M_OPT_MISSING_PARAM;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
483 while(ptr[0] != '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
484 last_ptr = ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
485 ptr = strchr(ptr,LIST_SEPARATOR);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
486 if(!ptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
487 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
488 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
489 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
490 ptr++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
491 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
492 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
493 if(n == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
494 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
495 if( ((opt->flags & M_OPT_MIN) && (n < opt->min)) ||
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
496 ((opt->flags & M_OPT_MAX) && (n > opt->max)) )
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
497 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
498
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
499 if(!dst) return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
500
8384
7a7980b874f5 fixed 'mplayer -nosound xxx' sig11 if configfile have string list options
arpi
parents: 8262
diff changeset
501 res = malloc((n+2)*sizeof(char*));
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
502 ptr = param;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
503 n = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
504
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
505 while(1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
506 last_ptr = ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
507 ptr = strchr(ptr,LIST_SEPARATOR);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
508 if(!ptr) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
509 res[n] = strdup(last_ptr);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
510 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
511 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
512 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
513 len = ptr - last_ptr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
514 res[n] = (char*)malloc(len + 1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
515 if(len) strncpy(res[n],last_ptr,len);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
516 res[n][len] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
517 ptr++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
518 n++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
519 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
520 res[n] = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
521
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
522 switch(op) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
523 case OP_ADD:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
524 return str_list_add(res,n,dst,0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
525 case OP_PRE:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
526 return str_list_add(res,n,dst,1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
527 case OP_DEL:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
528 return str_list_del(res,n,dst);
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
531 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
532 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
533 VAL(dst) = res;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
534
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
535 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
538 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
539 int n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
540 char **d,**s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
541
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
542 if(!(dst && src)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
543 s = VAL(src);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
544
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
545 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
546 free_str_list(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
547
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
548 if(!s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
549 VAL(dst) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
550 return;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
553 for(n = 0 ; s[n] != NULL ; n++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
554 /* NOTHING */;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
555 d = (char**)malloc((n+1)*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
556 for( ; n >= 0 ; n--)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
557 d[n] = s[n] ? strdup(s[n]) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
558
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
559 VAL(dst) = d;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
562 static char* print_str_list(m_option_t* opt, void* src) {
8168
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
563 char **lst = NULL;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
564 char *ret = NULL,*last = NULL;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
565 int i;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
566
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
567 if(!(src && VAL(src))) return NULL;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
568 lst = VAL(src);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
569
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
570 for(i = 0 ; lst[i] ; i++) {
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
571 if(last) {
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
572 ret = dup_printf("%s,%s",last,lst[i]);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
573 free(last);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
574 } else
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
575 ret = strdup(lst[i]);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
576 last = ret;
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
577 }
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
578 if(last && last != ret) free(last);
ff6a98628e6c Fix the Gui with NEW_CONFIG
albeu
parents: 8164
diff changeset
579 return ret;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
580 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
581
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
582 m_option_type_t m_option_type_string_list = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
583 "String list",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
584 "A list of string separated by ','\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
585 "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
586 "\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
587 "\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
588 "\t-del : remove the entry at the given indexs\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
589 "\t-clr : clear the list\n"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
590 "e.g: -vop-add flip,mirror -vop-del 2,5\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
591 sizeof(char**),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
592 M_OPT_TYPE_DYNAMIC | M_OPT_TYPE_ALLOW_WILDCARD,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
593 parse_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
594 print_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
595 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
596 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
597 copy_str_list,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
598 free_str_list
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
599 };
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
602 /////////////////// Func based options
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
603
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
604 // 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
605 typedef struct m_func_save m_func_save_t;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
606 struct m_func_save {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
607 m_func_save_t* next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
608 char* name;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
609 char* param;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
610 };
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 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
613 #define VAL(x) (*(m_func_save_t**)(x))
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 static void free_func_pf(void* src) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
616 m_func_save_t *s,*n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
617
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
618 if(!src) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
619
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
620 s = VAL(src);
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 while(s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
623 n = s->next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
624 free(s->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
625 if(s->param) free(s->param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
626 free(s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
627 s = n;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
628 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
629 VAL(src) = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
630 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
631
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
632 // Parser for func_param and func_full
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
633 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
634 m_func_save_t *s,*p;
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 if(!dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
637 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
638
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
639 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
640 s->name = strdup(name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
641 s->param = param ? strdup(param) : NULL;
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 p = VAL(dst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
644 if(p) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
645 for( ; p->next != NULL ; p = p->next)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
646 /**/;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
647 p->next = s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
648 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
649 VAL(dst) = s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
650
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
651 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
652 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
653
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
654 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
655 m_func_save_t *d = NULL, *s,* last = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
656
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
657 if(!(dst && src)) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
658 s = VAL(src);
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 if(VAL(dst))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
661 free_func_pf(dst);
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 while(s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
664 d = (m_func_save_t*)malloc(sizeof(m_func_save_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
665 d->name = strdup(s->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
666 d->param = s->param ? strdup(s->param) : NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
667 if(last)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
668 last->next = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
669 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
670 VAL(dst) = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
671 last = d;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
672 s = s->next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
673 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
674
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
675
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
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 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
681 m_func_save_t* s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
682
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
683 if(!src) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
684 s = VAL(src);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
685
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
686 if(!s) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
687
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
688 // Revert if needed
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
689 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
690 for( ; s != NULL ; s = s->next)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
691 ((m_opt_func_param_t) opt->p)(opt,s->param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
692 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
693
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
694 m_option_type_t m_option_type_func_param = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
695 "Func param",
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 sizeof(m_func_save_t*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
698 M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
699 parse_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
700 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
701 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
702 set_func_param,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
703 copy_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
704 free_func_pf
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
705 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
706
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
707 /////////////////// Func_full
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
708
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
709 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
710 m_func_save_t* s;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
711
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
712 if(!src) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
713
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
714 for(s = VAL(src) ; s ; s = s->next) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
715 // Revert if needed
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
716 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
717 ((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
718 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
719 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
720
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
721 m_option_type_t m_option_type_func_full = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
722 "Func full",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
723 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
724 sizeof(m_func_save_t*),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
725 M_OPT_TYPE_ALLOW_WILDCARD|M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
726 parse_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
727 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
728 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
729 set_func_full,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
730 copy_func_pf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
731 free_func_pf
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
732 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
733
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
734 /////////////// Func
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
735
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
736 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
737 #define VAL(x) (*(int*)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
738
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
739 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
740 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
741 VAL(dst) += 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
742 return 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
743 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
744
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
745 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
746 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
747 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
748 for(i = 0 ; i < VAL(src) ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
749 ((m_opt_func_t) opt->p)(opt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
750 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
751
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
752 m_option_type_t m_option_type_func = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
753 "Func",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
754 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
755 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
756 M_OPT_TYPE_INDIRECT,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
757 parse_func,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
758 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
759 NULL, // Nothing to do on save
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
760 set_func,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
761 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
762 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
763 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
764
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
765 /////////////////// Print
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
766
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
767 static int parse_print(m_option_t* opt,char *name, char *param, void* dst, int src) {
8736
michael
parents: 8384
diff changeset
768 if(opt->type->flags&M_OPT_TYPE_INDIRECT)
michael
parents: 8384
diff changeset
769 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", *(char **) opt->p);
michael
parents: 8384
diff changeset
770 else
michael
parents: 8384
diff changeset
771 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s", (char *) opt->p);
michael
parents: 8384
diff changeset
772
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
773 if(opt->priv == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
774 exit(1); // Call something else instead ??
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
775 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
776 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
777
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
778 m_option_type_t m_option_type_print = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
779 "Print",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
780 "",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
781 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
782 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
783 parse_print,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
784 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
785 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
786 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
787 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
788 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
789 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
790
8736
michael
parents: 8384
diff changeset
791 m_option_type_t m_option_type_print_indirect = {
michael
parents: 8384
diff changeset
792 "Print",
michael
parents: 8384
diff changeset
793 "",
michael
parents: 8384
diff changeset
794 0,
michael
parents: 8384
diff changeset
795 M_OPT_TYPE_INDIRECT,
michael
parents: 8384
diff changeset
796 parse_print,
michael
parents: 8384
diff changeset
797 NULL,
michael
parents: 8384
diff changeset
798 NULL,
michael
parents: 8384
diff changeset
799 NULL,
michael
parents: 8384
diff changeset
800 NULL,
michael
parents: 8384
diff changeset
801 NULL
michael
parents: 8384
diff changeset
802 };
michael
parents: 8384
diff changeset
803
michael
parents: 8384
diff changeset
804
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
805 /////////////////////// Subconfig
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
806 #undef VAL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
807 #define VAL(x) (*(char***)(x))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
808
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
809 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
810 char *subparam;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
811 char *subopt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
812 int nr = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
813 m_option_t *subopts;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
814 char *token;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
815 char *p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
816 char** lst = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
817
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
818 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
819 return M_OPT_MISSING_PARAM;
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 subparam = malloc(strlen(param)+1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
822 subopt = malloc(strlen(param)+1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
823 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
824
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
825 subopts = opt->p;
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 token = strtok(p, (char *)&(":"));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
828 while(token)
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 int sscanf_ret;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
831 /* clear out */
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
832 subopt[0] = subparam[0] = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
833
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
834 sscanf_ret = sscanf(token, "%[^=]=%[^:]", subopt, subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
835
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
836 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
837 switch(sscanf_ret)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
838 {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
839 case 1:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
840 subparam[0] = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
841 case 2:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
842 if(dst) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
843 lst = (char**)realloc(lst,2 * (nr+2) * sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
844 lst[2*nr] = strdup(subopt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
845 lst[2*nr+1] = subparam[0] == 0 ? NULL : strdup(subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
846 memset(&lst[2*(nr+1)],0,2*sizeof(char*));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
847 nr++;
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 break;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
850 default:
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
851 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
852 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
853 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
854 token = strtok(NULL, (char *)&(":"));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
855 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
856
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
857 free(subparam);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
858 free(subopt);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
859 free(p);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
860 VAL(dst) = lst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
861
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
862 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
863 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
864
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
865 m_option_type_t m_option_type_subconfig = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
866 "Subconfig",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
867 "The syntax is -option opt1=foo:flag:opt2=blah",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
868 sizeof(int),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
869 M_OPT_TYPE_HAS_CHILD,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
870 parse_subconf,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
871 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
872 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
873 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
874 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
875 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
876 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
877
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
878 #include "libmpcodecs/img_format.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
879 // TODO : use an array so we parse/print easily
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
880
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
881 static int parse_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
882 uint32_t fmt = 0;
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 if (param == NULL || strlen(param) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
885 return M_OPT_MISSING_PARAM;
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 // From vf_format
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
888 if(!strcasecmp(param,"444p")) fmt=IMGFMT_444P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
889 if(!strcasecmp(param,"422p")) fmt=IMGFMT_422P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
890 if(!strcasecmp(param,"411p")) fmt=IMGFMT_411P; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
891 if(!strcasecmp(param,"yuy2")) fmt=IMGFMT_YUY2; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
892 if(!strcasecmp(param,"yv12")) fmt=IMGFMT_YV12; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
893 if(!strcasecmp(param,"i420")) fmt=IMGFMT_I420; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
894 if(!strcasecmp(param,"yvu9")) fmt=IMGFMT_YVU9; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
895 if(!strcasecmp(param,"if09")) fmt=IMGFMT_IF09; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
896 if(!strcasecmp(param,"iyuv")) fmt=IMGFMT_IYUV; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
897 if(!strcasecmp(param,"uyvy")) fmt=IMGFMT_UYVY; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
898 if(!strcasecmp(param,"bgr24")) fmt=IMGFMT_BGR24; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
899 if(!strcasecmp(param,"bgr32")) fmt=IMGFMT_BGR32; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
900 if(!strcasecmp(param,"bgr16")) fmt=IMGFMT_BGR16; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
901 if(!strcasecmp(param,"bgr15")) fmt=IMGFMT_BGR15; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
902 if(!strcasecmp(param,"bgr8")) fmt=IMGFMT_BGR8; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
903 if(!strcasecmp(param,"bgr4")) fmt=IMGFMT_BGR4; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
904 if(!strcasecmp(param,"bgr1")) fmt=IMGFMT_BGR1; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
905 if(!strcasecmp(param,"rgb24")) fmt=IMGFMT_RGB24; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
906 if(!strcasecmp(param,"rgb32")) fmt=IMGFMT_RGB32; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
907 if(!strcasecmp(param,"rgb16")) fmt=IMGFMT_RGB16; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
908 if(!strcasecmp(param,"rgb15")) fmt=IMGFMT_RGB15; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
909 if(!strcasecmp(param,"rgb8")) fmt=IMGFMT_RGB8; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
910 if(!strcasecmp(param,"rgb4")) fmt=IMGFMT_RGB4; else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
911 if(!strcasecmp(param,"rgb1")) fmt=IMGFMT_RGB1; else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
912 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
913 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
914 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
915
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
916 if(dst)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
917 *((uint32_t*)dst) = fmt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
918
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
919 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
920 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
921
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
922 m_option_type_t m_option_type_imgfmt = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
923 "Image format (aka colorspace)",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
924 "Pls report any missing colorspace",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
925 sizeof(uint32_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
926 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
927 parse_imgfmt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
928 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
929 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
930 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
931 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
932 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
933 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
934
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
935 /// Span stuff : Not finished
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
936 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
937 char *ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
938 long tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
939 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
940
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
941 memset(pos,0,sizeof(m_play_pos_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
942
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
943 if(!s || s[0] == '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
944 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
945
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
946 // Track index
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
947 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
948 if(ep != s) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
949 if(tmp < 1) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
950 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
951 return M_OPT_OUT_OF_RANGE;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
952 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
953 pos->idx = tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
954 if(ep[0] == '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
955 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
956 s = ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
957 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
958
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
959 // Span
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
960 tmp = strlen(s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
961 if(s[0] != '[' || s[tmp-1] != ']') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
962 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
963 return M_OPT_INVALID;
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 s[tmp-1] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
966 s++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
967
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
968 // hh:mm:ss
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
969 for( i = 2 ; i >= 0 && s[0] != 0 ; i--) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
970 if(s[0] == ':') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
971 tmp = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
972 s++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
973 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
974 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
975 if(tmp < 0 || (ep[0] != '\0' && ep[0] != (i > 0 ? ':' : '.') )) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
976 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
977 return M_OPT_INVALID;
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 pos->seconds += tmp * pow(60,i);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
980 s = ep;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
981 if(s[0] != '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
982 s++;
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 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
986
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
987 // sectors
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
988 if(s[0]) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
989 tmp = strtol(s, &ep, 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
990 if(tmp < 0 || ep[0] != '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
991 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
992 return M_OPT_INVALID;
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 pos->sectors = tmp;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
995 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
996
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
997 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
998 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
999
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1000
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1001 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
1002 m_span_t* span = dst;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1003 char *s = param,*e = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1004 int r = M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1005
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1006 if(param == NULL)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1007 return M_OPT_MISSING_PARAM;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1008
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1009 e = strchr(param,'-');
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1010 if(e) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1011 e[0] = '\0';
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1012 e++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1013 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1014
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1015 if(s[0] == '\0' && e[0] == '\0') {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1016 mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Option %s: invalid argument\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1017 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1018 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1019
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1020 if(s[0]) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1021 r = parse_play_pos(&span->start,name,s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1022 if(r < 0) return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1023 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1024 if(e && e[0] != '\0')
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1025 r = parse_play_pos(&span->end,name,s);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1026
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1027 return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1028 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1029
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1030 m_option_type_t m_option_type_span = {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1031 "Span",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1032 "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
1033 sizeof(m_span_t),
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1034 0,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1035 parse_span,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1036 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1037 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1038 copy_opt,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1039 NULL,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1040 NULL
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1041 };
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1042
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
1043 #endif