annotate subopt-helper.c @ 25661:293aeec83153

Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with an almost-trivial implementation. This allows making the builtin codec structs const, and it also makes clearer that this "selected" status is not used outside the init functions.
author reimar
date Sat, 12 Jan 2008 14:05:46 +0000
parents bc9e95184521
children 2b021e3e1000
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
1 /**
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
2 * \file subopt-helper.c
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
3 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
4 * \brief Compensates the suboption parsing code duplication a bit.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
5 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
6 * The routines defined below are there to help you with the
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
7 * suboption parsing. Meaning extracting the options and their
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
8 * values for you and also outputting generic help message if
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
9 * a parse error is encountered.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
10 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
11 * Most stuff happens in the subopt_parse function: if you call it
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
12 * it parses for the passed opts in the passed string. It calls some
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
13 * extra functions for explicit argument parsing ( where the option
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
14 * itself isn't the argument but a value given after the argument
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
15 * delimiter ('='). It also calls your test function if you supplied
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
16 * one.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
17 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
18 */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
19
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
20 #include "subopt-helper.h"
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
21 #include "mp_msg.h"
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
22
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
23 #include <stdlib.h>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
24 #include <string.h>
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
25 #include <limits.h>
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
26 #include <assert.h>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
27
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
28 #ifndef MPDEBUG
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
29 #define NDEBUG
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
30 #endif
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
31
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
32 /* prototypes for argument parsing */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
33 static char const * parse_int( char const * const str, int * const valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
34 static char const * parse_str( char const * const str, strarg_t * const valp );
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
35 static char const * parse_float( char const * const str, float * const valp );
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
36
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
37 /**
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
38 * \brief Try to parse all options in str and fail if it was not possible.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
39 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
40 * \param str Pointer to the zero terminated string to be parsed.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
41 * \param opts Pointer to a options array. The array must be terminated
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
42 * with an element having set name to NULL in its opt_t structure.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
43 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
44 * \return The return value is zero if the string could be parsed
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
45 * else a non-zero value is returned.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
46 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
47 */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
48 int subopt_parse( char const * const str, opt_t * opts )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
49 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
50 int parse_err = 0, idx;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
51 unsigned int parse_pos = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
52
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
53 /* Initialize set member to false. *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
54 * It is set to true if it was found in str */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
55 for ( idx=0; opts[idx].name; ++idx )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
56 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
57 opts[idx].set = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
58 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
59
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
60 if ( str )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
61 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
62 while ( str[parse_pos] && !parse_err )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
63 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
64 int next = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
65
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
66 idx = 0; // reset index for the below loop
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
67 while ( opts[idx].name )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
68 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
69 int opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
70 int substr_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
71
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
72 // get length of the option we test against */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
73 opt_len = strlen( opts[idx].name );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
74
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
75 // get length of the current substring of str */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
76 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
77 char * delim, * arg_delim;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
78
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
79 /* search nearest delimiter ( option or argument delimiter ) */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
80 delim = strchr( &str[parse_pos], ':' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
81 arg_delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
82
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
83 if ( ( delim && arg_delim && delim > arg_delim ) ||
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
84 delim == NULL )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
85 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
86 delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
87 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
88
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
89 substr_len = delim ? // is a delim present
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
90 delim - &str[parse_pos] : // yes
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
91 strlen( &str[parse_pos] ); // no, end of string
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
92 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
93
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
94 //printf( "substr_len=%d, opt_len=%d\n", substr_len, opt_len );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
95
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
96 /* Check if the length of the current option matches the *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
97 * length of the option we want to test again. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
98 if ( substr_len == opt_len )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
99 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
100 /* check if option was activated/deactivated */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
101 if( strncmp( &str[parse_pos], opts[idx].name, opt_len ) == 0 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
102 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
103 /* option was found */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
104 opts[idx].set = 1; next = 1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
105
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
106 assert( opts[idx].valp && "Need a pointer to store the arg!" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
107
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
108 /* type specific code */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
109 if ( opts[idx].type == OPT_ARG_BOOL )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
110 {
22283
bc9e95184521 cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents: 19104
diff changeset
111 /* Handle OPT_ARG_BOOL separately so *
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
112 * the others can share code. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
113
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
114 /* set option to true */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
115 *((int *)(opts[idx].valp)) = 1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
116
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
117 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
118 parse_pos += opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
119 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
120 else
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
121 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
122 /* Type is not OPT_ARG_BOOL, means we have to parse *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
123 * for the arg delimiter character and eventually *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
124 * call a test function. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
125 char const * last;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
126
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
127 /* increment position to check for arg */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
128 parse_pos += opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
129
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
130 if ( str[parse_pos] != '=' )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
131 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
132 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
133 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
134
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
135 /* '=' char was there, so let's move after it */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
136 ++parse_pos;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
137
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
138 switch ( opts[idx].type )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
139 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
140 case OPT_ARG_INT:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
141 last = parse_int( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
142 (int *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
143
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
144 break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
145 case OPT_ARG_STR:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
146 last = parse_str( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
147 (strarg_t *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
148 break;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
149 case OPT_ARG_MSTRZ:
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
150 {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
151 char **valp = opts[idx].valp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
152 strarg_t tmp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
153 tmp.str = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
154 tmp.len = 0;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
155 last = parse_str( &str[parse_pos], &tmp );
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
156 if (*valp)
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
157 free(*valp);
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
158 *valp = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
159 if (tmp.str && tmp.len > 0) {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
160 *valp = malloc(tmp.len + 1);
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
161 memcpy(*valp, tmp.str, tmp.len);
14572
cfe2bbf96000 100l, missing () around *valp
reimar
parents: 14538
diff changeset
162 (*valp)[tmp.len] = 0;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
163 }
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
164 break;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
165 }
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
166 case OPT_ARG_FLOAT:
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
167 last = parse_float( &str[parse_pos],
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
168 (float *)opts[idx].valp );
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
169 break;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
170 default:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
171 assert( 0 && "Arg type of suboption doesn't exist!" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
172 last = NULL; // break parsing!
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
173 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
174
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
175 /* was the conversion succesful? */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
176 if ( !last )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
177 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
178 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
179 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
180
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
181 /* make test if supplied */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
182 if ( opts[idx].test && !opts[idx].test( opts[idx].valp ) )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
183 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
184 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
185 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
186
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
187 /* we succeded, set position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
188 parse_pos = last - str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
189 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
190 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
191 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
192 else if ( substr_len == opt_len+2 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
193 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
194 if ( opts[idx].type == OPT_ARG_BOOL && // check for no<opt>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
195 strncmp( &str[parse_pos], "no", 2 ) == 0 &&
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
196 strncmp( &str[parse_pos+2], opts[idx].name, opt_len ) == 0 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
197 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
198 /* option was found but negated */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
199 opts[idx].set = 1; next = 1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
200
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
201 /* set arg to false */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
202 *((int *)(opts[idx].valp)) = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
203
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
204 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
205 parse_pos += opt_len+2;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
206 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
207 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
208
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
209 ++idx; // test against next option
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
210
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
211 /* break out of the loop, if this subopt is processed */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
212 if ( next ) { break; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
213 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
214
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
215 /* if we had a valid suboption the current pos should *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
216 * equal the delimiter char, which should be ':' for *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
217 * suboptions. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
218 if ( !parse_err && str[parse_pos] == ':' ) { ++parse_pos; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
219 else if ( str[parse_pos] ) { parse_err = 1; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
220 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
221 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
222
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
223 /* if an error was encountered */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
224 if (parse_err)
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
225 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
226 unsigned int i;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
227 mp_msg( MSGT_VO, MSGL_FATAL, "Could not parse arguments at the position indicated below:\n%s\n", str );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
228 for ( i = 0; i < parse_pos; ++i )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
229 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
230 mp_msg(MSGT_VO, MSGL_FATAL, " ");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
231 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
232 mp_msg(MSGT_VO, MSGL_FATAL, "^\n");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
233
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
234 return -1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
235 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
236
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
237 /* we could parse everything */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
238 return 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
239 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
240
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
241 static char const * parse_int( char const * const str, int * const valp )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
242 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
243 char * endp;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
244
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
245 assert( str && "parse_int(): str == NULL" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
246
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
247 *valp = (int)strtol( str, &endp, 0 );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
248
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
249 /* nothing was converted */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
250 if ( str == endp ) { return NULL; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
251
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
252 return endp;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
253 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
254
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
255 static char const * parse_float( char const * const str, float * const valp )
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
256 {
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
257 char * endp;
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
258
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
259 assert( str && "parse_float(): str == NULL" );
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
260
16725
2a7220c457a7 1l, strtof is only C99, strtod is ANSI C, so use that instead.
reimar
parents: 16720
diff changeset
261 *valp = strtod( str, &endp );
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
262
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
263 /* nothing was converted */
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
264 if ( str == endp ) { return NULL; }
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
265
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
266 return endp;
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
267 }
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
268
15733
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
269 #define QUOTE_CHAR '%'
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
270 static char const * parse_str( char const * str, strarg_t * const valp )
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
271 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
272 char const * match = strchr( str, ':' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
273
15733
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
274 if (str[0] == QUOTE_CHAR) {
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
275 int len = 0;
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
276 str = &str[1];
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
277 len = (int)strtol(str, (char **)&str, 0);
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
278 if (!str || str[0] != QUOTE_CHAR || (len > strlen(str) - 1))
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
279 return NULL;
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
280 str = &str[1];
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
281 match = &str[len];
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
282 }
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
283 else
16609
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
284 if (str[0] == '"') {
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
285 str = &str[1];
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
286 match = strchr(str, '"');
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
287 if (!match)
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
288 return NULL;
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
289 valp->len = match - str;
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
290 valp->str = str;
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
291 return &match[1];
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
292 }
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
293 if ( !match )
14294
90bcd37dba7f fix string argument parsing (e.g. one char strings were not accepted)
reimar
parents: 14281
diff changeset
294 match = &str[strlen(str)];
90bcd37dba7f fix string argument parsing (e.g. one char strings were not accepted)
reimar
parents: 14281
diff changeset
295
90bcd37dba7f fix string argument parsing (e.g. one char strings were not accepted)
reimar
parents: 14281
diff changeset
296 // empty string or too long
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
297 if ((match == str) || (match - str > INT_MAX))
14294
90bcd37dba7f fix string argument parsing (e.g. one char strings were not accepted)
reimar
parents: 14281
diff changeset
298 return NULL;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
299
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
300 valp->len = match - str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
301 valp->str = str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
302
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
303 return match;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
304 }
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
305
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
306
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
307 /*** common test functions ***/
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
308
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
309 /** \brief Test if i is not negative */
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
310 int int_non_neg( int * i )
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
311 {
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
312 if ( *i < 0 ) { return 0; }
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
313
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
314 return 1;
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
315 }
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
316 /** \brief Test if i is positive. */
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
317 int int_pos( int * i )
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
318 {
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
319 if ( *i > 0 ) { return 1; }
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
320
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
321 return 0;
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
322 }
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
323
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
324 /*** little helpers */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
325
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
326 /** \brief compare the stings just as strcmp does */
19104
2ec2301183cd marks several read-only string parameters which aren't modified inside the called function as const. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents: 16725
diff changeset
327 int strargcmp(strarg_t *arg, const char *str) {
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
328 int res = strncmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
329 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
330 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
331 return res;
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
332 }
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
333
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
334 /** \brief compare the stings just as strcasecmp does */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
335 int strargcasecmp(strarg_t *arg, char *str) {
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
336 int res = strncasecmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
337 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
338 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
339 return res;
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
340 }
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
341