annotate subopt-helper.c @ 36800:f3c835ddce85

demuxers: ensure that stream ids are correctly initialized. This should fix missing video after r36778 and potentially other issues in relation with video stream switching.
author reimar
date Wed, 19 Feb 2014 23:01:15 +0000
parents 389d43c448b3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30429
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
1 /*
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
2 * This file is part of MPlayer.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
3 *
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
5 * it under the terms of the GNU General Public License as published by
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
7 * (at your option) any later version.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
8 *
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
12 * GNU General Public License for more details.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
13 *
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
14 * You should have received a copy of the GNU General Public License along
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
17 */
c1a3f1bbba26 Add license header to all top-level files missing them.
diego
parents: 30123
diff changeset
18
29252
3b9429f763e2 Get rid of some more trailing whitespace
reynaldo
parents: 28827
diff changeset
19 /**
33882
08a90b0e44e1 doxygen: drop filename from @file directive
diego
parents: 32511
diff changeset
20 * \file
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
21 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
22 * \brief Compensates the suboption parsing code duplication a bit.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
23 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
24 * The routines defined below are there to help you with the
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
25 * suboption parsing. Meaning extracting the options and their
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
26 * values for you and also outputting generic help message if
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
27 * a parse error is encountered.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
28 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
29 * Most stuff happens in the subopt_parse function: if you call it
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
30 * 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
31 * extra functions for explicit argument parsing ( where the option
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
32 * itself isn't the argument but a value given after the argument
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
33 * delimiter ('='). It also calls your test function if you supplied
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
34 * one.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
35 *
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 #include "subopt-helper.h"
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
39 #include "mp_msg.h"
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
40
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
41 #include <stdlib.h>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
42 #include <string.h>
35903
389d43c448b3 Add missing strings.h #includes for strcasecmp().
diego
parents: 33882
diff changeset
43 #include <strings.h>
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
44 #include <limits.h>
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
45 #include <assert.h>
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 #ifndef MPDEBUG
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
48 #define NDEBUG
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
49 #endif
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
50
32335
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
51
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
52 static char const * parse_int( char const * const str, int * const valp )
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
53 {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
54 char * endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
55
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
56 assert( str && "parse_int(): str == NULL" );
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
57
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
58 *valp = (int)strtol( str, &endp, 0 );
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
59
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
60 /* nothing was converted */
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
61 if ( str == endp ) { return NULL; }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
62
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
63 return endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
64 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
65
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
66 static char const * parse_float( char const * const str, float * const valp )
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
67 {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
68 char * endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
69
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
70 assert( str && "parse_float(): str == NULL" );
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
71
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
72 *valp = strtod( str, &endp );
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
73
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
74 /* nothing was converted */
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
75 if ( str == endp ) { return NULL; }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
76
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
77 return endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
78 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
79
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
80 #define QUOTE_CHAR '%'
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
81 static char const * parse_str( char const * str, strarg_t * const valp )
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
82 {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
83 char const * match = strchr( str, ':' );
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
84
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
85 if (str[0] == QUOTE_CHAR) {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
86 int len = 0;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
87 str = &str[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
88 len = (int)strtol(str, (char **)&str, 0);
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
89 if (!str || str[0] != QUOTE_CHAR || (len > strlen(str) - 1))
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
90 return NULL;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
91 str = &str[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
92 match = &str[len];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
93 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
94 else
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
95 if (str[0] == '"') {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
96 str = &str[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
97 match = strchr(str, '"');
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
98 if (!match)
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
99 return NULL;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
100 valp->len = match - str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
101 valp->str = str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
102 return &match[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
103 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
104 if ( !match )
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
105 match = &str[strlen(str)];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
106
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
107 // empty string or too long
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
108 if ((match == str) || (match - str > INT_MAX))
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
109 return NULL;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
110
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
111 valp->len = match - str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
112 valp->str = str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
113
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
114 return match;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
115 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
116
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
117
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
118 /**
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
119 * \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
120 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
121 * \param str Pointer to the zero terminated string to be parsed.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
122 * \param opts Pointer to a options array. The array must be terminated
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
123 * 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
124 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
125 * \return The return value is zero if the string could be parsed
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
126 * else a non-zero value is returned.
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 */
28827
2b021e3e1000 Get rid of the "set" member of the subopt-parser struct, it made
reimar
parents: 22283
diff changeset
129 int subopt_parse( char const * const str, const opt_t * opts )
14281
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 int parse_err = 0, idx;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
132 unsigned int parse_pos = 0;
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 if ( str )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
135 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
136 while ( str[parse_pos] && !parse_err )
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 int next = 0;
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 idx = 0; // reset index for the below loop
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
141 while ( opts[idx].name )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
142 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
143 int opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
144 int substr_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
145
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
146 // get length of the option we test against */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
147 opt_len = strlen( opts[idx].name );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
148
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
149 // get length of the current substring of str */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
150 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
151 char * delim, * arg_delim;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
152
29252
3b9429f763e2 Get rid of some more trailing whitespace
reynaldo
parents: 28827
diff changeset
153 /* search nearest delimiter ( option or argument delimiter ) */
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
154 delim = strchr( &str[parse_pos], ':' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
155 arg_delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
156
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
157 if ( ( delim && arg_delim && delim > arg_delim ) ||
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
158 delim == NULL )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
159 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
160 delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
161 }
29252
3b9429f763e2 Get rid of some more trailing whitespace
reynaldo
parents: 28827
diff changeset
162
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
163 substr_len = delim ? // is a delim present
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
164 delim - &str[parse_pos] : // yes
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
165 strlen( &str[parse_pos] ); // no, end of string
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 //printf( "substr_len=%d, opt_len=%d\n", substr_len, opt_len );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
169
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
170 /* Check if the length of the current option matches the *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
171 * length of the option we want to test again. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
172 if ( substr_len == opt_len )
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 /* check if option was activated/deactivated */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
175 if( strncmp( &str[parse_pos], opts[idx].name, opt_len ) == 0 )
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 /* option was found */
28827
2b021e3e1000 Get rid of the "set" member of the subopt-parser struct, it made
reimar
parents: 22283
diff changeset
178 next = 1;
14281
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 assert( opts[idx].valp && "Need a pointer to store the arg!" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
181
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
182 /* type specific code */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
183 if ( opts[idx].type == OPT_ARG_BOOL )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
184 {
22283
bc9e95184521 cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents: 19104
diff changeset
185 /* Handle OPT_ARG_BOOL separately so *
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
186 * the others can share code. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
187
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
188 /* set option to true */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
189 *((int *)(opts[idx].valp)) = 1;
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 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
192 parse_pos += opt_len;
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 else
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
195 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
196 /* Type is not OPT_ARG_BOOL, means we have to parse *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
197 * for the arg delimiter character and eventually *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
198 * call a test function. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
199 char const * last;
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 /* increment position to check for arg */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
202 parse_pos += opt_len;
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 if ( str[parse_pos] != '=' )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
205 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
206 parse_err = 1; break;
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 /* '=' char was there, so let's move after it */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
210 ++parse_pos;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
211
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
212 switch ( opts[idx].type )
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 case OPT_ARG_INT:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
215 last = parse_int( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
216 (int *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
217
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
218 break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
219 case OPT_ARG_STR:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
220 last = parse_str( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
221 (strarg_t *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
222 break;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
223 case OPT_ARG_MSTRZ:
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
224 {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
225 char **valp = opts[idx].valp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
226 strarg_t tmp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
227 tmp.str = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
228 tmp.len = 0;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
229 last = parse_str( &str[parse_pos], &tmp );
32511
b39155e98ac3 Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents: 32335
diff changeset
230 free(*valp);
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
231 *valp = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
232 if (tmp.str && tmp.len > 0) {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
233 *valp = malloc(tmp.len + 1);
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
234 memcpy(*valp, tmp.str, tmp.len);
14572
cfe2bbf96000 100l, missing () around *valp
reimar
parents: 14538
diff changeset
235 (*valp)[tmp.len] = 0;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
236 }
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
237 break;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
238 }
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
239 case OPT_ARG_FLOAT:
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
240 last = parse_float( &str[parse_pos],
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
241 (float *)opts[idx].valp );
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
242 break;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
243 default:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
244 assert( 0 && "Arg type of suboption doesn't exist!" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
245 last = NULL; // break parsing!
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
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
248 /* was the conversion succesful? */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
249 if ( !last )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
250 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
251 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
252 }
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 /* make test if supplied */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
255 if ( opts[idx].test && !opts[idx].test( opts[idx].valp ) )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
256 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
257 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
258 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
259
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
260 /* we succeded, set position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
261 parse_pos = last - str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
262 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
263 }
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 else if ( substr_len == opt_len+2 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
266 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
267 if ( opts[idx].type == OPT_ARG_BOOL && // check for no<opt>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
268 strncmp( &str[parse_pos], "no", 2 ) == 0 &&
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
269 strncmp( &str[parse_pos+2], opts[idx].name, opt_len ) == 0 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
270 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
271 /* 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
272 next = 1;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
273
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
274 /* set arg to false */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
275 *((int *)(opts[idx].valp)) = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
276
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
277 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
278 parse_pos += opt_len+2;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
279 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
280 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
282 ++idx; // test against next option
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
283
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
284 /* break out of the loop, if this subopt is processed */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
285 if ( next ) { break; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
286 }
29252
3b9429f763e2 Get rid of some more trailing whitespace
reynaldo
parents: 28827
diff changeset
287
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
288 /* if we had a valid suboption the current pos should *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
289 * equal the delimiter char, which should be ':' for *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
290 * suboptions. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
291 if ( !parse_err && str[parse_pos] == ':' ) { ++parse_pos; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
292 else if ( str[parse_pos] ) { parse_err = 1; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
293 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
294 }
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 /* if an error was encountered */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
297 if (parse_err)
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
298 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
299 unsigned int i;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
300 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
301 for ( i = 0; i < parse_pos; ++i )
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 mp_msg(MSGT_VO, MSGL_FATAL, " ");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
304 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
305 mp_msg(MSGT_VO, MSGL_FATAL, "^\n");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
306
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
307 return -1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
308 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
309
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
310 /* we could parse everything */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
311 return 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
312 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
313
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
314
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
315 /*** common test functions ***/
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
316
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
317 /** \brief Test if i is not negative */
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
318 int int_non_neg(void *iptr)
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
319 {
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
320 int *i = iptr;
30123
0f5f75b4a015 Simplify range-checking functions for subopt parsing.
reimar
parents: 30122
diff changeset
321 return *i >= 0;
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
322 }
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
323 /** \brief Test if i is positive. */
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
324 int int_pos(void *iptr)
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
325 {
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
326 int *i = iptr;
30123
0f5f75b4a015 Simplify range-checking functions for subopt parsing.
reimar
parents: 30122
diff changeset
327 return *i > 0;
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
328 }
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
329
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
330 /*** little helpers */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
331
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
332 /** \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
333 int strargcmp(strarg_t *arg, const char *str) {
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
334 int res = strncmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
335 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
336 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
337 return res;
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
338 }
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
339
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
340 /** \brief compare the stings just as strcasecmp does */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
341 int strargcasecmp(strarg_t *arg, char *str) {
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
342 int res = strncasecmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
343 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
344 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
345 return res;
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
346 }