diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2007-07-05 18:02:12 +0200 |
---|---|---|
committer | Sascha Hauer <sha@octopus.labnet.pengutronix.de> | 2007-07-05 18:02:12 +0200 |
commit | 4a660c08776809ee08b1d0d62fbaf023080d03ae (patch) | |
tree | fe960131e7fbd051ca3d258ae3b7000ab3f90a3e /lib/misc.c | |
parent | 24e7509199bc627546fb213158ca04c891c04bc1 (diff) | |
download | barebox-4a660c08776809ee08b1d0d62fbaf023080d03ae.tar.gz barebox-4a660c08776809ee08b1d0d62fbaf023080d03ae.tar.xz |
svn_rev_639
Diffstat (limited to 'lib/misc.c')
-rw-r--r-- | lib/misc.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/lib/misc.c b/lib/misc.c new file mode 100644 index 0000000000..5a7a72cd58 --- /dev/null +++ b/lib/misc.c @@ -0,0 +1,122 @@ + +#include <common.h> +#include <command.h> +#include <driver.h> +#include <init.h> +#include <malloc.h> +#include <linux/ctype.h> +#include <errno.h> +#include <fs.h> +#include <net.h> + +int cmd_get_data_size(char* arg, int default_size) +{ + /* Check for a size specification .b, .w or .l. + */ + int len = strlen(arg); + if (len > 2 && arg[len-2] == '.') { + switch(arg[len-1]) { + case 'b': + return 1; + case 'w': + return 2; + case 'l': + return 4; + case 's': + return -2; + default: + return -1; + } + } + return default_size; +} + + +unsigned long strtoul_suffix(const char *str, char **endp, int base) +{ + unsigned long val; + char *end; + + val = simple_strtoul(str, &end, base); + + switch (*end) { + case 'G': + val *= 1024; + case 'M': + val *= 1024; + case 'k': + case 'K': + val *= 1024; + end++; + } + + if (endp) + *endp = (char *)end; + + return val; +} + +int parse_area_spec(const char *str, ulong *start, ulong *size) +{ + char *endp; + + if (*str == '+') { + /* no beginning given but size so start is 0 */ + *start = 0; + *size = strtoul_suffix(str + 1, &endp, 0); + return 0; + } + + if (*str == '-') { + /* no beginning given but end, so start is 0 */ + *start = 0; + *size = strtoul_suffix(str + 1, &endp, 0) + 1; + return 0; + } + + *start = strtoul_suffix(str, &endp, 0); + + str = endp; + + if (!*str) { + /* beginning given, but no size, assume maximum size */ + *size = ~0; + return 0; + } + + if (*str == '-') { + /* beginning and end given */ + *size = strtoul_suffix(str + 1, NULL, 0) + 1; + return 0; + } + + if (*str == '+') { + /* beginning and size given */ + *size = strtoul_suffix(str + 1, NULL, 0); + return 0; + } + + return -1; +} + +int spec_str_to_info(const char *str, struct memarea_info *info) +{ + char *endp; + int ret; + + info->device = device_from_spec_str(str, &endp); + if (!info->device) { + printf("unknown device: %s\n", deviceid_from_spec_str(str, NULL)); + return -ENODEV; + } + + ret = parse_area_spec(endp, &info->start, &info->size); + if (ret) + return ret; + + if (info->size == ~0) + info->size = info->device->size; + + return 0; +} + |