Open the source before creating the destination.
[oweals/busybox.git] / libbb / parse_number.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) many different people.  If you wrote this, please
6  * acknowledge your work.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21  * USA
22  */
23
24 #include <stdio.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include "libbb.h"
28
29
30 unsigned long parse_number(const char *numstr,
31                 const struct suffix_mult *suffixes)
32 {
33         const struct suffix_mult *sm;
34         unsigned long int ret;
35         int len;
36         char *end;
37         
38         ret = strtoul(numstr, &end, 10);
39         if (numstr == end)
40                 error_msg_and_die("invalid number `%s'", numstr);
41         while (end[0] != '\0') {
42                 sm = suffixes;
43                 while ( sm != 0 ) {
44                         if(sm->suffix) {
45                                 len = strlen(sm->suffix);
46                                 if (strncmp(sm->suffix, end, len) == 0) {
47                                         ret *= sm->mult;
48                                         end += len;
49                                         break;
50                                 }
51                         sm++;
52                         
53                         } else
54                                 sm = 0;
55                 }
56                 if (sm == 0)
57                         error_msg_and_die("invalid number `%s'", numstr);
58         }
59         return ret;
60 }
61
62
63 /* END CODE */
64 /*
65 Local Variables:
66 c-file-style: "linux"
67 c-basic-offset: 4
68 tab-width: 4
69 End:
70 */