Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(366)

Side by Side Diff: source/libvpx/args.c

Issue 11555023: libvpx: Add VP9 decoder. (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 11
12 #include <stdlib.h> 12 #include <stdlib.h>
13 #include <string.h> 13 #include <string.h>
14 #include <limits.h> 14 #include <limits.h>
15 #include "args.h" 15 #include "args.h"
16 16
17 #ifdef _MSC_VER 17 #ifdef _MSC_VER
18 #define snprintf _snprintf 18 #define snprintf _snprintf
19 #endif 19 #endif
20 20
21 #if defined(__GNUC__) && __GNUC__ 21 #if defined(__GNUC__) && __GNUC__
22 extern void die(const char *fmt, ...) __attribute__((noreturn)); 22 extern void die(const char *fmt, ...) __attribute__((noreturn));
23 #else 23 #else
24 extern void die(const char *fmt, ...); 24 extern void die(const char *fmt, ...);
25 #endif 25 #endif
26 26
27 27
28 struct arg arg_init(char **argv) 28 struct arg arg_init(char **argv) {
29 { 29 struct arg a;
30 struct arg a; 30
31 31 a.argv = argv;
32 a.argv = argv; 32 a.argv_step = 1;
33 a.argv_step = 1; 33 a.name = NULL;
34 a.name = NULL; 34 a.val = NULL;
35 a.val = NULL; 35 a.def = NULL;
36 a.def = NULL; 36 return a;
37 return a; 37 }
38 } 38
39 39 int arg_match(struct arg *arg_, const struct arg_def *def, char **argv) {
40 int arg_match(struct arg *arg_, const struct arg_def *def, char **argv) 40 struct arg arg;
41 { 41
42 struct arg arg; 42 if (!argv[0] || argv[0][0] != '-')
43 43 return 0;
44 if (!argv[0] || argv[0][0] != '-') 44
45 return 0; 45 arg = arg_init(argv);
46 46
47 arg = arg_init(argv); 47 if (def->short_name
48 48 && strlen(arg.argv[0]) == strlen(def->short_name) + 1
49 if (def->short_name 49 && !strcmp(arg.argv[0] + 1, def->short_name)) {
50 && strlen(arg.argv[0]) == strlen(def->short_name) + 1 50
51 && !strcmp(arg.argv[0] + 1, def->short_name)) 51 arg.name = arg.argv[0] + 1;
52 { 52 arg.val = def->has_val ? arg.argv[1] : NULL;
53 53 arg.argv_step = def->has_val ? 2 : 1;
54 arg.name = arg.argv[0] + 1; 54 } else if (def->long_name) {
55 arg.val = def->has_val ? arg.argv[1] : NULL; 55 const size_t name_len = strlen(def->long_name);
56 arg.argv_step = def->has_val ? 2 : 1; 56
57 if (strlen(arg.argv[0]) >= name_len + 2
58 && arg.argv[0][1] == '-'
59 && !strncmp(arg.argv[0] + 2, def->long_name, name_len)
60 && (arg.argv[0][name_len + 2] == '='
61 || arg.argv[0][name_len + 2] == '\0')) {
62
63 arg.name = arg.argv[0] + 2;
64 arg.val = arg.name[name_len] == '=' ? arg.name + name_len + 1 : NULL;
65 arg.argv_step = 1;
57 } 66 }
67 }
68
69 if (arg.name && !arg.val && def->has_val)
70 die("Error: option %s requires argument.\n", arg.name);
71
72 if (arg.name && arg.val && !def->has_val)
73 die("Error: option %s requires no argument.\n", arg.name);
74
75 if (arg.name
76 && (arg.val || !def->has_val)) {
77 arg.def = def;
78 *arg_ = arg;
79 return 1;
80 }
81
82 return 0;
83 }
84
85
86 const char *arg_next(struct arg *arg) {
87 if (arg->argv[0])
88 arg->argv += arg->argv_step;
89
90 return *arg->argv;
91 }
92
93
94 char **argv_dup(int argc, const char **argv) {
95 char **new_argv = malloc((argc + 1) * sizeof(*argv));
96
97 memcpy(new_argv, argv, argc * sizeof(*argv));
98 new_argv[argc] = NULL;
99 return new_argv;
100 }
101
102
103 void arg_show_usage(FILE *fp, const struct arg_def *const *defs) {
104 char option_text[40] = {0};
105
106 for (; *defs; defs++) {
107 const struct arg_def *def = *defs;
108 char *short_val = def->has_val ? " <arg>" : "";
109 char *long_val = def->has_val ? "=<arg>" : "";
110
111 if (def->short_name && def->long_name) {
112 char *comma = def->has_val ? "," : ", ";
113
114 snprintf(option_text, 37, "-%s%s%s --%s%6s",
115 def->short_name, short_val, comma,
116 def->long_name, long_val);
117 } else if (def->short_name)
118 snprintf(option_text, 37, "-%s%s",
119 def->short_name, short_val);
58 else if (def->long_name) 120 else if (def->long_name)
59 { 121 snprintf(option_text, 37, " --%s%s",
60 const size_t name_len = strlen(def->long_name); 122 def->long_name, long_val);
61 123
62 if (strlen(arg.argv[0]) >= name_len + 2 124 fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
63 && arg.argv[0][1] == '-' 125
64 && !strncmp(arg.argv[0] + 2, def->long_name, name_len) 126 if (def->enums) {
65 && (arg.argv[0][name_len+2] == '=' 127 const struct arg_enum_list *listptr;
66 || arg.argv[0][name_len+2] == '\0')) 128
67 { 129 fprintf(fp, " %-37s\t ", "");
68 130
69 arg.name = arg.argv[0] + 2; 131 for (listptr = def->enums; listptr->name; listptr++)
70 arg.val = arg.name[name_len] == '=' ? arg.name + name_len + 1 : NULL ; 132 fprintf(fp, "%s%s", listptr->name,
71 arg.argv_step = 1; 133 listptr[1].name ? ", " : "\n");
72 }
73 } 134 }
74 135 }
75 if (arg.name && !arg.val && def->has_val) 136 }
76 die("Error: option %s requires argument.\n", arg.name); 137
77 138
78 if (arg.name && arg.val && !def->has_val) 139 unsigned int arg_parse_uint(const struct arg *arg) {
79 die("Error: option %s requires no argument.\n", arg.name); 140 long int rawval;
80 141 char *endptr;
81 if (arg.name 142
82 && (arg.val || !def->has_val)) 143 rawval = strtol(arg->val, &endptr, 10);
83 { 144
84 arg.def = def; 145 if (arg->val[0] != '\0' && endptr[0] == '\0') {
85 *arg_ = arg; 146 if (rawval >= 0 && rawval <= UINT_MAX)
86 return 1; 147 return rawval;
87 } 148
88 149 die("Option %s: Value %ld out of range for unsigned int\n",
89 return 0; 150 arg->name, rawval);
90 } 151 }
91 152
92 153 die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
93 const char *arg_next(struct arg *arg) 154 return 0;
94 { 155 }
95 if (arg->argv[0]) 156
96 arg->argv += arg->argv_step; 157
97 158 int arg_parse_int(const struct arg *arg) {
98 return *arg->argv; 159 long int rawval;
99 } 160 char *endptr;
100 161
101 162 rawval = strtol(arg->val, &endptr, 10);
102 char **argv_dup(int argc, const char **argv) 163
103 { 164 if (arg->val[0] != '\0' && endptr[0] == '\0') {
104 char **new_argv = malloc((argc + 1) * sizeof(*argv)); 165 if (rawval >= INT_MIN && rawval <= INT_MAX)
105 166 return rawval;
106 memcpy(new_argv, argv, argc * sizeof(*argv)); 167
107 new_argv[argc] = NULL; 168 die("Option %s: Value %ld out of range for signed int\n",
108 return new_argv; 169 arg->name, rawval);
109 } 170 }
110 171
111 172 die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
112 void arg_show_usage(FILE *fp, const struct arg_def *const *defs) 173 return 0;
113 { 174 }
114 char option_text[40] = {0}; 175
115 176
116 for (; *defs; defs++) 177 struct vpx_rational {
117 { 178 int num; /**< fraction numerator */
118 const struct arg_def *def = *defs; 179 int den; /**< fraction denominator */
119 char *short_val = def->has_val ? " <arg>" : "";
120 char *long_val = def->has_val ? "=<arg>" : "";
121
122 if (def->short_name && def->long_name)
123 {
124 char *comma = def->has_val ? "," : ", ";
125
126 snprintf(option_text, 37, "-%s%s%s --%s%6s",
127 def->short_name, short_val, comma,
128 def->long_name, long_val);
129 }
130 else if (def->short_name)
131 snprintf(option_text, 37, "-%s%s",
132 def->short_name, short_val);
133 else if (def->long_name)
134 snprintf(option_text, 37, " --%s%s",
135 def->long_name, long_val);
136
137 fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
138
139 if(def->enums)
140 {
141 const struct arg_enum_list *listptr;
142
143 fprintf(fp, " %-37s\t ", "");
144
145 for(listptr = def->enums; listptr->name; listptr++)
146 fprintf(fp, "%s%s", listptr->name,
147 listptr[1].name ? ", " : "\n");
148 }
149 }
150 }
151
152
153 unsigned int arg_parse_uint(const struct arg *arg)
154 {
155 long int rawval;
156 char *endptr;
157
158 rawval = strtol(arg->val, &endptr, 10);
159
160 if (arg->val[0] != '\0' && endptr[0] == '\0')
161 {
162 if (rawval >= 0 && rawval <= UINT_MAX)
163 return rawval;
164
165 die("Option %s: Value %ld out of range for unsigned int\n",
166 arg->name, rawval);
167 }
168
169 die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
170 return 0;
171 }
172
173
174 int arg_parse_int(const struct arg *arg)
175 {
176 long int rawval;
177 char *endptr;
178
179 rawval = strtol(arg->val, &endptr, 10);
180
181 if (arg->val[0] != '\0' && endptr[0] == '\0')
182 {
183 if (rawval >= INT_MIN && rawval <= INT_MAX)
184 return rawval;
185
186 die("Option %s: Value %ld out of range for signed int\n",
187 arg->name, rawval);
188 }
189
190 die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
191 return 0;
192 }
193
194
195 struct vpx_rational
196 {
197 int num; /**< fraction numerator */
198 int den; /**< fraction denominator */
199 }; 180 };
200 struct vpx_rational arg_parse_rational(const struct arg *arg) 181 struct vpx_rational arg_parse_rational(const struct arg *arg) {
201 { 182 long int rawval;
202 long int rawval; 183 char *endptr;
203 char *endptr; 184 struct vpx_rational rat;
204 struct vpx_rational rat; 185
205 186 /* parse numerator */
206 /* parse numerator */ 187 rawval = strtol(arg->val, &endptr, 10);
207 rawval = strtol(arg->val, &endptr, 10); 188
208 189 if (arg->val[0] != '\0' && endptr[0] == '/') {
209 if (arg->val[0] != '\0' && endptr[0] == '/') 190 if (rawval >= INT_MIN && rawval <= INT_MAX)
210 { 191 rat.num = rawval;
211 if (rawval >= INT_MIN && rawval <= INT_MAX) 192 else die("Option %s: Value %ld out of range for signed int\n",
212 rat.num = rawval; 193 arg->name, rawval);
213 else die("Option %s: Value %ld out of range for signed int\n", 194 } else die("Option %s: Expected / at '%c'\n", arg->name, *endptr);
214 arg->name, rawval); 195
215 } 196 /* parse denominator */
216 else die("Option %s: Expected / at '%c'\n", arg->name, *endptr); 197 rawval = strtol(endptr + 1, &endptr, 10);
217 198
218 /* parse denominator */ 199 if (arg->val[0] != '\0' && endptr[0] == '\0') {
219 rawval = strtol(endptr + 1, &endptr, 10); 200 if (rawval >= INT_MIN && rawval <= INT_MAX)
220 201 rat.den = rawval;
221 if (arg->val[0] != '\0' && endptr[0] == '\0') 202 else die("Option %s: Value %ld out of range for signed int\n",
222 { 203 arg->name, rawval);
223 if (rawval >= INT_MIN && rawval <= INT_MAX) 204 } else die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
224 rat.den = rawval; 205
225 else die("Option %s: Value %ld out of range for signed int\n", 206 return rat;
226 arg->name, rawval); 207 }
227 } 208
228 else die("Option %s: Invalid character '%c'\n", arg->name, *endptr); 209
229 210 int arg_parse_enum(const struct arg *arg) {
230 return rat; 211 const struct arg_enum_list *listptr;
231 } 212 long int rawval;
232 213 char *endptr;
233 214
234 int arg_parse_enum(const struct arg *arg) 215 /* First see if the value can be parsed as a raw value */
235 { 216 rawval = strtol(arg->val, &endptr, 10);
236 const struct arg_enum_list *listptr; 217 if (arg->val[0] != '\0' && endptr[0] == '\0') {
237 long int rawval; 218 /* Got a raw value, make sure it's valid */
238 char *endptr; 219 for (listptr = arg->def->enums; listptr->name; listptr++)
239 220 if (listptr->val == rawval)
240 /* First see if the value can be parsed as a raw value */ 221 return rawval;
241 rawval = strtol(arg->val, &endptr, 10); 222 }
242 if (arg->val[0] != '\0' && endptr[0] == '\0') 223
243 { 224 /* Next see if it can be parsed as a string */
244 /* Got a raw value, make sure it's valid */ 225 for (listptr = arg->def->enums; listptr->name; listptr++)
245 for(listptr = arg->def->enums; listptr->name; listptr++) 226 if (!strcmp(arg->val, listptr->name))
246 if(listptr->val == rawval) 227 return listptr->val;
247 return rawval; 228
248 } 229 die("Option %s: Invalid value '%s'\n", arg->name, arg->val);
249 230 return 0;
250 /* Next see if it can be parsed as a string */ 231 }
251 for(listptr = arg->def->enums; listptr->name; listptr++) 232
252 if(!strcmp(arg->val, listptr->name)) 233
253 return listptr->val; 234 int arg_parse_enum_or_int(const struct arg *arg) {
254 235 if (arg->def->enums)
255 die("Option %s: Invalid value '%s'\n", arg->name, arg->val); 236 return arg_parse_enum(arg);
256 return 0; 237 return arg_parse_int(arg);
257 } 238 }
258
259
260 int arg_parse_enum_or_int(const struct arg *arg)
261 {
262 if(arg->def->enums)
263 return arg_parse_enum(arg);
264 return arg_parse_int(arg);
265 }
OLDNEW
« libvpx.gyp ('K') | « source/libvpx/args.h ('k') | source/libvpx/build/make/Android.mk » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698