annotate m_config.c @ 9593:e9a2af584986

Add the new -vf option wich is the same as vop in reverse order. Syntax is we decided, so you can give the nomes or not with both vop and vf. vf take precedence over vop.
author albeu
date Sat, 15 Mar 2003 18:01:02 +0000
parents d3da9b617aa8
children 39444d65c4cb
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 <stdio.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
8 #include <errno.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
9 #include <string.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
10 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
11 #include <assert.h>
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
12 #endif
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
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 "m_option.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
17 #include "mp_msg.h"
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
18
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
19 m_config_t*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
20 m_config_new(void) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
21 m_config_t* config;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
22
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
23 config = (m_config_t*)calloc(1,sizeof(m_config_t));
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
24 config->lvl = 1; // 0 Is the defaults
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
25 return config;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
26 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
27
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
28 void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
29 m_config_free(m_config_t* config) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
30 m_config_option_t *i = config->opts, *ct;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
31 m_config_save_slot_t *sl,*st;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
32
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
33 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
34 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
35 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
36
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
37 while(i) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
38 sl = i->slots;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
39 while(sl) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
40 m_option_free(i->opt,sl->data);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
41 st = sl->prev;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
42 free(sl);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
43 sl = st;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
44 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
45 if(i->name != i->opt->name)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
46 free(i->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
47 ct = i->next;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
48 free(i);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
49 ct = i;
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 free(config);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
52 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
53
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
54 void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
55 m_config_push(m_config_t* config) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
56 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
57 m_config_save_slot_t *slot;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
58
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
59 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
60 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
61 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
62 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
63
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
64 config->lvl++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
65
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
66 for(co = config->opts ; co ; co = co->next ) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
67 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
68 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
69 if(co->opt->flags & (M_OPT_GLOBAL|M_OPT_NOSAVE))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
70 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
71 if((co->opt->flags & M_OPT_OLD) && !co->flags)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
72 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
73
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
74 // Update the current status
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
75 m_option_save(co->opt,co->slots->data,co->opt->p);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
76
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
77 // Allocate a new slot
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
78 slot = (m_config_save_slot_t*)calloc(1,sizeof(m_config_save_slot_t) + co->opt->type->size);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
79 slot->lvl = config->lvl;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
80 slot->prev = co->slots;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
81 co->slots = slot;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
82 m_option_copy(co->opt,co->slots->data,co->slots->prev->data);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
83 // Reset our flags
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
84 co->flags=0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
85 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
86
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
87 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Config pushed level is now %d\n",config->lvl);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
88 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
89
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
90 void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
91 m_config_pop(m_config_t* config) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
92 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
93 m_config_save_slot_t *slot;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
94
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
95 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
96 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
97 assert(config->lvl > 1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
98 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
99
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
100 for(co = config->opts ; co ; co = co->next ) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
101 int pop = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
102 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
103 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
104 if(co->opt->flags & (M_OPT_GLOBAL|M_OPT_NOSAVE))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
105 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
106 if(co->slots->lvl > config->lvl)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
107 mp_msg(MSGT_CFGPARSER, MSGL_WARN,"Too old save slot found from lvl %d : %d !!!\n",config->lvl,co->slots->lvl);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
108
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
109 while(co->slots->lvl >= config->lvl) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
110 m_option_free(co->opt,co->slots->data);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
111 slot = co->slots;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
112 co->slots = slot->prev;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
113 free(slot);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
114 pop++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
115 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
116 if(pop) // We removed some ctx -> set the previous value
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
117 m_option_set(co->opt,co->opt->p,co->slots->data);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
118 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
119
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
120 config->lvl--;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
121 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Config poped level=%d\n",config->lvl);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
122 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
123
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
124 static void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
125 m_config_add_option(m_config_t *config, m_option_t *arg, char* prefix) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
126 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
127 m_config_save_slot_t* sl;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
128
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
129 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
130 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
131 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
132 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
133 #endif
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 // Allocate a new entry for this option
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
136 co = (m_config_option_t*)calloc(1,sizeof(m_config_option_t) + arg->type->size);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
137 co->opt = arg;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
138
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
139 // Fill in the full name
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
140 if(prefix && strlen(prefix) > 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
141 int l = strlen(prefix) + 1 + strlen(arg->name) + 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
142 co->name = (char*) malloc(l);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
143 sprintf(co->name,"%s:%s",prefix,arg->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
144 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
145 co->name = arg->name;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
146
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
147 // Option with childs -> add them
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
148 if(arg->type->flags & M_OPT_TYPE_HAS_CHILD) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
149 m_option_t *ol = arg->p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
150 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
151 for(i = 0 ; ol[i].name != NULL ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
152 m_config_add_option(config,&ol[i], co->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
153 } else {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
154 // Allocate a slot for the defaults
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
155 sl = (m_config_save_slot_t*)calloc(1,sizeof(m_config_save_slot_t) + arg->type->size);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
156 m_option_save(arg,sl->data,(void**)arg->p);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
157 // Hack to avoid too much trouble with dynamicly allocated data :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
158 // We always use a dynamic version
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
159 if((arg->type->flags & M_OPT_TYPE_DYNAMIC) && arg->p && (*(void**)arg->p)) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
160 *(void**)arg->p = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
161 m_option_set(arg,arg->p,sl->data);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
162 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
163 sl->lvl = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
164 co->slots = (m_config_save_slot_t*)calloc(1,sizeof(m_config_save_slot_t) + arg->type->size);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
165 co->slots->prev = sl;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
166 co->slots->lvl = config->lvl;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
167 m_option_copy(co->opt,co->slots->data,sl->data);
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 co->next = config->opts;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
170 config->opts = co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
171 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
172
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
173 int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
174 m_config_register_options(m_config_t *config, m_option_t *args) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
175 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
176
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
177 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
178 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
179 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
180 assert(args != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
181 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
182
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
183 for(i = 0 ; args[i].name != NULL ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
184 m_config_add_option(config,&args[i],NULL);
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 return 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
187 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
188
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
189 static m_config_option_t*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
190 m_config_get_co(m_config_t *config, char* arg) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
191 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
192
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
193 for(co = config->opts ; co ; co = co->next ) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
194 int l = strlen(co->name) - 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
195 if((co->opt->type->flags & M_OPT_TYPE_ALLOW_WILDCARD) &&
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
196 (co->name[l] == '*')) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
197 if(strncasecmp(co->name,arg,l) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
198 return co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
199 } else if(strcasecmp(co->name,arg) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
200 return co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
201 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
202 return NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
205 static int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
206 m_config_parse_option(m_config_t *config, char* arg, char* param,int set) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
207 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
208 int r = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
209
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
210 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
211 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
212 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
213 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
214 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
215
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
216 co = m_config_get_co(config,arg);
8892
06843e67a04b print meaningful error message
arpi
parents: 8512
diff changeset
217 if(!co){
8894
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
218 // mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Unknown option: %s\n",arg);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
219 return M_OPT_UNKNOW;
8892
06843e67a04b print meaningful error message
arpi
parents: 8512
diff changeset
220 }
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
221
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
222 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
223 // This is the only mandatory function
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
224 assert(co->opt->type->parse);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
225 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
226
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
227 // Check if this option isn't forbiden in the current mode
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
228 if((config->mode == M_CONFIG_FILE) && (co->opt->flags & M_OPT_NOCFG)) {
8512
9c784bd027ad 10l fix by eviv bulgroz <ebulgroz@yahoo.com>
arpi
parents: 8164
diff changeset
229 mp_msg(MSGT_CFGPARSER, MSGL_ERR,"The %s option can't be used in a config file\n",arg);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
230 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
231 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
232 if((config->mode == M_COMMAND_LINE) && (co->opt->flags & M_OPT_NOCMD)) {
8512
9c784bd027ad 10l fix by eviv bulgroz <ebulgroz@yahoo.com>
arpi
parents: 8164
diff changeset
233 mp_msg(MSGT_CFGPARSER, MSGL_ERR,"The %s option can't be used on the command line\n",arg);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
234 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
235 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
236
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
237 // Option with childs are a bit different to parse
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
238 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
239 char** lst = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
240 int i,sr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
241 // 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
242 r = m_option_parse(co->opt,arg,param,&lst,M_COMMAND_LINE);
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
243 // Set them now
8894
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
244 if(r >= 0)
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
245 for(i = 0 ; lst && lst[2*i] ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
246 int l = strlen(co->name) + 1 + strlen(lst[2*i]) + 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
247 if(r >= 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
248 // Build the full name
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
249 char n[l];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
250 sprintf(n,"%s:%s",co->name,lst[2*i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
251 sr = m_config_parse_option(config,n,lst[2*i+1],set);
8894
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
252 if(sr < 0){
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
253 if(sr == M_OPT_UNKNOW){
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
254 mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Error: option '%s' has no suboption '%s'\n",co->name,lst[2*i]);
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
255 r = M_OPT_INVALID;
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
256 } else
9222
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
257 if(sr == M_OPT_MISSING_PARAM){
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
258 mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Error: suboption '%s' of '%s' must have a parameter!\n",lst[2*i],co->name);
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
259 r = M_OPT_INVALID;
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
260 } else
8894
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
261 r = sr;
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
262 }
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
263 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
264 free(lst[2*i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
265 free(lst[2*i+1]);
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 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
268 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
269 r = m_option_parse(co->opt,arg,param,set ? co->slots->data : NULL,config->mode);
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 // Parsing failed ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
272 if(r < 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
273 return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
274 // Set the option
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
275 if(set) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
276 m_option_set(co->opt,co->opt->p,co->slots->data);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
277 co->flags = 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
278 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
279
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
280 return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
281 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
282
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
283 int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
284 m_config_set_option(m_config_t *config, char* arg, char* param) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
285 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Setting %s=%s\n",arg,param);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
286 return m_config_parse_option(config,arg,param,1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
287 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
288
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
289 int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
290 m_config_check_option(m_config_t *config, char* arg, char* param) {
9222
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
291 int r;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
292 mp_msg(MSGT_CFGPARSER, MSGL_DBG2,"Checking %s=%s\n",arg,param);
9222
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
293 r=m_config_parse_option(config,arg,param,0);
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
294 if(r==M_OPT_MISSING_PARAM){
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
295 mp_msg(MSGT_CFGPARSER, MSGL_ERR,"Error: option '%s' must have a parameter!\n",arg);
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
296 return M_OPT_INVALID;
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
297 }
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
298 return r;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
299 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
300
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
301
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
302 m_option_t*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
303 m_config_get_option(m_config_t *config, char* arg) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
304 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
305
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
306 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
307 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
308 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
309 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
310 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
311
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
312 co = m_config_get_co(config,arg);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
313 if(co)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
314 return co->opt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
315 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
316 return NULL;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
319 void*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
320 m_config_get_option_ptr(m_config_t *config, char* arg) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
321 m_option_t* conf;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
322
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
323 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
324 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
325 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
326 #endif
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 conf = m_config_get_option(config,arg);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
329 if(!conf) return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
330 return conf->p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
331 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
332
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
333 void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
334 m_config_print_option_list(m_config_t *config) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
335 char min[50],max[50];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
336 m_config_option_t* co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
337 int count = 0;
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 if(!config->opts) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
340
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
341 printf("\n Name Type Min Max Global CL Cfg\n\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
342 for(co = config->opts ; co ; co = co->next) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
343 m_option_t* opt = co->opt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
344 if(opt->type->flags & M_OPT_TYPE_HAS_CHILD) continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
345 if(opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
346 sprintf(min,"%-8.0f",opt->min);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
347 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
348 strcpy(min,"No");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
349 if(opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
350 sprintf(max,"%-8.0f",opt->max);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
351 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
352 strcpy(max,"No");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
353 printf(" %-20.20s %-15.15s %-10.10s %-10.10s %-3.3s %-3.3s %-3.3s\n",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
354 co->name,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
355 co->opt->type->name,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
356 min,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
357 max,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
358 opt->flags & CONF_GLOBAL ? "Yes" : "No",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
359 opt->flags & CONF_NOCMD ? "No" : "Yes",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
360 opt->flags & CONF_NOCFG ? "No" : "Yes");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
361 count++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
362 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
363 printf("\nTotal: %d options\n",count);
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
366 #endif // NEW_CONFIG