Add atolx() which understands extensions for kilobytes and megabytes and such.
authorRob Landley <rob@landley.net>
Sat, 17 Feb 2007 02:08:22 +0000 (21:08 -0500)
committerRob Landley <rob@landley.net>
Sat, 17 Feb 2007 02:08:22 +0000 (21:08 -0500)
lib/args.c
lib/lib.c
lib/lib.h

index 2c17951..c9ade1e 100644 (file)
@@ -108,7 +108,7 @@ static void gotflag(void)
                        temp->arg = gof.arg;
                        temp->next = *list;
                        *list = temp;
-               } else if (type == '#') *(gof.this->arg) = atol((char *)gof.arg);
+               } else if (type == '#') *(gof.this->arg) = atolx((char *)gof.arg);
                else if (type == '@') {
                }
 
index f1d1ce1..6c8abb0 100644 (file)
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -402,6 +402,18 @@ char *itoa(int n)
        return itoa_buf;
 }
 
+// atol() with the kilo/mega/giga/tera/peta/exa extensions.
+// (zetta and yotta don't fit in 64 bits.)
+long atolx(char *c)
+{
+       char *suffixes="kmgtpe", *end;
+       long val = strtol(c, &c, 0);
+
+       end = strchr(suffixes, tolower(*c));
+       if (end) val *= 1024<<((end-suffixes)*10);
+       return val;
+}
+
 // Return how long the file at fd is, if there's any way to determine it.
 off_t fdlength(int fd)
 {
index 07cc9cd..e2d055b 100644 (file)
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -65,6 +65,7 @@ void utoa_to_buf(unsigned n, char *buf, unsigned buflen);
 void itoa_to_buf(int n, char *buf, unsigned buflen);
 char *utoa(unsigned n);
 char *itoa(int n);
+long atolx(char *c);
 off_t fdlength(int fd);
 struct dirtree *read_dirtree_node(char *path);
 struct dirtree *read_dirtree(char *path, struct dirtree *parent);