vlc_configuration.h 18.6 KB
Newer Older
gbazin's avatar
   
gbazin committed
1
2
3
4
5
/*****************************************************************************
 * configuration.h : configuration management module
 * This file describes the programming interface for the configuration module.
 * It includes functions allowing to declare, get or set configuration options.
 *****************************************************************************
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
6
 * Copyright (C) 1999-2006 the VideoLAN team
7
 * $Id$
gbazin's avatar
   
gbazin committed
8
 *
9
 * Authors: Gildas Bazin <gbazin@videolan.org>
gbazin's avatar
   
gbazin committed
10
11
12
13
14
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
zorglub's avatar
zorglub committed
15
 *
gbazin's avatar
   
gbazin committed
16
17
18
19
20
21
22
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
dionoea's avatar
dionoea committed
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
gbazin's avatar
   
gbazin committed
24
25
 *****************************************************************************/

zorglub's avatar
zorglub committed
26
27
28
29
# ifdef __cplusplus
extern "C" {
# endif

gbazin's avatar
   
gbazin committed
30
31
32
33
/*****************************************************************************
 * Macros used to build the configuration structure.
 *****************************************************************************/

gbazin's avatar
   
gbazin committed
34
/* Configuration hint types */
zorglub's avatar
zorglub committed
35
36


gbazin's avatar
   
gbazin committed
37
38
39
40
#define CONFIG_HINT_CATEGORY                0x0002  /* Start of new category */
#define CONFIG_HINT_SUBCATEGORY             0x0003  /* Start of sub-category */
#define CONFIG_HINT_SUBCATEGORY_END         0x0004  /* End of sub-category */
#define CONFIG_HINT_USAGE                   0x0005  /* Usage information */
gbazin's avatar
   
gbazin committed
41

zorglub's avatar
zorglub committed
42
43
44
45
#define CONFIG_CATEGORY                     0x0006 /* Set category */
#define CONFIG_SUBCATEGORY                  0x0007 /* Set subcategory */
#define CONFIG_SECTION                      0x0008 /* Start of new section */

gbazin's avatar
   
gbazin committed
46
#define CONFIG_HINT                         0x000F
gbazin's avatar
   
gbazin committed
47
48

/* Configuration item types */
gbazin's avatar
   
gbazin committed
49
50
51
52
53
54
#define CONFIG_ITEM_STRING                  0x0010  /* String option */
#define CONFIG_ITEM_FILE                    0x0020  /* File option */
#define CONFIG_ITEM_MODULE                  0x0030  /* Module option */
#define CONFIG_ITEM_INTEGER                 0x0040  /* Integer option */
#define CONFIG_ITEM_BOOL                    0x0050  /* Bool option */
#define CONFIG_ITEM_FLOAT                   0x0060  /* Float option */
gbazin's avatar
   
gbazin committed
55
#define CONFIG_ITEM_DIRECTORY               0x0070  /* Directory option */
56
#define CONFIG_ITEM_KEY                     0x0080  /* Hot key option */
57
58
59
#define CONFIG_ITEM_MODULE_CAT              0x0090  /* Module option */
#define CONFIG_ITEM_MODULE_LIST             0x00A0  /* Module option */
#define CONFIG_ITEM_MODULE_LIST_CAT         0x00B0  /* Module option */
gbazin's avatar
   
gbazin committed
60

gbazin's avatar
   
gbazin committed
61
#define CONFIG_ITEM                         0x00F0
gbazin's avatar
   
gbazin committed
62

63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* Item types that use a string value (i.e. serialized in the module cache) */
#define CONFIG_STRING_TYPES \
    { \
        CONFIG_ITEM_STRING, CONFIG_ITEM_FILE, CONFIG_ITEM_MODULE, \
        CONFIG_ITEM_DIRECTORY, CONFIG_ITEM_MODULE_CAT, \
        CONFIG_ITEM_MODULE_LIST, CONFIG_ITEM_MODULE_LIST_CAT \
    }

static inline int IsConfigStringType (int type)
{
    const unsigned char config_string_types[] = CONFIG_STRING_TYPES;

    /* NOTE: this needs to be changed if we ever get more than 255 types */
    return memchr (config_string_types, type, sizeof (config_string_types))
            != NULL;
}

static inline int IsConfigIntegerType (int type)
{
    return (type == CONFIG_ITEM_INTEGER) || (type == CONFIG_ITEM_KEY)
        || (type == CONFIG_ITEM_BOOL);
}

static inline int IsConfigFloatType (int type)
{
    return type == CONFIG_ITEM_FLOAT;
}

zorglub's avatar
zorglub committed
91
92
93
94
95
/*******************************************************************
 * All predefined categories and subcategories
 *******************************************************************/
#define CAT_INTERFACE 1
   #define SUBCAT_INTERFACE_GENERAL 101
zorglub's avatar
zorglub committed
96
97
98
   #define SUBCAT_INTERFACE_MAIN 102
   #define SUBCAT_INTERFACE_CONTROL 103
   #define SUBCAT_INTERFACE_HOTKEYS 104
zorglub's avatar
zorglub committed
99
100
101
102
103
104
105
106
107
108
109
110
111
112

#define CAT_AUDIO 2
   #define SUBCAT_AUDIO_GENERAL 201
   #define SUBCAT_AUDIO_AOUT 202
   #define SUBCAT_AUDIO_AFILTER 203
   #define SUBCAT_AUDIO_VISUAL 204
   #define SUBCAT_AUDIO_MISC 205

#define CAT_VIDEO 3
   #define SUBCAT_VIDEO_GENERAL 301
   #define SUBCAT_VIDEO_VOUT 302
   #define SUBCAT_VIDEO_VFILTER 303
   #define SUBCAT_VIDEO_TEXT 304
   #define SUBCAT_VIDEO_SUBPIC 305
113
   #define SUBCAT_VIDEO_VFILTER2 306
zorglub's avatar
zorglub committed
114
115

#define CAT_INPUT 4
116
117
118
119
120
121
122
   #define SUBCAT_INPUT_GENERAL 401
   #define SUBCAT_INPUT_ACCESS 402
   #define SUBCAT_INPUT_ACCESS_FILTER 403
   #define SUBCAT_INPUT_DEMUX 404
   #define SUBCAT_INPUT_VCODEC 405
   #define SUBCAT_INPUT_ACODEC 406
   #define SUBCAT_INPUT_SCODEC 407
zorglub's avatar
zorglub committed
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

#define CAT_SOUT 5
   #define SUBCAT_SOUT_GENERAL 501
   #define SUBCAT_SOUT_STREAM 502
   #define SUBCAT_SOUT_MUX 503
   #define SUBCAT_SOUT_ACO 504
   #define SUBCAT_SOUT_PACKETIZER 505
   #define SUBCAT_SOUT_SAP 506
   #define SUBCAT_SOUT_VOD 507

#define CAT_ADVANCED 6
   #define SUBCAT_ADVANCED_CPU 601
   #define SUBCAT_ADVANCED_MISC 602
   #define SUBCAT_ADVANCED_NETWORK 603
   #define SUBCAT_ADVANCED_XML 604

#define CAT_PLAYLIST 7
   #define SUBCAT_PLAYLIST_GENERAL 701
   #define SUBCAT_PLAYLIST_SD 702
   #define SUBCAT_PLAYLIST_EXPORT 703

struct config_category_t
{
    int         i_id;
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
147
148
    const char *psz_name;
    const char *psz_help;
zorglub's avatar
zorglub committed
149
150
};

151
152
153
154
155
156
157
158
159
160
161
162
163
typedef union
{
    const char *psz;
    int         i;
    float       f;
} module_value_t;

typedef union
{
    int         i;
    float       f;
} module_nvalue_t;

164
struct module_config_t
gbazin's avatar
   
gbazin committed
165
{
Sam Hocevar's avatar
   
Sam Hocevar committed
166
    int          i_type;                               /* Configuration type */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
167
168
    const char  *psz_type;                          /* Configuration subtype */
    const char  *psz_name;                                    /* Option name */
Sam Hocevar's avatar
   
Sam Hocevar committed
169
    char         i_short;                      /* Optional short option name */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
170
171
    const char  *psz_text;      /* Short comment on the configuration option */
    const char  *psz_longtext;   /* Long comment on the configuration option */
172
173
174
175
176
    module_value_t value;                                    /* Option value */
    module_value_t orig;
    module_value_t saved;
    module_nvalue_t min;
    module_nvalue_t max;
gbazin's avatar
   
gbazin committed
177

178
    /* Function to call when commiting a change */
gbazin's avatar
   
gbazin committed
179
180
    vlc_callback_t pf_callback;
    void          *p_callback_data;
181

182
    /* Values list */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
183
    const char **ppsz_list;        /* List of possible values for the option */
184
    int         *pi_list;          /* Idem for integers */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
185
    const char **ppsz_list_text;   /* Friendly names for list values */
186
    int          i_list;           /* Options list size */
gbazin's avatar
   
gbazin committed
187

188
189
    /* Actions list */
    vlc_callback_t *ppf_action;    /* List of possible actions for a config */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
190
    const char    **ppsz_action_text;         /* Friendly names for actions */
191
192
193
    int            i_action;                            /* actions list size */

    /* Misc */
gbazin's avatar
   
gbazin committed
194
    vlc_mutex_t *p_lock;            /* Lock to use when modifying the config */
195
    vlc_bool_t   b_dirty;          /* Dirty flag to indicate a config change */
gbazin's avatar
   
gbazin committed
196
    vlc_bool_t   b_advanced;          /* Flag to indicate an advanced option */
dionoea's avatar
dionoea committed
197
    vlc_bool_t   b_internal;   /* Flag to indicate option is not to be shown */
198
199
    vlc_bool_t   b_restart;    /* Flag to indicate the option need a restart */
                               /* to take effect */
gbazin's avatar
   
gbazin committed
200

201
202
203
    /* Deprecated */
    const char    *psz_current;   /* Good option name */
    vlc_bool_t     b_strict;      /* Transitionnal or strict */
204
205
206

    /* Option values loaded from config file */
    vlc_bool_t   b_autosave;       /* Config will be auto-saved at exit time */
207
    vlc_bool_t   b_unsaveable;       /* confg should be saved*/
208
};
gbazin's avatar
   
gbazin committed
209
210
211
212
213

/*****************************************************************************
 * Prototypes - these methods are used to get, set or manipulate configuration
 * data.
 *****************************************************************************/
gbazin's avatar
   
gbazin committed
214
VLC_EXPORT( int,    __config_GetType,  (vlc_object_t *, const char *) );
215
216
217
218
219
VLC_EXPORT( int,    __config_GetInt,   (vlc_object_t *, const char *) );
VLC_EXPORT( void,   __config_PutInt,   (vlc_object_t *, const char *, int) );
VLC_EXPORT( float,  __config_GetFloat, (vlc_object_t *, const char *) );
VLC_EXPORT( void,   __config_PutFloat, (vlc_object_t *, const char *, float) );
VLC_EXPORT( char *, __config_GetPsz,   (vlc_object_t *, const char *) );
220
VLC_EXPORT( void,   __config_PutPsz,   (vlc_object_t *, const char *, const char *) );
221

zorglub's avatar
zorglub committed
222
#define config_SaveConfigFile(a,b) __config_SaveConfigFile(VLC_OBJECT(a),b)
223
VLC_EXPORT( int,    __config_SaveConfigFile, ( vlc_object_t *, const char * ) );
zorglub's avatar
zorglub committed
224
#define config_ResetAll(a) __config_ResetAll(VLC_OBJECT(a))
gbazin's avatar
   
gbazin committed
225
226
VLC_EXPORT( void,   __config_ResetAll, ( vlc_object_t * ) );

227
228
VLC_EXPORT( module_config_t *, config_FindConfig,( vlc_object_t *, const char * ) );
VLC_EXPORT( module_t *, config_FindModule,( vlc_object_t *, const char * ) );
gbazin's avatar
   
gbazin committed
229

zorglub's avatar
zorglub committed
230
VLC_EXPORT( int, config_Duplicate,( module_t *, const module_config_t *, size_t ));
gbazin's avatar
   
gbazin committed
231

zorglub's avatar
zorglub committed
232
233
VLC_EXPORT(const char *, config_GetDataDir, ( const vlc_object_t * ));

gbazin's avatar
   
gbazin committed
234
#define config_GetType(a,b) __config_GetType(VLC_OBJECT(a),b)
235
236
237
238
239
240
#define config_GetInt(a,b) __config_GetInt(VLC_OBJECT(a),b)
#define config_PutInt(a,b,c) __config_PutInt(VLC_OBJECT(a),b,c)
#define config_GetFloat(a,b) __config_GetFloat(VLC_OBJECT(a),b)
#define config_PutFloat(a,b,c) __config_PutFloat(VLC_OBJECT(a),b,c)
#define config_GetPsz(a,b) __config_GetPsz(VLC_OBJECT(a),b)
#define config_PutPsz(a,b,c) __config_PutPsz(VLC_OBJECT(a),b,c)
gbazin's avatar
   
gbazin committed
241

242

gbazin's avatar
   
gbazin committed
243
244
245
/*****************************************************************************
 * Macros used to build the configuration structure.
 *
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
246
 * Note that internally we support only 3 types of config data: int, float
gbazin's avatar
   
gbazin committed
247
248
 *   and string.
 *   The other types declared here just map to one of these 3 basic types but
gbazin's avatar
   
gbazin committed
249
250
251
 *   have the advantage of also providing very good hints to a configuration
 *   interface so as to make it more user friendly.
 * The configuration structure also includes category hints. These hints can
gbazin's avatar
   
gbazin committed
252
253
 *   provide a configuration interface with some very useful data and again
 *   allow for a more user friendly interface.
gbazin's avatar
   
gbazin committed
254
255
 *****************************************************************************/

256
#define add_config_inner( ) \
257
    i_config++; \
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
    if( (i_config % 10) == 0 ) \
        p_config = (module_config_t *) \
             realloc(p_config, (i_config+11) * sizeof(module_config_t)); \
    memset( p_config + i_config, 0, sizeof( *p_config ) )

#define add_type_inner( type ) \
    add_config_inner( ); \
    p_config[i_config].i_type = type

#define add_typedesc_inner( type, text, longtext ) \
    add_type_inner( type ); \
    p_config[i_config].psz_text = text; \
    p_config[i_config].psz_longtext = longtext

#define add_typeadv_inner( type, text, longtext, advc ) \
    add_typedesc_inner( type, text, longtext ); \
    p_config[i_config].b_advanced = advc

#define add_typename_inner( type, name, text, longtext, advc, cb ) \
    add_typeadv_inner( type, text, longtext, advc ); \
    p_config[i_config].psz_name = name; \
    p_config[i_config].pf_callback = cb

281
#define add_string_inner( type, name, text, longtext, advc, cb, v ) \
282
    add_typename_inner( type, name, text, longtext, advc, cb ); \
283
    p_config[i_config].value.psz = v
284

285
#define add_int_inner( type, name, text, longtext, advc, cb, v ) \
286
    add_typename_inner( type, name, text, longtext, advc, cb ); \
287
    p_config[i_config].value.i = v
288
289
290
291


#define set_category( i_id ) \
    add_type_inner( CONFIG_CATEGORY ); \
292
    p_config[i_config].value.i = i_id
zorglub's avatar
zorglub committed
293
294

#define set_subcategory( i_id ) \
295
    add_type_inner( CONFIG_SUBCATEGORY ); \
296
    p_config[i_config].value.i = i_id
297
298
299

#define set_section( text, longtext ) \
    add_typedesc_inner( CONFIG_SECTION, text, longtext )
zorglub's avatar
zorglub committed
300
301

#define add_category_hint( text, longtext, advc ) \
302
    add_typeadv_inner( CONFIG_HINT_CATEGORY, text, longtext, advc )
zorglub's avatar
zorglub committed
303
304

#define add_subcategory_hint( text, longtext ) \
305
    add_typedesc_inner( CONFIG_HINT_SUBCATEGORY, text, longtext )
zorglub's avatar
zorglub committed
306

307
#define end_subcategory_hint \
308
309
    add_type_inner( CONFIG_HINT_SUBCATEGORY_END )

310
#define add_usage_hint( text ) \
311
    add_typedesc_inner( CONFIG_HINT_USAGE, text, NULL )
312

313
314
#define add_string( name, value, p_callback, text, longtext, advc ) \
    add_string_inner( CONFIG_ITEM_STRING, name, text, longtext, advc, p_callback, value )
zorglub's avatar
zorglub committed
315

316
317
#define add_file( name, value, p_callback, text, longtext, advc ) \
    add_string_inner( CONFIG_ITEM_FILE, name, text, longtext, advc, p_callback, value )
zorglub's avatar
zorglub committed
318

319
320
#define add_directory( name, value, p_callback, text, longtext, advc ) \
    add_string_inner( CONFIG_ITEM_DIRECTORY, name, text, longtext, advc, p_callback, value )
zorglub's avatar
zorglub committed
321

322
323
324
#define add_module( name, psz_caps, value, p_callback, text, longtext, advc ) \
    add_string_inner( CONFIG_ITEM_MODULE, name, text, longtext, advc, p_callback, value ); \
    p_config[i_config].psz_type = psz_caps
zorglub's avatar
zorglub committed
325

326
327
#define add_module_cat( name, i_subcategory, value, p_callback, text, longtext, advc ) \
    add_string_inner( CONFIG_ITEM_MODULE_CAT, name, text, longtext, advc, p_callback, value ); \
328
    p_config[i_config].min.i = i_subcategory /* gruik */
zorglub's avatar
zorglub committed
329

330
331
332
#define add_module_list( name, psz_caps, value, p_callback, text, longtext, advc ) \
    add_string_inner( CONFIG_ITEM_MODULE_LIST, name, text, longtext, advc, p_callback, value ); \
    p_config[i_config].psz_type = psz_caps
zorglub's avatar
zorglub committed
333

334
335
#define add_module_list_cat( name, i_subcategory, value, p_callback, text, longtext, advc ) \
    add_string_inner( CONFIG_ITEM_MODULE_LIST_CAT, name, text, longtext, advc, p_callback, value ); \
336
    p_config[i_config].min.i = i_subcategory /* gruik */
zorglub's avatar
zorglub committed
337

338
339
#define add_integer( name, value, p_callback, text, longtext, advc ) \
    add_int_inner( CONFIG_ITEM_INTEGER, name, text, longtext, advc, p_callback, value )
zorglub's avatar
zorglub committed
340

341
342
#define add_key( name, value, p_callback, text, longtext, advc ) \
    add_int_inner( CONFIG_ITEM_KEY, name, text, longtext, advc, p_callback, value )
zorglub's avatar
zorglub committed
343

344
345
346
#define add_integer_with_range( name, value, i_min, i_max, p_callback, text, longtext, advc ) \
    add_integer( name, value, p_callback, text, longtext, advc ); \
    change_integer_range( i_min, i_max )
zorglub's avatar
zorglub committed
347

348
#define add_float( name, v, p_callback, text, longtext, advc ) \
349
    add_typename_inner( CONFIG_ITEM_FLOAT, name, text, longtext, advc, p_callback ); \
350
    p_config[i_config].value.f = v
zorglub's avatar
zorglub committed
351

352
353
354
355
#define add_float_with_range( name, value, f_min, f_max, p_callback, text, longtext, advc ) \
    add_float( name, value, p_callback, text, longtext, advc ); \
    change_float_range( f_min, f_max )

356
#define add_bool( name, v, p_callback, text, longtext, advc ) \
357
    add_typename_inner( CONFIG_ITEM_BOOL, name, text, longtext, advc, p_callback ); \
358
    p_config[i_config].value.i = v
zorglub's avatar
zorglub committed
359

Rémi Denis-Courmont's avatar
Grammar    
Rémi Denis-Courmont committed
360
/* For renamed option */
361
#define add_deprecated( name, strict ) \
362
363
364
365
366
367
368
    add_config_inner( ); \
    p_config[ i_config ].i_type = p_config[ i_config -1 ].i_type; \
    p_config[ i_config ].psz_name = name; \
    p_config[i_config].b_strict = strict; \
    p_config[ i_config ].psz_current = p_config[ i_config-1].psz_current \
        ? p_config[ i_config-1 ].psz_current \
        : p_config[ i_config-1 ].psz_name;
369

Rémi Denis-Courmont's avatar
Grammar    
Rémi Denis-Courmont committed
370
/* For removed option */
371
#define add_suppressed_inner( name, type ) \
372
373
374
    add_type_inner( type ); \
    p_config[ i_config ].psz_name = name; \
    p_config[ i_config ].psz_current = "SUPPRESSED";
375

376
377
378
#define add_suppressed_bool( name ) \
        add_suppressed_inner( name, CONFIG_ITEM_BOOL )

379
#define add_suppressed_integer( name ) \
380
381
        add_suppressed_inner( name, CONFIG_ITEM_INTEGER )

382
#define add_suppressed_float( name ) \
383
384
        add_suppressed_inner( name, CONFIG_ITEM_FLOAT )

385
#define add_suppressed_string( name ) \
386
387
        add_suppressed_inner( name, CONFIG_ITEM_STRING )

388
389
390
391
392
393
394
/* Modifier macros for the config options (used for fine tuning) */
#define change_short( ch ) \
    p_config[i_config].i_short = ch;

#define change_string_list( list, list_text, list_update_func ) \
    p_config[i_config].i_list = sizeof(list)/sizeof(char *); \
    p_config[i_config].ppsz_list = list; \
395
    p_config[i_config].ppsz_list_text = list_text;
396
397
398

#define change_integer_list( list, list_text, list_update_func ) \
    p_config[i_config].i_list = sizeof(list)/sizeof(int); \
399
    p_config[i_config].pi_list = (int *)list; \
400
401
    p_config[i_config].ppsz_list_text = list_text;

402
403
404
#define change_integer_range( minv, maxv ) \
    p_config[i_config].min.i = minv; \
    p_config[i_config].max.i = maxv;
405

406
407
408
#define change_float_range( minv, maxv ) \
    p_config[i_config].min.f = minv; \
    p_config[i_config].max.f = maxv;
409

410
411
412
413
414
415
416
#define change_action_add( pf_action, action_text ) \
    if( !p_config[i_config].i_action ) \
    { p_config[i_config].ppsz_action_text = 0; \
      p_config[i_config].ppf_action = 0; } \
    p_config[i_config].ppf_action = (vlc_callback_t *) \
      realloc( p_config[i_config].ppf_action, \
      (p_config[i_config].i_action + 1) * sizeof(void *) ); \
417
    p_config[i_config].ppsz_action_text = (const char **)\
418
419
420
421
422
423
      realloc( p_config[i_config].ppsz_action_text, \
      (p_config[i_config].i_action + 1) * sizeof(void *) ); \
    p_config[i_config].ppf_action[p_config[i_config].i_action] = pf_action; \
    p_config[i_config].ppsz_action_text[p_config[i_config].i_action] = \
      action_text; \
    p_config[i_config].i_action++;
424

425
426
427
#define change_internal() \
    p_config[i_config].b_internal = VLC_TRUE;

428
429
430
#define change_need_restart() \
    p_config[i_config].b_restart = VLC_TRUE;

431
432
#define change_autosave() \
    p_config[i_config].b_autosave = VLC_TRUE;
433

434
435
#define change_unsaveable() \
    p_config[i_config].b_unsaveable = VLC_TRUE;
436
437
438
439
440
441
442
443
444
445
446
447
448

/****************************************************************************
 * config_chain_t:
 ****************************************************************************/
struct config_chain_t
{
    config_chain_t *p_next;

    char        *psz_name;
    char        *psz_value;
};

#define config_ChainParse( a, b, c, d ) __config_ChainParse( VLC_OBJECT(a), b, c, d )
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
449
450
VLC_EXPORT( void,   __config_ChainParse, ( vlc_object_t *, const char *psz_prefix, const char **ppsz_options, config_chain_t * ) );
VLC_EXPORT( char *, config_ChainCreate, ( char **, config_chain_t **, const char * ) );
451
452
VLC_EXPORT( void, config_ChainDestroy, ( config_chain_t * ) );

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
453
static inline config_chain_t *config_chain_find( config_chain_t *p_cfg, const char *psz_name )
454
455
456
457
458
459
460
461
462
{
    while( p_cfg && strcmp( p_cfg->psz_name, psz_name ) )
    {
        p_cfg = p_cfg->p_next;
    }

    return p_cfg;
}

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
463
static inline char *config_chain_find_value( config_chain_t *p_cfg, const char *psz_name )
464
465
466
467
468
469
470
471
472
473
474
475
476
{
    while( p_cfg && strcmp( p_cfg->psz_name, psz_name ) )
    {
        p_cfg = p_cfg->p_next;
    }

    if( p_cfg && p_cfg->psz_value )
    {
        return( p_cfg->psz_value );
    }

    return NULL;
}
zorglub's avatar
zorglub committed
477
478
479
480

# ifdef __cplusplus
}
# endif