Commit 7695019bce7f0b552203229e7b89494462ac286f
Committed by
Anthony Liguori
1 parent
67b1355b
qemu-option: factor out parse_option_size
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
36 additions
and
26 deletions
qemu-option.c
... | ... | @@ -182,6 +182,40 @@ static int parse_option_bool(const char *name, const char *value, int *ret) |
182 | 182 | return 0; |
183 | 183 | } |
184 | 184 | |
185 | +static int parse_option_size(const char *name, const char *value, uint64_t *ret) | |
186 | +{ | |
187 | + char *postfix; | |
188 | + double sizef; | |
189 | + | |
190 | + if (value != NULL) { | |
191 | + sizef = strtod(value, &postfix); | |
192 | + switch (*postfix) { | |
193 | + case 'T': | |
194 | + sizef *= 1024; | |
195 | + case 'G': | |
196 | + sizef *= 1024; | |
197 | + case 'M': | |
198 | + sizef *= 1024; | |
199 | + case 'K': | |
200 | + case 'k': | |
201 | + sizef *= 1024; | |
202 | + case 'b': | |
203 | + case '\0': | |
204 | + *ret = (uint64_t) sizef; | |
205 | + break; | |
206 | + default: | |
207 | + fprintf(stderr, "Option '%s' needs size as parameter\n", name); | |
208 | + fprintf(stderr, "You may use k, M, G or T suffixes for " | |
209 | + "kilobytes, megabytes, gigabytes and terabytes.\n"); | |
210 | + return -1; | |
211 | + } | |
212 | + } else { | |
213 | + fprintf(stderr, "Option '%s' needs a parameter\n", name); | |
214 | + return -1; | |
215 | + } | |
216 | + return 0; | |
217 | +} | |
218 | + | |
185 | 219 | /* |
186 | 220 | * Sets the value of a parameter in a given option list. The parsing of the |
187 | 221 | * value depends on the type of option: |
... | ... | @@ -229,34 +263,10 @@ int set_option_parameter(QEMUOptionParameter *list, const char *name, |
229 | 263 | break; |
230 | 264 | |
231 | 265 | case OPT_SIZE: |
232 | - if (value != NULL) { | |
233 | - double sizef = strtod(value, (char**) &value); | |
234 | - | |
235 | - switch (*value) { | |
236 | - case 'T': | |
237 | - sizef *= 1024; | |
238 | - case 'G': | |
239 | - sizef *= 1024; | |
240 | - case 'M': | |
241 | - sizef *= 1024; | |
242 | - case 'K': | |
243 | - case 'k': | |
244 | - sizef *= 1024; | |
245 | - case 'b': | |
246 | - case '\0': | |
247 | - list->value.n = (uint64_t) sizef; | |
248 | - break; | |
249 | - default: | |
250 | - fprintf(stderr, "Option '%s' needs size as parameter\n", name); | |
251 | - fprintf(stderr, "You may use k, M, G or T suffixes for " | |
252 | - "kilobytes, megabytes, gigabytes and terabytes.\n"); | |
253 | - return -1; | |
254 | - } | |
255 | - } else { | |
256 | - fprintf(stderr, "Option '%s' needs a parameter\n", name); | |
266 | + if (-1 == parse_option_size(name, value, &list->value.n)) | |
257 | 267 | return -1; |
258 | - } | |
259 | 268 | break; |
269 | + | |
260 | 270 | default: |
261 | 271 | fprintf(stderr, "Bug: Option '%s' has an unknown type\n", name); |
262 | 272 | return -1; | ... | ... |