annotate m_config.c @ 10252:d275152390ee

I've found some time to implement the encoding support for the new DivX API. Now it's possible to play and encode movies with the latest DivX release. One thing that doesn't work is the new Video Buffer Verifier (VBV) multipass encoding. The encoder segfaults. Maybe it just isn't supported with the standard profile of the released binary encoder. Andreas Hess <jaska@gmx.net>
author arpi
date Fri, 06 Jun 2003 19:57:37 +0000
parents 39444d65c4cb
children 57bdcdb061d7
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;
9912
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
71 if((co->opt->flags & M_OPT_OLD) && !(co->flags && M_CFG_OPT_SET))
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
72 continue;
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
73 if(co->flags & M_CFG_OPT_ALIAS)
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
74 continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
75
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
76 // Update the current status
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
77 m_option_save(co->opt,co->slots->data,co->opt->p);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
78
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
79 // Allocate a new slot
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
80 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
81 slot->lvl = config->lvl;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
82 slot->prev = co->slots;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
83 co->slots = slot;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
84 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
85 // Reset our set flag
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
86 co->flags &= ~M_CFG_OPT_SET;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
87 }
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 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
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 void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
93 m_config_pop(m_config_t* config) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
94 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
95 m_config_save_slot_t *slot;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
96
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
97 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
98 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
99 assert(config->lvl > 1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
100 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
101
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
102 for(co = config->opts ; co ; co = co->next ) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
103 int pop = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
104 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD)
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->opt->flags & (M_OPT_GLOBAL|M_OPT_NOSAVE))
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
107 continue;
9912
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
108 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
109 continue;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
110 if(co->slots->lvl > config->lvl)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
111 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
112
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
113 while(co->slots->lvl >= config->lvl) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
114 m_option_free(co->opt,co->slots->data);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
115 slot = co->slots;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
116 co->slots = slot->prev;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
117 free(slot);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
118 pop++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
119 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
120 if(pop) // We removed some ctx -> set the previous value
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
121 m_option_set(co->opt,co->opt->p,co->slots->data);
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 config->lvl--;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
125 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
126 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
127
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
128 static void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
129 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
130 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
131 m_config_save_slot_t* sl;
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 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
134 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
135 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
136 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
137 #endif
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 // Allocate a new entry for this option
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
140 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
141 co->opt = arg;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
142
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
143 // Fill in the full name
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
144 if(prefix && strlen(prefix) > 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
145 int l = strlen(prefix) + 1 + strlen(arg->name) + 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
146 co->name = (char*) malloc(l);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
147 sprintf(co->name,"%s:%s",prefix,arg->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
148 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
149 co->name = arg->name;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
150
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
151 // Option with childs -> add them
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
152 if(arg->type->flags & M_OPT_TYPE_HAS_CHILD) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
153 m_option_t *ol = arg->p;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
154 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
155 for(i = 0 ; ol[i].name != NULL ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
156 m_config_add_option(config,&ol[i], co->name);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
157 } else {
9912
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
158 m_config_option_t *i;
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
159 // Check if there is alredy an option pointing to this address
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
160 if(arg->p) {
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
161 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
162 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
163 co->slots = i->slots;
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
164 co->flags |= M_CFG_OPT_ALIAS;
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
165 break;
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
166 }
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
167 }
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
168 }
39444d65c4cb Don't save restore all options wich point to the same variable.
albeu
parents: 9593
diff changeset
169 if(!(co->flags & M_CFG_OPT_ALIAS)) {
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
170 // Allocate a slot for the defaults
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
171 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
172 m_option_save(arg,sl->data,(void**)arg->p);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
173 // Hack to avoid too much trouble with dynamicly allocated data :
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
174 // We always use a dynamic version
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
175 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
176 *(void**)arg->p = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
177 m_option_set(arg,arg->p,sl->data);
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 sl->lvl = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
180 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
181 co->slots->prev = sl;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
182 co->slots->lvl = config->lvl;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
183 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
184 } // !M_OPT_ALIAS
8164
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 co->next = config->opts;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
187 config->opts = co;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
190 int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
191 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
192 int i;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
193
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
194 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
195 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
196 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
197 assert(args != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
198 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
199
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
200 for(i = 0 ; args[i].name != NULL ; i++)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
201 m_config_add_option(config,&args[i],NULL);
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 return 1;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
206 static m_config_option_t*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
207 m_config_get_co(m_config_t *config, char* arg) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
208 m_config_option_t *co;
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 for(co = config->opts ; co ; co = co->next ) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
211 int l = strlen(co->name) - 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
212 if((co->opt->type->flags & M_OPT_TYPE_ALLOW_WILDCARD) &&
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
213 (co->name[l] == '*')) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
214 if(strncasecmp(co->name,arg,l) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
215 return co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
216 } else if(strcasecmp(co->name,arg) == 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
217 return co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
218 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
219 return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
220 }
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 static int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
223 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
224 m_config_option_t *co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
225 int r = 0;
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 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
228 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
229 assert(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
230 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
231 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
232
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
233 co = m_config_get_co(config,arg);
8892
06843e67a04b print meaningful error message
arpi
parents: 8512
diff changeset
234 if(!co){
8894
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
235 // 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
236 return M_OPT_UNKNOW;
8892
06843e67a04b print meaningful error message
arpi
parents: 8512
diff changeset
237 }
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
238
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
239 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
240 // This is the only mandatory function
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
241 assert(co->opt->type->parse);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
242 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
243
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
244 // Check if this option isn't forbiden in the current mode
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
245 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
246 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
247 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
248 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
249 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
250 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
251 return M_OPT_INVALID;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
252 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
253
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
254 // Option with childs are a bit different to parse
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
255 if(co->opt->type->flags & M_OPT_TYPE_HAS_CHILD) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
256 char** lst = NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
257 int i,sr;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
258 // 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
259 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
260 // Set them now
8894
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
261 if(r >= 0)
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
262 for(i = 0 ; lst && lst[2*i] ; i++) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
263 int l = strlen(co->name) + 1 + strlen(lst[2*i]) + 1;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
264 if(r >= 0) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
265 // Build the full name
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
266 char n[l];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
267 sprintf(n,"%s:%s",co->name,lst[2*i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
268 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
269 if(sr < 0){
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
270 if(sr == M_OPT_UNKNOW){
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
271 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
272 r = M_OPT_INVALID;
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
273 } else
9222
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
274 if(sr == M_OPT_MISSING_PARAM){
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
275 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
276 r = M_OPT_INVALID;
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
277 } else
8894
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
278 r = sr;
e6a83b140b39 better error handling for invalud suboptions
arpi
parents: 8892
diff changeset
279 }
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
280 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
281 free(lst[2*i]);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
282 free(lst[2*i+1]);
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 if(lst) free(lst);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
285 } else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
286 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
287
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
288 // Parsing failed ?
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
289 if(r < 0)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
290 return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
291 // Set the option
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
292 if(set) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
293 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
294 co->flags |= M_CFG_OPT_SET;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
295 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
296
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
297 return r;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
298 }
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 int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
301 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
302 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
303 return m_config_parse_option(config,arg,param,1);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
304 }
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 int
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
307 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
308 int r;
8164
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
309 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
310 r=m_config_parse_option(config,arg,param,0);
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
311 if(r==M_OPT_MISSING_PARAM){
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
312 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
313 return M_OPT_INVALID;
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
314 }
d3da9b617aa8 print meaningful error message for missing parameter
arpi
parents: 8894
diff changeset
315 return r;
8164
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
319 m_option_t*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
320 m_config_get_option(m_config_t *config, char* arg) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
321 m_config_option_t *co;
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(config->lvl > 0);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
326 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
327 #endif
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 co = m_config_get_co(config,arg);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
330 if(co)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
331 return co->opt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
332 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
333 return NULL;
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 void*
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
337 m_config_get_option_ptr(m_config_t *config, char* arg) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
338 m_option_t* conf;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
339
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
340 #ifdef MP_DEBUG
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
341 assert(config != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
342 assert(arg != NULL);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
343 #endif
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
344
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
345 conf = m_config_get_option(config,arg);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
346 if(!conf) return NULL;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
347 return conf->p;
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
350 void
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
351 m_config_print_option_list(m_config_t *config) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
352 char min[50],max[50];
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
353 m_config_option_t* co;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
354 int count = 0;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
355
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
356 if(!config->opts) return;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
357
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
358 printf("\n Name Type Min Max Global CL Cfg\n\n");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
359 for(co = config->opts ; co ; co = co->next) {
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
360 m_option_t* opt = co->opt;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
361 if(opt->type->flags & M_OPT_TYPE_HAS_CHILD) continue;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
362 if(opt->flags & M_OPT_MIN)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
363 sprintf(min,"%-8.0f",opt->min);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
364 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
365 strcpy(min,"No");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
366 if(opt->flags & M_OPT_MAX)
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
367 sprintf(max,"%-8.0f",opt->max);
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
368 else
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
369 strcpy(max,"No");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
370 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
371 co->name,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
372 co->opt->type->name,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
373 min,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
374 max,
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
375 opt->flags & CONF_GLOBAL ? "Yes" : "No",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
376 opt->flags & CONF_NOCMD ? "No" : "Yes",
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
377 opt->flags & CONF_NOCFG ? "No" : "Yes");
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
378 count++;
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
379 }
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
380 printf("\nTotal: %d options\n",count);
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
487cfc28525d New config system + cleanup of header inter dependency
albeu
parents:
diff changeset
383 #endif // NEW_CONFIG