annotate subopt-helper.c @ 29130:33956c5f5005

Reemit the ID_AID_x_LANG for the track. This allows the identification of the audio track by language code (en or es) rather than by ID (128 or 129). patch by Kevin DeKorte, kdekorte gmail com
author diego
date Sat, 11 Apr 2009 13:51:02 +0000
parents 2b021e3e1000
children 3b9429f763e2
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 */
28827
2b021e3e1000 Get rid of the "set" member of the subopt-parser struct, it made
reimar
parents: 22283
diff changeset
48 int subopt_parse( char const * const str, const opt_t * opts )
14281
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 if ( str )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
54 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
55 while ( str[parse_pos] && !parse_err )
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 int next = 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 idx = 0; // reset index for the below loop
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
60 while ( opts[idx].name )
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 int opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
63 int substr_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
64
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
65 // get length of the option we test against */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
66 opt_len = strlen( opts[idx].name );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
67
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
68 // get length of the current substring of str */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
69 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
70 char * delim, * arg_delim;
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 /* search nearest delimiter ( option or argument delimiter ) */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
73 delim = strchr( &str[parse_pos], ':' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
74 arg_delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
75
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
76 if ( ( delim && arg_delim && delim > arg_delim ) ||
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
77 delim == NULL )
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 delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
80 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
81
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
82 substr_len = delim ? // is a delim present
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
83 delim - &str[parse_pos] : // yes
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
84 strlen( &str[parse_pos] ); // no, end of string
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
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
87 //printf( "substr_len=%d, opt_len=%d\n", substr_len, opt_len );
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 /* Check if the length of the current option matches the *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
90 * length of the option we want to test again. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
91 if ( substr_len == opt_len )
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 /* check if option was activated/deactivated */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
94 if( strncmp( &str[parse_pos], opts[idx].name, opt_len ) == 0 )
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 /* option was found */
28827
2b021e3e1000 Get rid of the "set" member of the subopt-parser struct, it made
reimar
parents: 22283
diff changeset
97 next = 1;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
98
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
99 assert( opts[idx].valp && "Need a pointer to store the arg!" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
100
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
101 /* type specific code */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
102 if ( opts[idx].type == OPT_ARG_BOOL )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
103 {
22283
bc9e95184521 cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents: 19104
diff changeset
104 /* Handle OPT_ARG_BOOL separately so *
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
105 * the others can share code. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
106
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
107 /* set option to true */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
108 *((int *)(opts[idx].valp)) = 1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
109
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
110 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
111 parse_pos += opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
112 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
113 else
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
114 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
115 /* Type is not OPT_ARG_BOOL, means we have to parse *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
116 * for the arg delimiter character and eventually *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
117 * call a test function. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
118 char const * last;
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 /* increment position to check for arg */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
121 parse_pos += opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
122
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
123 if ( str[parse_pos] != '=' )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
124 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
125 parse_err = 1; break;
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
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
128 /* '=' char was there, so let's move after it */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
129 ++parse_pos;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
130
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
131 switch ( opts[idx].type )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
132 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
133 case OPT_ARG_INT:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
134 last = parse_int( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
135 (int *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
136
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
137 break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
138 case OPT_ARG_STR:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
139 last = parse_str( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
140 (strarg_t *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
141 break;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
142 case OPT_ARG_MSTRZ:
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
143 {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
144 char **valp = opts[idx].valp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
145 strarg_t tmp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
146 tmp.str = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
147 tmp.len = 0;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
148 last = parse_str( &str[parse_pos], &tmp );
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
149 if (*valp)
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
150 free(*valp);
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
151 *valp = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
152 if (tmp.str && tmp.len > 0) {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
153 *valp = malloc(tmp.len + 1);
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
154 memcpy(*valp, tmp.str, tmp.len);
14572
cfe2bbf96000 100l, missing () around *valp
reimar
parents: 14538
diff changeset
155 (*valp)[tmp.len] = 0;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
156 }
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
157 break;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
158 }
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
159 case OPT_ARG_FLOAT:
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
160 last = parse_float( &str[parse_pos],
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
161 (float *)opts[idx].valp );
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
162 break;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
163 default:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
164 assert( 0 && "Arg type of suboption doesn't exist!" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
165 last = NULL; // break parsing!
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
166 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
167
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
168 /* was the conversion succesful? */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
169 if ( !last )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
170 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
171 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
172 }
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 /* make test if supplied */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
175 if ( opts[idx].test && !opts[idx].test( opts[idx].valp ) )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
176 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
177 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
178 }
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 /* we succeded, set position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
181 parse_pos = last - str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
182 }
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 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
185 else if ( substr_len == opt_len+2 )
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 if ( opts[idx].type == OPT_ARG_BOOL && // check for no<opt>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
188 strncmp( &str[parse_pos], "no", 2 ) == 0 &&
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
189 strncmp( &str[parse_pos+2], opts[idx].name, opt_len ) == 0 )
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 /* option was found but negated */
28827
2b021e3e1000 Get rid of the "set" member of the subopt-parser struct, it made
reimar
parents: 22283
diff changeset
192 next = 1;
14281
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 /* set arg to false */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
195 *((int *)(opts[idx].valp)) = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
196
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
197 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
198 parse_pos += opt_len+2;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
199 }
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
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
202 ++idx; // test against next option
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 /* break out of the loop, if this subopt is processed */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
205 if ( next ) { break; }
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 /* if we had a valid suboption the current pos should *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
209 * equal the delimiter char, which should be ':' for *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
210 * suboptions. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
211 if ( !parse_err && str[parse_pos] == ':' ) { ++parse_pos; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
212 else if ( str[parse_pos] ) { parse_err = 1; }
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
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
216 /* if an error was encountered */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
217 if (parse_err)
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
218 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
219 unsigned int i;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
220 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
221 for ( i = 0; i < parse_pos; ++i )
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 mp_msg(MSGT_VO, MSGL_FATAL, " ");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
224 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
225 mp_msg(MSGT_VO, MSGL_FATAL, "^\n");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
226
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
227 return -1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
228 }
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 /* we could parse everything */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
231 return 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
232 }
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 static char const * parse_int( char const * const str, int * const valp )
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 char * endp;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
237
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
238 assert( str && "parse_int(): str == NULL" );
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 *valp = (int)strtol( str, &endp, 0 );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
241
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
242 /* nothing was converted */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
243 if ( str == endp ) { return NULL; }
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 return endp;
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
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
248 static char const * parse_float( char const * const str, float * const valp )
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
249 {
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
250 char * endp;
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
251
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
252 assert( str && "parse_float(): str == NULL" );
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
253
16725
2a7220c457a7 1l, strtof is only C99, strtod is ANSI C, so use that instead.
reimar
parents: 16720
diff changeset
254 *valp = strtod( str, &endp );
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
255
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
256 /* nothing was converted */
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
257 if ( str == endp ) { return NULL; }
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 return endp;
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
260 }
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
261
15733
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
262 #define QUOTE_CHAR '%'
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
263 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
264 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
265 char const * match = strchr( str, ':' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
266
15733
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
267 if (str[0] == QUOTE_CHAR) {
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
268 int len = 0;
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
269 str = &str[1];
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
270 len = (int)strtol(str, (char **)&str, 0);
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
271 if (!str || str[0] != QUOTE_CHAR || (len > strlen(str) - 1))
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
272 return NULL;
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
273 str = &str[1];
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
274 match = &str[len];
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
275 }
e678e306068e support lenght-quoting of strings in subopt parser.
reimar
parents: 14736
diff changeset
276 else
16609
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
277 if (str[0] == '"') {
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
278 str = &str[1];
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
279 match = strchr(str, '"');
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
280 if (!match)
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
281 return NULL;
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
282 valp->len = match - str;
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
283 valp->str = str;
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
284 return &match[1];
061d6e09ad62 Allow string escaping via "".
reimar
parents: 15734
diff changeset
285 }
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
286 if ( !match )
14294
90bcd37dba7f fix string argument parsing (e.g. one char strings were not accepted)
reimar
parents: 14281
diff changeset
287 match = &str[strlen(str)];
90bcd37dba7f fix string argument parsing (e.g. one char strings were not accepted)
reimar
parents: 14281
diff changeset
288
90bcd37dba7f fix string argument parsing (e.g. one char strings were not accepted)
reimar
parents: 14281
diff changeset
289 // empty string or too long
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
290 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
291 return NULL;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
292
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
293 valp->len = match - str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
294 valp->str = str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
295
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
296 return match;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
297 }
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
298
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
299
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
300 /*** common test functions ***/
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
301
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
302 /** \brief Test if i is not negative */
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
303 int int_non_neg( int * i )
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
304 {
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
305 if ( *i < 0 ) { return 0; }
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 return 1;
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 positive. */
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
310 int int_pos( 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 1; }
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 0;
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
315 }
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
316
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
317 /*** little helpers */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
318
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
319 /** \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
320 int strargcmp(strarg_t *arg, const char *str) {
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
321 int res = strncmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
322 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
323 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
324 return res;
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
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
327 /** \brief compare the stings just as strcasecmp does */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
328 int strargcasecmp(strarg_t *arg, char *str) {
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
329 int res = strncasecmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
330 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
331 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
332 return res;
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