Patch from Bastian Blank to add 64 bit support to the test command.

Example of broken usage: ./busybox test 2147483648 -gt 2147483648
This commit is contained in:
Glenn L McGrath 2004-08-11 02:45:47 +00:00
parent d2c6f9a1f9
commit 73db8be80a
2 changed files with 35 additions and 14 deletions

View File

@ -455,6 +455,13 @@ if !CONFIG_ASH && !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH
and bash) have test builtin. and bash) have test builtin.
endif 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 config CONFIG_TOUCH
bool "touch" bool "touch"
default n default n

View File

@ -155,19 +155,25 @@ static const struct t_op {
0, 0, 0} 0, 0, 0}
}; };
#ifdef CONFIG_FEATURE_TEST_64
typedef int64_t arith_t;
#else
typedef int arith_t;
#endif
static char **t_wp; static char **t_wp;
static struct t_op const *t_wp_op; static struct t_op const *t_wp_op;
static gid_t *group_array = NULL; static gid_t *group_array = NULL;
static int ngroups; static int ngroups;
static enum token t_lex(char *s); static enum token t_lex(char *s);
static int oexpr(enum token n); static arith_t oexpr(enum token n);
static int aexpr(enum token n); static arith_t aexpr(enum token n);
static int nexpr(enum token n); static arith_t nexpr(enum token n);
static int binop(void); 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 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 newerf(const char *f1, const char *f2);
static int olderf(const char *f1, const char *f2); static int olderf(const char *f1, const char *f2);
static int equalf(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); res = aexpr(n);
if (t_lex(*++t_wp) == BOR) { if (t_lex(*++t_wp) == BOR) {
@ -244,9 +250,9 @@ static int oexpr(enum token n)
return res; return res;
} }
static int aexpr(enum token n) static arith_t aexpr(enum token n)
{ {
int res; arith_t res;
res = nexpr(n); res = nexpr(n);
if (t_lex(*++t_wp) == BAND) if (t_lex(*++t_wp) == BAND)
@ -255,16 +261,16 @@ static int aexpr(enum token n)
return res; return res;
} }
static int nexpr(enum token n) static arith_t nexpr(enum token n)
{ {
if (n == UNOT) if (n == UNOT)
return !nexpr(t_lex(*++t_wp)); return !nexpr(t_lex(*++t_wp));
return primary(n); return primary(n);
} }
static int primary(enum token n) static arith_t primary(enum token n)
{ {
int res; arith_t res;
if (n == EOI) { if (n == EOI) {
syntax(NULL, "argument expected"); syntax(NULL, "argument expected");
@ -441,13 +447,21 @@ static enum token t_lex(char *s)
} }
/* atoi with error detection */ /* atoi with error detection */
static int getn(const char *s) static arith_t getn(const char *s)
{ {
char *p; char *p;
#ifdef CONFIG_FEATURE_TEST_64
long long r;
#else
long r; long r;
#endif
errno = 0; errno = 0;
#ifdef CONFIG_FEATURE_TEST_64
r = strtoll(s, &p, 10);
#else
r = strtol(s, &p, 10); r = strtol(s, &p, 10);
#endif
if (errno != 0) if (errno != 0)
bb_error_msg_and_die("%s: out of range", s); 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))) if (*(bb_skip_whitespace(p)))
bb_error_msg_and_die("%s: bad number", s); bb_error_msg_and_die("%s: bad number", s);
return (int) r; return r;
} }
static int newerf(const char *f1, const char *f2) static int newerf(const char *f1, const char *f2)