annotate subopt-helper.c @ 34515:a9d2dcb0f435

Fix skin PNG read errors. FFmpeg's PNG decoder no longer does transcoding, but returns 32 bpp images in RGBA format. Extend (and rename) the existing 24 bpp to 32 bpp conversion function to do 32 bpp ARGB conversion as well.
author ib
date Fri, 27 Jan 2012 00:07:45 +0000
parents 08a90b0e44e1
children 389d43c448b3
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>
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
43 #include <limits.h>
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
44 #include <assert.h>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
45
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
46 #ifndef MPDEBUG
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
47 #define NDEBUG
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
48 #endif
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
49
32335
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
50
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
51 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
52 {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
53 char * endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
54
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
55 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
56
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
57 *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
58
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
59 /* nothing was converted */
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
60 if ( str == endp ) { return NULL; }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
61
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
62 return endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
63 }
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 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
66 {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
67 char * endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
68
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
69 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
70
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
71 *valp = strtod( str, &endp );
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
72
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
73 /* nothing was converted */
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
74 if ( str == endp ) { return NULL; }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
75
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
76 return endp;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
77 }
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 #define QUOTE_CHAR '%'
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
80 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
81 {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
82 char const * match = strchr( str, ':' );
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
83
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
84 if (str[0] == QUOTE_CHAR) {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
85 int len = 0;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
86 str = &str[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
87 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
88 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
89 return NULL;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
90 str = &str[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
91 match = &str[len];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
92 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
93 else
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
94 if (str[0] == '"') {
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
95 str = &str[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
96 match = strchr(str, '"');
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
97 if (!match)
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
98 return NULL;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
99 valp->len = match - str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
100 valp->str = str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
101 return &match[1];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
102 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
103 if ( !match )
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
104 match = &str[strlen(str)];
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
105
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
106 // empty string or too long
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
107 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
108 return NULL;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
109
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
110 valp->len = match - str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
111 valp->str = str;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
112
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
113 return match;
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
114 }
fdf3f93c2828 Move some code around to avoid forward declarations in top-level .c files.
diego
parents: 30633
diff changeset
115
14281
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 /**
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
118 * \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
119 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
120 * \param str Pointer to the zero terminated string to be parsed.
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
121 * \param opts Pointer to a options array. The array must be terminated
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
122 * 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
123 *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
124 * \return The return value is zero if the string could be parsed
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
125 * else a non-zero value is returned.
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 */
28827
2b021e3e1000 Get rid of the "set" member of the subopt-parser struct, it made
reimar
parents: 22283
diff changeset
128 int subopt_parse( char const * const str, const opt_t * opts )
14281
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 int parse_err = 0, idx;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
131 unsigned int parse_pos = 0;
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 if ( str )
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 while ( str[parse_pos] && !parse_err )
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 int next = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
138
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
139 idx = 0; // reset index for the below loop
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
140 while ( opts[idx].name )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
141 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
142 int opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
143 int substr_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
144
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
145 // get length of the option we test against */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
146 opt_len = strlen( opts[idx].name );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
147
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
148 // get length of the current substring of str */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
149 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
150 char * delim, * arg_delim;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
151
29252
3b9429f763e2 Get rid of some more trailing whitespace
reynaldo
parents: 28827
diff changeset
152 /* search nearest delimiter ( option or argument delimiter ) */
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
153 delim = strchr( &str[parse_pos], ':' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
154 arg_delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
155
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
156 if ( ( delim && arg_delim && delim > arg_delim ) ||
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
157 delim == NULL )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
158 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
159 delim = strchr( &str[parse_pos], '=' );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
160 }
29252
3b9429f763e2 Get rid of some more trailing whitespace
reynaldo
parents: 28827
diff changeset
161
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
162 substr_len = delim ? // is a delim present
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
163 delim - &str[parse_pos] : // yes
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
164 strlen( &str[parse_pos] ); // no, end of string
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
165 }
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 //printf( "substr_len=%d, opt_len=%d\n", substr_len, opt_len );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
168
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
169 /* Check if the length of the current option matches the *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
170 * length of the option we want to test again. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
171 if ( substr_len == opt_len )
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 /* check if option was activated/deactivated */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
174 if( strncmp( &str[parse_pos], opts[idx].name, opt_len ) == 0 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
175 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
176 /* option was found */
28827
2b021e3e1000 Get rid of the "set" member of the subopt-parser struct, it made
reimar
parents: 22283
diff changeset
177 next = 1;
14281
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 assert( opts[idx].valp && "Need a pointer to store the arg!" );
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 /* type specific code */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
182 if ( opts[idx].type == OPT_ARG_BOOL )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
183 {
22283
bc9e95184521 cosmetics: Fix some common typos, sepErate --> sepArate, deciSSion --> deciSion.
diego
parents: 19104
diff changeset
184 /* Handle OPT_ARG_BOOL separately so *
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
185 * the others can share code. */
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 /* set option to true */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
188 *((int *)(opts[idx].valp)) = 1;
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 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
191 parse_pos += opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
192 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
193 else
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
194 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
195 /* Type is not OPT_ARG_BOOL, means we have to parse *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
196 * for the arg delimiter character and eventually *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
197 * call a test function. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
198 char const * last;
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 /* increment position to check for arg */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
201 parse_pos += opt_len;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
202
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
203 if ( str[parse_pos] != '=' )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
204 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
205 parse_err = 1; 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 /* '=' char was there, so let's move after it */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
209 ++parse_pos;
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 switch ( opts[idx].type )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
212 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
213 case OPT_ARG_INT:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
214 last = parse_int( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
215 (int *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
216
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
217 break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
218 case OPT_ARG_STR:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
219 last = parse_str( &str[parse_pos],
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
220 (strarg_t *)opts[idx].valp );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
221 break;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
222 case OPT_ARG_MSTRZ:
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
223 {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
224 char **valp = opts[idx].valp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
225 strarg_t tmp;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
226 tmp.str = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
227 tmp.len = 0;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
228 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
229 free(*valp);
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
230 *valp = NULL;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
231 if (tmp.str && tmp.len > 0) {
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
232 *valp = malloc(tmp.len + 1);
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
233 memcpy(*valp, tmp.str, tmp.len);
14572
cfe2bbf96000 100l, missing () around *valp
reimar
parents: 14538
diff changeset
234 (*valp)[tmp.len] = 0;
14538
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
235 }
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
236 break;
00c3c4111017 New suboption type: malloc'ed, zero terminated string
reimar
parents: 14294
diff changeset
237 }
16720
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
238 case OPT_ARG_FLOAT:
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
239 last = parse_float( &str[parse_pos],
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
240 (float *)opts[idx].valp );
f73adf296f1e support float arguments in subopt helper.
joey
parents: 16609
diff changeset
241 break;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
242 default:
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
243 assert( 0 && "Arg type of suboption doesn't exist!" );
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
244 last = NULL; // break parsing!
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
245 }
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 /* was the conversion succesful? */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
248 if ( !last )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
249 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
250 parse_err = 1; break;
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
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
253 /* make test if supplied */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
254 if ( opts[idx].test && !opts[idx].test( opts[idx].valp ) )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
255 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
256 parse_err = 1; break;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
257 }
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 /* we succeded, set position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
260 parse_pos = last - str;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
261 }
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 else if ( substr_len == opt_len+2 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
265 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
266 if ( opts[idx].type == OPT_ARG_BOOL && // check for no<opt>
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
267 strncmp( &str[parse_pos], "no", 2 ) == 0 &&
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
268 strncmp( &str[parse_pos+2], opts[idx].name, opt_len ) == 0 )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
269 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
270 /* 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
271 next = 1;
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
272
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
273 /* set arg to false */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
274 *((int *)(opts[idx].valp)) = 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
275
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
276 /* increment position */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
277 parse_pos += opt_len+2;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
278 }
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 ++idx; // test against next option
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
282
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
283 /* break out of the loop, if this subopt is processed */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
284 if ( next ) { break; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
285 }
29252
3b9429f763e2 Get rid of some more trailing whitespace
reynaldo
parents: 28827
diff changeset
286
14281
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
287 /* if we had a valid suboption the current pos should *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
288 * equal the delimiter char, which should be ':' for *
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
289 * suboptions. */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
290 if ( !parse_err && str[parse_pos] == ':' ) { ++parse_pos; }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
291 else if ( str[parse_pos] ) { parse_err = 1; }
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 }
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 /* if an error was encountered */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
296 if (parse_err)
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
297 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
298 unsigned int i;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
299 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
300 for ( i = 0; i < parse_pos; ++i )
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
301 {
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
302 mp_msg(MSGT_VO, MSGL_FATAL, " ");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
303 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
304 mp_msg(MSGT_VO, MSGL_FATAL, "^\n");
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
305
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
306 return -1;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
307 }
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 /* we could parse everything */
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
310 return 0;
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
311 }
577c16f551ad suboption parser for vo and ao modules
al
parents:
diff changeset
312
14736
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 /*** common test functions ***/
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 not negative */
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
317 int int_non_neg(void *iptr)
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
318 {
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
319 int *i = iptr;
30123
0f5f75b4a015 Simplify range-checking functions for subopt parsing.
reimar
parents: 30122
diff changeset
320 return *i >= 0;
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
321 }
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
322 /** \brief Test if i is positive. */
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
323 int int_pos(void *iptr)
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
324 {
30122
1772a5171ac7 Fix function declarations to avoid casting function pointers.
reimar
parents: 29252
diff changeset
325 int *i = iptr;
30123
0f5f75b4a015 Simplify range-checking functions for subopt parsing.
reimar
parents: 30122
diff changeset
326 return *i > 0;
14736
2ef20aa3623b Move generic tests to a common place.
al
parents: 14572
diff changeset
327 }
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
328
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
329 /*** little helpers */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
330
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
331 /** \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
332 int strargcmp(strarg_t *arg, const char *str) {
15734
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
333 int res = strncmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
334 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
335 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
336 return res;
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
337 }
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 /** \brief compare the stings just as strcasecmp does */
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
340 int strargcasecmp(strarg_t *arg, char *str) {
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
341 int res = strncasecmp(arg->str, str, arg->len);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
342 if (!res && arg->len != strlen(str))
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
343 res = arg->len - strlen(str);
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
344 return res;
7e4fa8fc255c helper functions for comparing strarg_t "strings".
reimar
parents: 15733
diff changeset
345 }