Patch from Bastian Blank to add 64 bit support to the test command.
authorGlenn L McGrath <bug1@ihug.co.nz>
Wed, 11 Aug 2004 02:45:47 +0000 (02:45 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Wed, 11 Aug 2004 02:45:47 +0000 (02:45 -0000)
Example of broken usage: ./busybox test 2147483648 -gt 2147483648

coreutils/Config.in
coreutils/test.c

index c995e55ff07dd397b18e9fc98a39eb92260ac6d8..e1f0516fdd9d11945502140243dd31dc7c172bee 100644 (file)
@@ -455,6 +455,13 @@ if !CONFIG_ASH && !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH
              and bash) have test builtin.
 endif
 
+config CONFIG_FEATURE_TEST_64
+       bool "  Extend test to 64 bit"
+       default n
+       depends on CONFIG_TEST
+       help
+         Enable 64-bit support in test.
+
 config CONFIG_TOUCH
        bool "touch"
        default n
index 419da5101898fefc3c2f28b3f7e1004bee859495..8fa6d166fb706509aacb3904a19ff4f9c955c176 100644 (file)
@@ -155,19 +155,25 @@ static const struct t_op {
        0, 0, 0}
 };
 
+#ifdef CONFIG_FEATURE_TEST_64
+typedef int64_t arith_t;
+#else
+typedef int arith_t;
+#endif
+
 static char **t_wp;
 static struct t_op const *t_wp_op;
 static gid_t *group_array = NULL;
 static int ngroups;
 
 static enum token t_lex(char *s);
-static int oexpr(enum token n);
-static int aexpr(enum token n);
-static int nexpr(enum token n);
+static arith_t oexpr(enum token n);
+static arith_t aexpr(enum token n);
+static arith_t nexpr(enum token n);
 static int binop(void);
-static int primary(enum token n);
+static arith_t primary(enum token n);
 static int filstat(char *nm, enum token mode);
-static int getn(const char *s);
+static arith_t getn(const char *s);
 static int newerf(const char *f1, const char *f2);
 static int olderf(const char *f1, const char *f2);
 static int equalf(const char *f1, const char *f2);
@@ -232,9 +238,9 @@ static void syntax(const char *op, const char *msg)
        }
 }
 
-static int oexpr(enum token n)
+static arith_t oexpr(enum token n)
 {
-       int res;
+       arith_t res;
 
        res = aexpr(n);
        if (t_lex(*++t_wp) == BOR) {
@@ -244,9 +250,9 @@ static int oexpr(enum token n)
        return res;
 }
 
-static int aexpr(enum token n)
+static arith_t aexpr(enum token n)
 {
-       int res;
+       arith_t res;
 
        res = nexpr(n);
        if (t_lex(*++t_wp) == BAND)
@@ -255,16 +261,16 @@ static int aexpr(enum token n)
        return res;
 }
 
-static int nexpr(enum token n)
+static arith_t nexpr(enum token n)
 {
        if (n == UNOT)
                return !nexpr(t_lex(*++t_wp));
        return primary(n);
 }
 
-static int primary(enum token n)
+static arith_t primary(enum token n)
 {
-       int res;
+       arith_t res;
 
        if (n == EOI) {
                syntax(NULL, "argument expected");
@@ -441,13 +447,21 @@ static enum token t_lex(char *s)
 }
 
 /* atoi with error detection */
-static int getn(const char *s)
+static arith_t getn(const char *s)
 {
        char *p;
+#ifdef CONFIG_FEATURE_TEST_64
+       long long r;
+#else
        long r;
+#endif
 
        errno = 0;
+#ifdef CONFIG_FEATURE_TEST_64
+       r = strtoll(s, &p, 10);
+#else
        r = strtol(s, &p, 10);
+#endif
 
        if (errno != 0)
                bb_error_msg_and_die("%s: out of range", s);
@@ -456,7 +470,7 @@ static int getn(const char *s)
        if (*(bb_skip_whitespace(p)))
                bb_error_msg_and_die("%s: bad number", s);
 
-       return (int) r;
+       return r;
 }
 
 static int newerf(const char *f1, const char *f2)