Mercurial > mplayer.hg
annotate m_config.c @ 34594:c20ac9b80ea5
Don't destroy list pointers while saving list items.
Use temporary pointers instead.
author | ib |
---|---|
date | Fri, 10 Feb 2012 15:06:59 +0000 |
parents | a5a0019e1c28 |
children | 389d43c448b3 |
rev | line source |
---|---|
30429
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
1 /* |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
3 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
7 * (at your option) any later version. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
8 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
13 * |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
c1a3f1bbba26
Add license header to all top-level files missing them.
diego
parents:
29263
diff
changeset
|
17 */ |
18258 | 18 |
19 /// \file | |
20 /// \ingroup Config | |
21 | |
8164 | 22 #include "config.h" |
23 | |
24 #include <stdlib.h> | |
25 #include <stdio.h> | |
26 #include <errno.h> | |
27 #include <string.h> | |
28 #ifdef MP_DEBUG | |
29 #include <assert.h> | |
30 #endif | |
31 | |
32 #include "m_config.h" | |
33 #include "m_option.h" | |
34 #include "mp_msg.h" | |
13699
11b249ef87b0
printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents:
10595
diff
changeset
|
35 #include "help_mp.h" |
8164 | 36 |
17471 | 37 #define MAX_PROFILE_DEPTH 20 |
38 | |
32301
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
39 |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
40 static int parse_profile(const m_option_t *opt, const char *name, |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
41 const char *param, void *dst, int src) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
42 { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
43 m_config_t *config = opt->priv; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
44 char **list = NULL; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
45 int i, r; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
46 if (param && !strcmp(param, "help")) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
47 m_profile_t *p; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
48 if (!config->profiles) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
49 mp_msg(MSGT_CFGPARSER, MSGL_INFO, MSGTR_NoProfileDefined); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
50 return M_OPT_EXIT-1; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
51 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
52 mp_msg(MSGT_CFGPARSER, MSGL_INFO, MSGTR_AvailableProfiles); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
53 for (p = config->profiles; p; p = p->next) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
54 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\t%s\t%s\n", p->name, |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
55 p->desc ? p->desc : ""); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
56 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\n"); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
57 return M_OPT_EXIT-1; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
58 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
59 |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
60 r = m_option_type_string_list.parse(opt, name, param, &list,src); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
61 if (r < 0) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
62 return r; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
63 if (!list || !list[0]) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
64 return M_OPT_INVALID; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
65 for (i = 0; list[i]; i++) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
66 if (!m_config_get_profile(config,list[i])) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
67 mp_msg(MSGT_CFGPARSER, MSGL_WARN, MSGTR_UnknownProfile, list[i]); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
68 r = M_OPT_INVALID; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
69 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
70 if (dst) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
71 m_option_copy(opt, dst, &list); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
72 else |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
73 m_option_free(opt, &list); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
74 return r; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
75 } |
17471 | 76 |
77 static void | |
32301
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
78 set_profile(const m_option_t *opt, void *dst, const void *src) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
79 { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
80 m_config_t *config = opt->priv; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
81 m_profile_t *p; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
82 char **list = NULL; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
83 int i; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
84 if (!src || !*(char***)src) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
85 return; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
86 m_option_copy(opt,&list,src); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
87 for (i = 0; list[i]; i++) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
88 p = m_config_get_profile(config, list[i]); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
89 if (!p) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
90 continue; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
91 m_config_set_profile(config, p); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
92 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
93 m_option_free(opt, &list); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
94 } |
17471 | 95 |
32301
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
96 static int show_profile(m_option_t *opt, char* name, char *param) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
97 { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
98 m_config_t *config = opt->priv; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
99 m_profile_t *p; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
100 int i, j; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
101 if (!param) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
102 return M_OPT_MISSING_PARAM; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
103 if (!(p = m_config_get_profile(config, param))) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
104 mp_msg(MSGT_CFGPARSER, MSGL_ERR, MSGTR_UnknownProfile, param); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
105 return M_OPT_EXIT - 1; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
106 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
107 if (!config->profile_depth) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
108 mp_msg(MSGT_CFGPARSER, MSGL_INFO, MSGTR_Profile, param, |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
109 p->desc ? p->desc : ""); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
110 config->profile_depth++; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
111 for (i = 0; i < p->num_opts; i++) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
112 char spc[config->profile_depth + 1]; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
113 for (j = 0; j < config->profile_depth; j++) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
114 spc[j] = ' '; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
115 spc[config->profile_depth] = '\0'; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
116 |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
117 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "%s%s=%s\n", spc, |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
118 p->opts[2 * i], p->opts[2 * i + 1]); |
17471 | 119 |
32301
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
120 if (config->profile_depth < MAX_PROFILE_DEPTH && |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
121 !strcmp(p->opts[2*i],"profile")) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
122 char *e, *list = p->opts[2 * i + 1]; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
123 while ((e = strchr(list, ','))) { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
124 int l = e-list; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
125 char tmp[l+1]; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
126 if (!l) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
127 continue; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
128 memcpy(tmp, list, l); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
129 tmp[l] = '\0'; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
130 show_profile(opt, name, tmp); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
131 list = e+1; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
132 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
133 if (list[0] != '\0') |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
134 show_profile(opt, name, list); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
135 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
136 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
137 config->profile_depth--; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
138 if (!config->profile_depth) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
139 mp_msg(MSGT_CFGPARSER, MSGL_INFO, "\n"); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
140 return M_OPT_EXIT - 1; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
141 } |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
142 |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
143 static int list_options(m_option_t *opt, char* name, char *param) |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
144 { |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
145 m_config_t *config = opt->priv; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
146 m_config_print_option_list(config); |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
147 return M_OPT_EXIT; |
a65635702512
cosmetics: Move some functions around to avoid ugly forward declarations.
diego
parents:
32300
diff
changeset
|
148 } |
17472
526abfe30498
Make -list-options work in both MPlayer and MEncoder.
albeu
parents:
17471
diff
changeset
|
149 |
8164 | 150 m_config_t* |
151 m_config_new(void) { | |
152 m_config_t* config; | |
25962 | 153 static int initialized = 0; |
17471 | 154 static m_option_type_t profile_opt_type; |
155 static m_option_t ref_opts[] = { | |
156 { "profile", NULL, &profile_opt_type, CONF_NOSAVE, 0, 0, NULL }, | |
157 { "show-profile", show_profile, CONF_TYPE_PRINT_FUNC, CONF_NOCFG, 0, 0, NULL }, | |
17472
526abfe30498
Make -list-options work in both MPlayer and MEncoder.
albeu
parents:
17471
diff
changeset
|
158 { "list-options", list_options, CONF_TYPE_PRINT_FUNC, CONF_NOCFG, 0, 0, NULL }, |
17471 | 159 { NULL, NULL, NULL, 0, 0, 0, NULL } |
160 }; | |
161 int i; | |
8164 | 162 |
18879 | 163 config = calloc(1,sizeof(m_config_t)); |
33479 | 164 if (!config) return NULL; |
8164 | 165 config->lvl = 1; // 0 Is the defaults |
25962 | 166 if(!initialized) { |
167 initialized = 1; | |
17471 | 168 profile_opt_type = m_option_type_string_list; |
169 profile_opt_type.parse = parse_profile; | |
170 profile_opt_type.set = set_profile; | |
171 } | |
172 config->self_opts = malloc(sizeof(ref_opts)); | |
33479 | 173 if (!config->self_opts) { |
174 free(config); | |
175 return NULL; | |
176 } | |
17471 | 177 memcpy(config->self_opts,ref_opts,sizeof(ref_opts)); |
178 for(i = 0 ; config->self_opts[i].name ; i++) | |
179 config->self_opts[i].priv = config; | |
180 m_config_register_options(config,config->self_opts); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
181 |
8164 | 182 return config; |
183 } | |
184 | |
185 void | |
186 m_config_free(m_config_t* config) { | |
187 m_config_option_t *i = config->opts, *ct; | |
188 m_config_save_slot_t *sl,*st; | |
17471 | 189 m_profile_t *p,*pn; |
190 int j; | |
8164 | 191 |
192 #ifdef MP_DEBUG | |
193 assert(config != NULL); | |
194 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
195 |
8164 | 196 while(i) { |
13824 | 197 if (i->flags & M_CFG_OPT_ALIAS) |
198 sl = NULL; | |
199 else | |
200 sl = i->slots; | |
8164 | 201 while(sl) { |
202 m_option_free(i->opt,sl->data); | |
203 st = sl->prev; | |
204 free(sl); | |
205 sl = st; | |
206 } | |
207 if(i->name != i->opt->name) | |
208 free(i->name); | |
33397 | 209 if(i->opt->p && (i->opt->type->flags & M_OPT_TYPE_DYNAMIC)) |
210 m_option_free(i->opt, i->opt->p); | |
8164 | 211 ct = i->next; |
212 free(i); | |
13824 | 213 i = ct; |
8164 | 214 } |
17471 | 215 for(p = config->profiles ; p ; p = pn) { |
216 pn = p->next; | |
217 free(p->name); | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32301
diff
changeset
|
218 free(p->desc); |
17471 | 219 for(j = 0 ; j < p->num_opts ; j++) { |
220 free(p->opts[2*j]); | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32301
diff
changeset
|
221 free(p->opts[2*j + 1]); |
17471 | 222 } |
223 free(p->opts); | |
224 free(p); | |
225 } | |
226 free(config->self_opts); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
227 free(config); |
8164 | 228 } |
229 | |
230 void | |
231 m_config_push(m_config_t* config) { | |
232 m_config_option_t *co; | |
233 m_config_save_slot_t *slot; | |
234 | |
235 #ifdef MP_DEBUG | |
236 assert(config != NULL); | |
237 assert(config->lvl > 0); | |
238 #endif | |
239 | |
240 config->lvl++; | |
241 | |
242 for(co = config->opts ; co ; co = co->next ) { | |
243 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) | |
244 continue; | |
245 if(co->opt->flags & (M_OPT_GLOBAL|M_OPT_NOSAVE)) | |
246 continue; | |
21054
7d5035aafcc6
Fix obvious typo, although the exact effect is still unclear to me, see also bug #593.
reimar
parents:
18879
diff
changeset
|
247 if((co->opt->flags & M_OPT_OLD) && !(co->flags & M_CFG_OPT_SET)) |
9912
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
248 continue; |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
249 if(co->flags & M_CFG_OPT_ALIAS) |
8164 | 250 continue; |
251 | |
252 // Update the current status | |
253 m_option_save(co->opt,co->slots->data,co->opt->p); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
254 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
255 // Allocate a new slot |
18879 | 256 slot = calloc(1,sizeof(m_config_save_slot_t) + co->opt->type->size); |
8164 | 257 slot->lvl = config->lvl; |
258 slot->prev = co->slots; | |
259 co->slots = slot; | |
260 m_option_copy(co->opt,co->slots->data,co->slots->prev->data); | |
9912
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
261 // Reset our set flag |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
262 co->flags &= ~M_CFG_OPT_SET; |
8164 | 263 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
264 |
8164 | 265 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Config pushed level is now %d\n",config->lvl); |
266 } | |
267 | |
268 void | |
269 m_config_pop(m_config_t* config) { | |
270 m_config_option_t *co; | |
271 m_config_save_slot_t *slot; | |
272 | |
273 #ifdef MP_DEBUG | |
274 assert(config != NULL); | |
275 assert(config->lvl > 1); | |
276 #endif | |
277 | |
278 for(co = config->opts ; co ; co = co->next ) { | |
279 int pop = 0; | |
280 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) | |
281 continue; | |
282 if(co->opt->flags & (M_OPT_GLOBAL|M_OPT_NOSAVE)) | |
283 continue; | |
9912
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
284 if(co->flags & M_CFG_OPT_ALIAS) |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
285 continue; |
8164 | 286 if(co->slots->lvl > config->lvl) |
13699
11b249ef87b0
printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents:
10595
diff
changeset
|
287 mp_msg(MSGT_CFGPARSER, MSGL_WARN,MSGTR_SaveSlotTooOld,config->lvl,co->slots->lvl); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
288 |
8164 | 289 while(co->slots->lvl >= config->lvl) { |
290 m_option_free(co->opt,co->slots->data); | |
291 slot = co->slots; | |
292 co->slots = slot->prev; | |
293 free(slot); | |
294 pop++; | |
295 } | |
296 if(pop) // We removed some ctx -> set the previous value | |
297 m_option_set(co->opt,co->opt->p,co->slots->data); | |
298 } | |
299 | |
300 config->lvl--; | |
301 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Config poped level=%d\n",config->lvl); | |
302 } | |
303 | |
304 static void | |
25225
51c23a18a17b
First try to mark some things in m_config correctly as const
reimar
parents:
23868
diff
changeset
|
305 m_config_add_option(m_config_t *config, const m_option_t *arg, const char* prefix) { |
8164 | 306 m_config_option_t *co; |
307 m_config_save_slot_t* sl; | |
308 | |
309 #ifdef MP_DEBUG | |
310 assert(config != NULL); | |
311 assert(config->lvl > 0); | |
312 assert(arg != NULL); | |
313 #endif | |
314 | |
315 // Allocate a new entry for this option | |
18879 | 316 co = calloc(1,sizeof(m_config_option_t) + arg->type->size); |
8164 | 317 co->opt = arg; |
318 | |
319 // Fill in the full name | |
320 if(prefix && strlen(prefix) > 0) { | |
321 int l = strlen(prefix) + 1 + strlen(arg->name) + 1; | |
23806 | 322 co->name = malloc(l); |
8164 | 323 sprintf(co->name,"%s:%s",prefix,arg->name); |
324 } else | |
325 co->name = arg->name; | |
326 | |
23868 | 327 // Option with children -> add them |
8164 | 328 if(arg->type->flags & M_OPT_TYPE_HAS_CHILD) { |
25225
51c23a18a17b
First try to mark some things in m_config correctly as const
reimar
parents:
23868
diff
changeset
|
329 const m_option_t *ol = arg->p; |
8164 | 330 int i; |
13824 | 331 co->slots = NULL; |
8164 | 332 for(i = 0 ; ol[i].name != NULL ; i++) |
333 m_config_add_option(config,&ol[i], co->name); | |
334 } else { | |
9912
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
335 m_config_option_t *i; |
23868 | 336 // Check if there is already an option pointing to this address |
9912
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
337 if(arg->p) { |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
338 for(i = config->opts ; i ; i = i->next ) { |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
339 if(i->opt->p == arg->p) { // So we don't save the same vars more than 1 time |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
340 co->slots = i->slots; |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
341 co->flags |= M_CFG_OPT_ALIAS; |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
342 break; |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
343 } |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
344 } |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
345 } |
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
346 if(!(co->flags & M_CFG_OPT_ALIAS)) { |
8164 | 347 // Allocate a slot for the defaults |
18879 | 348 sl = calloc(1,sizeof(m_config_save_slot_t) + arg->type->size); |
8164 | 349 m_option_save(arg,sl->data,(void**)arg->p); |
23868 | 350 // Hack to avoid too much trouble with dynamically allocated data : |
8164 | 351 // We always use a dynamic version |
352 if((arg->type->flags & M_OPT_TYPE_DYNAMIC) && arg->p && (*(void**)arg->p)) { | |
353 *(void**)arg->p = NULL; | |
354 m_option_set(arg,arg->p,sl->data); | |
355 } | |
356 sl->lvl = 0; | |
13824 | 357 sl->prev = NULL; |
18879 | 358 co->slots = calloc(1,sizeof(m_config_save_slot_t) + arg->type->size); |
8164 | 359 co->slots->prev = sl; |
360 co->slots->lvl = config->lvl; | |
361 m_option_copy(co->opt,co->slots->data,sl->data); | |
9912
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
362 } // !M_OPT_ALIAS |
8164 | 363 } |
364 co->next = config->opts; | |
365 config->opts = co; | |
366 } | |
367 | |
368 int | |
25225
51c23a18a17b
First try to mark some things in m_config correctly as const
reimar
parents:
23868
diff
changeset
|
369 m_config_register_options(m_config_t *config, const m_option_t *args) { |
8164 | 370 int i; |
371 | |
372 #ifdef MP_DEBUG | |
373 assert(config != NULL); | |
374 assert(config->lvl > 0); | |
375 assert(args != NULL); | |
376 #endif | |
377 | |
378 for(i = 0 ; args[i].name != NULL ; i++) | |
379 m_config_add_option(config,&args[i],NULL); | |
380 | |
381 return 1; | |
382 } | |
383 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
384 static m_config_option_t* |
32300
1ca3d798b518
Mark some function parameters that are not modified as const.
diego
parents:
30728
diff
changeset
|
385 m_config_get_co(const m_config_t *config, char *arg) { |
8164 | 386 m_config_option_t *co; |
387 | |
388 for(co = config->opts ; co ; co = co->next ) { | |
389 int l = strlen(co->name) - 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26408
diff
changeset
|
390 if((co->opt->type->flags & M_OPT_TYPE_ALLOW_WILDCARD) && |
8164 | 391 (co->name[l] == '*')) { |
392 if(strncasecmp(co->name,arg,l) == 0) | |
393 return co; | |
394 } else if(strcasecmp(co->name,arg) == 0) | |
395 return co; | |
396 } | |
397 return NULL; | |
398 } | |
399 | |
400 static int | |
32300
1ca3d798b518
Mark some function parameters that are not modified as const.
diego
parents:
30728
diff
changeset
|
401 m_config_parse_option(const m_config_t *config, char *arg, char *param, int set) { |
8164 | 402 m_config_option_t *co; |
403 int r = 0; | |
404 | |
405 #ifdef MP_DEBUG | |
406 assert(config != NULL); | |
407 assert(config->lvl > 0); | |
408 assert(arg != NULL); | |
409 #endif | |
410 | |
411 co = m_config_get_co(config,arg); | |
8892 | 412 if(!co){ |
8894 | 413 // mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Unknown option: %s\n",arg); |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
414 return M_OPT_UNKNOWN; |
8892 | 415 } |
8164 | 416 |
417 #ifdef MP_DEBUG | |
418 // This is the only mandatory function | |
419 assert(co->opt->type->parse); | |
420 #endif | |
421 | |
23868 | 422 // Check if this option isn't forbidden in the current mode |
8164 | 423 if((config->mode == M_CONFIG_FILE) && (co->opt->flags & M_OPT_NOCFG)) { |
13699
11b249ef87b0
printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents:
10595
diff
changeset
|
424 mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_InvalidCfgfileOption,arg); |
8164 | 425 return M_OPT_INVALID; |
426 } | |
427 if((config->mode == M_COMMAND_LINE) && (co->opt->flags & M_OPT_NOCMD)) { | |
13699
11b249ef87b0
printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents:
10595
diff
changeset
|
428 mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_InvalidCmdlineOption,arg); |
8164 | 429 return M_OPT_INVALID; |
430 } | |
26408
7a36d5941fd8
Replace the trivial command line preparser with a more robust version
albeu
parents:
26288
diff
changeset
|
431 // During command line preparse set only pre-parse options |
7a36d5941fd8
Replace the trivial command line preparser with a more robust version
albeu
parents:
26288
diff
changeset
|
432 // Otherwise only set pre-parse option if they were not already set. |
7a36d5941fd8
Replace the trivial command line preparser with a more robust version
albeu
parents:
26288
diff
changeset
|
433 if(((config->mode == M_COMMAND_LINE_PRE_PARSE) && |
7a36d5941fd8
Replace the trivial command line preparser with a more robust version
albeu
parents:
26288
diff
changeset
|
434 !(co->opt->flags & M_OPT_PRE_PARSE)) || |
7a36d5941fd8
Replace the trivial command line preparser with a more robust version
albeu
parents:
26288
diff
changeset
|
435 ((config->mode != M_COMMAND_LINE_PRE_PARSE) && |
7a36d5941fd8
Replace the trivial command line preparser with a more robust version
albeu
parents:
26288
diff
changeset
|
436 (co->opt->flags & M_OPT_PRE_PARSE) && (co->flags & M_CFG_OPT_SET))) |
7a36d5941fd8
Replace the trivial command line preparser with a more robust version
albeu
parents:
26288
diff
changeset
|
437 set = 0; |
8164 | 438 |
23868 | 439 // Option with children are a bit different to parse |
8164 | 440 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) { |
441 char** lst = NULL; | |
442 int i,sr; | |
443 // Parse the child options | |
9593
e9a2af584986
Add the new -vf option wich is the same as vop in reverse order.
albeu
parents:
9222
diff
changeset
|
444 r = m_option_parse(co->opt,arg,param,&lst,M_COMMAND_LINE); |
8164 | 445 // Set them now |
8894 | 446 if(r >= 0) |
8164 | 447 for(i = 0 ; lst && lst[2*i] ; i++) { |
448 int l = strlen(co->name) + 1 + strlen(lst[2*i]) + 1; | |
449 if(r >= 0) { | |
450 // Build the full name | |
451 char n[l]; | |
452 sprintf(n,"%s:%s",co->name,lst[2*i]); | |
453 sr = m_config_parse_option(config,n,lst[2*i+1],set); | |
8894 | 454 if(sr < 0){ |
10595
522afd56703c
100l to albeu for his english grammar, and 10l to me becouse I noticed that lately (my backward compatibilty macro uses M_OPT_UNKNOWN)
alex
parents:
10594
diff
changeset
|
455 if(sr == M_OPT_UNKNOWN){ |
13699
11b249ef87b0
printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents:
10595
diff
changeset
|
456 mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_InvalidSuboption,co->name,lst[2*i]); |
8894 | 457 r = M_OPT_INVALID; |
458 } else | |
9222 | 459 if(sr == M_OPT_MISSING_PARAM){ |
13699
11b249ef87b0
printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents:
10595
diff
changeset
|
460 mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_MissingSuboptionParameter,lst[2*i],co->name); |
9222 | 461 r = M_OPT_INVALID; |
462 } else | |
8894 | 463 r = sr; |
464 } | |
8164 | 465 } |
466 free(lst[2*i]); | |
467 free(lst[2*i+1]); | |
468 } | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32301
diff
changeset
|
469 free(lst); |
8164 | 470 } else |
471 r = m_option_parse(co->opt,arg,param,set ? co->slots->data : NULL,config->mode); | |
472 | |
473 // Parsing failed ? | |
474 if(r < 0) | |
475 return r; | |
476 // Set the option | |
477 if(set) { | |
478 m_option_set(co->opt,co->opt->p,co->slots->data); | |
9912
39444d65c4cb
Don't save restore all options wich point to the same variable.
albeu
parents:
9593
diff
changeset
|
479 co->flags |= M_CFG_OPT_SET; |
8164 | 480 } |
481 | |
482 return r; | |
483 } | |
484 | |
485 int | |
486 m_config_set_option(m_config_t *config, char* arg, char* param) { | |
487 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Setting %s=%s\n",arg,param); | |
488 return m_config_parse_option(config,arg,param,1); | |
489 } | |
490 | |
491 int | |
32300
1ca3d798b518
Mark some function parameters that are not modified as const.
diego
parents:
30728
diff
changeset
|
492 m_config_check_option(const m_config_t *config, char *arg, char *param) { |
9222 | 493 int r; |
8164 | 494 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Checking %s=%s\n",arg,param); |
9222 | 495 r=m_config_parse_option(config,arg,param,0); |
496 if(r==M_OPT_MISSING_PARAM){ | |
13699
11b249ef87b0
printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents:
10595
diff
changeset
|
497 mp_msg(MSGT_CFGPARSER, MSGL_ERR,MSGTR_MissingOptionParameter,arg); |
9222 | 498 return M_OPT_INVALID; |
499 } | |
500 return r; | |
8164 | 501 } |
502 | |
503 | |
25225
51c23a18a17b
First try to mark some things in m_config correctly as const
reimar
parents:
23868
diff
changeset
|
504 const m_option_t* |
32300
1ca3d798b518
Mark some function parameters that are not modified as const.
diego
parents:
30728
diff
changeset
|
505 m_config_get_option(const m_config_t *config, char *arg) { |
8164 | 506 m_config_option_t *co; |
507 | |
508 #ifdef MP_DEBUG | |
509 assert(config != NULL); | |
510 assert(config->lvl > 0); | |
511 assert(arg != NULL); | |
512 #endif | |
513 | |
514 co = m_config_get_co(config,arg); | |
515 if(co) | |
516 return co->opt; | |
517 else | |
518 return NULL; | |
519 } | |
520 | |
521 | |
522 void | |
32300
1ca3d798b518
Mark some function parameters that are not modified as const.
diego
parents:
30728
diff
changeset
|
523 m_config_print_option_list(const m_config_t *config) { |
8164 | 524 char min[50],max[50]; |
525 m_config_option_t* co; | |
526 int count = 0; | |
527 | |
528 if(!config->opts) return; | |
529 | |
17481
99c0caec4677
Fix the MSG?_FIXME and make the profiles help translatable.
albeu
parents:
17472
diff
changeset
|
530 mp_msg(MSGT_CFGPARSER, MSGL_INFO, MSGTR_OptionListHeader); |
8164 | 531 for(co = config->opts ; co ; co = co->next) { |
25225
51c23a18a17b
First try to mark some things in m_config correctly as const
reimar
parents:
23868
diff
changeset
|
532 const m_option_t* opt = co->opt; |
8164 | 533 if(opt->type->flags & M_OPT_TYPE_HAS_CHILD) continue; |
534 if(opt->flags & M_OPT_MIN) | |
535 sprintf(min,"%-8.0f",opt->min); | |
536 else | |
537 strcpy(min,"No"); | |
538 if(opt->flags & M_OPT_MAX) | |
539 sprintf(max,"%-8.0f",opt->max); | |
540 else | |
541 strcpy(max,"No"); | |
17481
99c0caec4677
Fix the MSG?_FIXME and make the profiles help translatable.
albeu
parents:
17472
diff
changeset
|
542 mp_msg(MSGT_CFGPARSER, MSGL_INFO, " %-20.20s %-15.15s %-10.10s %-10.10s %-3.3s %-3.3s %-3.3s\n", |
8164 | 543 co->name, |
544 co->opt->type->name, | |
545 min, | |
546 max, | |
547 opt->flags & CONF_GLOBAL ? "Yes" : "No", | |
548 opt->flags & CONF_NOCMD ? "No" : "Yes", | |
549 opt->flags & CONF_NOCFG ? "No" : "Yes"); | |
550 count++; | |
551 } | |
17481
99c0caec4677
Fix the MSG?_FIXME and make the profiles help translatable.
albeu
parents:
17472
diff
changeset
|
552 mp_msg(MSGT_CFGPARSER, MSGL_INFO, MSGTR_TotalOptions,count); |
8164 | 553 } |
17471 | 554 |
555 m_profile_t* | |
32300
1ca3d798b518
Mark some function parameters that are not modified as const.
diego
parents:
30728
diff
changeset
|
556 m_config_get_profile(const m_config_t *config, char *name) { |
17471 | 557 m_profile_t* p; |
558 for(p = config->profiles ; p ; p = p->next) | |
559 if(!strcmp(p->name,name)) return p; | |
560 return NULL; | |
561 } | |
562 | |
563 m_profile_t* | |
564 m_config_add_profile(m_config_t* config, char* name) { | |
565 m_profile_t* p = m_config_get_profile(config,name); | |
566 if(p) return p; | |
567 p = calloc(1,sizeof(m_profile_t)); | |
568 p->name = strdup(name); | |
569 p->next = config->profiles; | |
570 config->profiles = p; | |
571 return p; | |
572 } | |
573 | |
574 void | |
575 m_profile_set_desc(m_profile_t* p, char* desc) { | |
32511
b39155e98ac3
Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents:
32301
diff
changeset
|
576 free(p->desc); |
17471 | 577 p->desc = desc ? strdup(desc) : NULL; |
578 } | |
579 | |
580 int | |
581 m_config_set_profile_option(m_config_t* config, m_profile_t* p, | |
582 char* name, char* val) { | |
583 int i = m_config_check_option(config,name,val); | |
584 if(i < 0) return i; | |
585 if(p->opts) p->opts = realloc(p->opts,2*(p->num_opts+2)*sizeof(char*)); | |
586 else p->opts = malloc(2*(p->num_opts+2)*sizeof(char*)); | |
587 p->opts[p->num_opts*2] = strdup(name); | |
588 p->opts[p->num_opts*2+1] = val ? strdup(val) : NULL; | |
589 p->num_opts++; | |
590 p->opts[p->num_opts*2] = p->opts[p->num_opts*2+1] = NULL; | |
17856 | 591 return 1; |
17471 | 592 } |
593 | |
25634 | 594 void |
17471 | 595 m_config_set_profile(m_config_t* config, m_profile_t* p) { |
596 int i; | |
597 if(config->profile_depth > MAX_PROFILE_DEPTH) { | |
18335 | 598 mp_msg(MSGT_CFGPARSER, MSGL_WARN, MSGTR_ProfileInclusionTooDeep); |
17471 | 599 return; |
600 } | |
601 config->profile_depth++; | |
602 for(i = 0 ; i < p->num_opts ; i++) | |
603 m_config_set_option(config,p->opts[2*i],p->opts[2*i+1]); | |
604 config->profile_depth--; | |
605 } |