diff options
author | Tobias Stoeckmann <tobias@cvs.openbsd.org> | 2018-04-09 17:53:37 +0000 |
---|---|---|
committer | Tobias Stoeckmann <tobias@cvs.openbsd.org> | 2018-04-09 17:53:37 +0000 |
commit | 7ae1233120b38422f81a59bacc318bd84cef8c0d (patch) | |
tree | ab48dade145a01c7a353f7bacb267a448dea421b | |
parent | d988e6496b65d119543ad814244e09724611c26b (diff) |
Support 64 bit integers on 32 bit architectures.
No binary change on amd64 and there should be no differences on any
other 64 bit architecture either (because long = int64_t).
ok cheloha, tb
-rw-r--r-- | bin/ksh/c_ksh.c | 4 | ||||
-rw-r--r-- | bin/ksh/c_sh.c | 4 | ||||
-rw-r--r-- | bin/ksh/c_test.c | 4 | ||||
-rw-r--r-- | bin/ksh/c_ulimit.c | 7 | ||||
-rw-r--r-- | bin/ksh/edit.c | 6 | ||||
-rw-r--r-- | bin/ksh/eval.c | 4 | ||||
-rw-r--r-- | bin/ksh/expr.c | 6 | ||||
-rw-r--r-- | bin/ksh/mail.c | 4 | ||||
-rw-r--r-- | bin/ksh/main.c | 4 | ||||
-rw-r--r-- | bin/ksh/misc.c | 6 | ||||
-rw-r--r-- | bin/ksh/sh.h | 14 | ||||
-rw-r--r-- | bin/ksh/table.h | 4 | ||||
-rw-r--r-- | bin/ksh/tree.c | 8 | ||||
-rw-r--r-- | bin/ksh/var.c | 44 | ||||
-rw-r--r-- | regress/bin/ksh/integer.t | 11 |
15 files changed, 72 insertions, 58 deletions
diff --git a/bin/ksh/c_ksh.c b/bin/ksh/c_ksh.c index 87aedf611d7..327f627dc41 100644 --- a/bin/ksh/c_ksh.c +++ b/bin/ksh/c_ksh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: c_ksh.c,v 1.59 2018/03/15 16:51:29 anton Exp $ */ +/* $OpenBSD: c_ksh.c,v 1.60 2018/04/09 17:53:36 tobias Exp $ */ /* * built-in Korn commands: c_* @@ -1017,7 +1017,7 @@ int c_let(char **wp) { int rv = 1; - long val; + int64_t val; if (wp[1] == NULL) /* at&t ksh does this */ bi_errorf("no arguments"); diff --git a/bin/ksh/c_sh.c b/bin/ksh/c_sh.c index 6adacef4010..b051022fe32 100644 --- a/bin/ksh/c_sh.c +++ b/bin/ksh/c_sh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: c_sh.c,v 1.62 2017/12/27 13:02:57 millert Exp $ */ +/* $OpenBSD: c_sh.c,v 1.63 2018/04/09 17:53:36 tobias Exp $ */ /* * built-in Bourne commands @@ -33,7 +33,7 @@ c_shift(char **wp) { struct block *l = genv->loc; int n; - long val; + int64_t val; char *arg; if (ksh_getopt(wp, &builtin_opt, null) == '?') diff --git a/bin/ksh/c_test.c b/bin/ksh/c_test.c index 818bda8fbf6..911f2bf0404 100644 --- a/bin/ksh/c_test.c +++ b/bin/ksh/c_test.c @@ -1,4 +1,4 @@ -/* $OpenBSD: c_test.c,v 1.24 2017/12/26 19:10:31 millert Exp $ */ +/* $OpenBSD: c_test.c,v 1.25 2018/04/09 17:53:36 tobias Exp $ */ /* * test(1); version 7-like -- author Erik Baalbergen @@ -308,7 +308,7 @@ test_eval(Test_env *te, Test_op op, const char *opnd1, const char *opnd2, case TO_INTLE: /* -le */ case TO_INTLT: /* -lt */ { - long v1, v2; + int64_t v1, v2; if (!evaluate(opnd1, &v1, KSH_RETURN_ERROR, false) || !evaluate(opnd2, &v2, KSH_RETURN_ERROR, false)) { diff --git a/bin/ksh/c_ulimit.c b/bin/ksh/c_ulimit.c index 2dd36672ac8..1ba64f46707 100644 --- a/bin/ksh/c_ulimit.c +++ b/bin/ksh/c_ulimit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: c_ulimit.c,v 1.27 2018/03/15 16:51:29 anton Exp $ */ +/* $OpenBSD: c_ulimit.c,v 1.28 2018/04/09 17:53:36 tobias Exp $ */ /* ulimit -- handle "ulimit" builtin @@ -22,6 +22,7 @@ #include <ctype.h> #include <errno.h> +#include <inttypes.h> #include <string.h> #include "sh.h" @@ -139,7 +140,7 @@ set_ulimit(const struct limits *l, const char *v, int how) if (strcmp(v, "unlimited") == 0) val = RLIM_INFINITY; else { - long rval; + int64_t rval; if (!evaluate(v, &rval, KSH_RETURN_ERROR, false)) return 1; @@ -187,6 +188,6 @@ print_ulimit(const struct limits *l, int how) shprintf("unlimited\n"); else { val /= l->factor; - shprintf("%ld\n", (long) val); + shprintf("%" PRIi64 "\n", (int64_t) val); } } diff --git a/bin/ksh/edit.c b/bin/ksh/edit.c index d9ccc4a22d3..42514b9ec76 100644 --- a/bin/ksh/edit.c +++ b/bin/ksh/edit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: edit.c,v 1.64 2018/03/15 16:51:29 anton Exp $ */ +/* $OpenBSD: edit.c,v 1.65 2018/04/09 17:53:36 tobias Exp $ */ /* * Command line editing - common code @@ -80,10 +80,10 @@ check_sigwinch(void) ws.ws_col; if ((vp = typeset("COLUMNS", 0, 0, 0, 0))) - setint(vp, (long) ws.ws_col); + setint(vp, (int64_t) ws.ws_col); } if (ws.ws_row && (vp = typeset("LINES", 0, 0, 0, 0))) - setint(vp, (long) ws.ws_row); + setint(vp, (int64_t) ws.ws_row); } } } diff --git a/bin/ksh/eval.c b/bin/ksh/eval.c index a8dc698bd44..03b10eef642 100644 --- a/bin/ksh/eval.c +++ b/bin/ksh/eval.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eval.c,v 1.59 2018/01/16 22:52:32 jca Exp $ */ +/* $OpenBSD: eval.c,v 1.60 2018/04/09 17:53:36 tobias Exp $ */ /* * Expansion - quoting, separation, substitution, globbing @@ -732,7 +732,7 @@ varsub(Expand *xp, char *sp, char *word, if (Flag(FNOUNSET) && c == 0 && !zero_ok) errorf("%s: parameter not set", sp); *stypep = 0; /* unqualified variable/string substitution */ - xp->str = str_save(ulton((unsigned long)c, 10), ATEMP); + xp->str = str_save(u64ton((uint64_t)c, 10), ATEMP); return XSUB; } diff --git a/bin/ksh/expr.c b/bin/ksh/expr.c index 3d37593e6dc..fd2f4be935c 100644 --- a/bin/ksh/expr.c +++ b/bin/ksh/expr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: expr.c,v 1.32 2015/12/30 09:07:00 tedu Exp $ */ +/* $OpenBSD: expr.c,v 1.33 2018/04/09 17:53:36 tobias Exp $ */ /* * Korn expression evaluation @@ -148,7 +148,7 @@ static struct tbl *intvar(Expr_state *, struct tbl *); * parse and evaluate expression */ int -evaluate(const char *expr, long int *rval, int error_ok, bool arith) +evaluate(const char *expr, int64_t *rval, int error_ok, bool arith) { struct tbl v; int ret; @@ -280,7 +280,7 @@ evalexpr(Expr_state *es, enum prec prec) { struct tbl *vl, *vr = NULL, *vasn; enum token op; - long res = 0; + int64_t res = 0; if (prec == P_PRIMARY) { op = es->tok; diff --git a/bin/ksh/mail.c b/bin/ksh/mail.c index 3f642566f49..0f38541c5f1 100644 --- a/bin/ksh/mail.c +++ b/bin/ksh/mail.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mail.c,v 1.22 2015/10/19 14:42:16 mmcc Exp $ */ +/* $OpenBSD: mail.c,v 1.23 2018/04/09 17:53:36 tobias Exp $ */ /* * Mailbox checking code by Robert J. Gibson, adapted for PD ksh by @@ -81,7 +81,7 @@ mcheck(void) } void -mcset(long int interval) +mcset(int64_t interval) { mailcheck_interval = interval; } diff --git a/bin/ksh/main.c b/bin/ksh/main.c index 62d8180864b..047c9849e3b 100644 --- a/bin/ksh/main.c +++ b/bin/ksh/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.90 2018/03/15 16:51:29 anton Exp $ */ +/* $OpenBSD: main.c,v 1.91 2018/04/09 17:53:36 tobias Exp $ */ /* * startup, main loop, environments and error handling @@ -287,7 +287,7 @@ main(int argc, char *argv[]) setstr(pwd_v, current_wd, KSH_RETURN_ERROR); } ppid = getppid(); - setint(global("PPID"), (long) ppid); + setint(global("PPID"), (int64_t) ppid); /* setstr can't fail here */ setstr(global(version_param), ksh_version, KSH_RETURN_ERROR); diff --git a/bin/ksh/misc.c b/bin/ksh/misc.c index 7cc5a165c74..079276feec9 100644 --- a/bin/ksh/misc.c +++ b/bin/ksh/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.69 2018/03/15 16:51:29 anton Exp $ */ +/* $OpenBSD: misc.c,v 1.70 2018/04/09 17:53:36 tobias Exp $ */ /* * Miscellaneous functions @@ -56,10 +56,10 @@ initctypes(void) setctypes(" \n\t\"#$&'()*;<>?[\\`|", C_QUOTE); } -/* convert unsigned long to base N string */ +/* convert uint64_t to base N string */ char * -ulton(long unsigned int n, int base) +u64ton(uint64_t n, int base) { char *p; static char buf [20]; diff --git a/bin/ksh/sh.h b/bin/ksh/sh.h index b14290bf933..d665b5cd1c5 100644 --- a/bin/ksh/sh.h +++ b/bin/ksh/sh.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sh.h,v 1.71 2018/01/16 22:52:32 jca Exp $ */ +/* $OpenBSD: sh.h,v 1.72 2018/04/09 17:53:36 tobias Exp $ */ /* * Public Domain Bourne/Korn shell @@ -440,7 +440,7 @@ int search_access(const char *, int, int *); int pr_menu(char *const *); int pr_list(char *const *); /* expr.c */ -int evaluate(const char *, long *, int, bool); +int evaluate(const char *, int64_t *, int, bool); int v_evaluate(struct tbl *, const char *, volatile int, bool); /* history.c */ void init_histvec(void); @@ -512,7 +512,7 @@ pid_t j_async(void); int j_stopped_running(void); /* mail.c */ void mcheck(void); -void mcset(long); +void mcset(int64_t); void mbset(char *); void mpset(char *); /* main.c */ @@ -527,7 +527,7 @@ void cleanup_proc_env(void); /* misc.c */ void setctypes(const char *, int); void initctypes(void); -char * ulton(unsigned long, int); +char * u64ton(uint64_t, int); char * str_save(const char *, Area *); char * str_nsave(const char *, int, Area *); int option(const char *); @@ -583,11 +583,11 @@ void initvar(void); struct tbl * global(const char *); struct tbl * local(const char *, bool); char * str_val(struct tbl *); -long intval(struct tbl *); +int64_t intval(struct tbl *); int setstr(struct tbl *, const char *, int); struct tbl *setint_v(struct tbl *, struct tbl *, bool); -void setint(struct tbl *, long); -int getint(struct tbl *, long *, bool); +void setint(struct tbl *, int64_t); +int getint(struct tbl *, int64_t *, bool); struct tbl *typeset(const char *, int, int, int, int); void unset(struct tbl *, int); char * skip_varname(const char *, int); diff --git a/bin/ksh/table.h b/bin/ksh/table.h index 063ae8f9534..04df8de2666 100644 --- a/bin/ksh/table.h +++ b/bin/ksh/table.h @@ -1,4 +1,4 @@ -/* $OpenBSD: table.h,v 1.13 2017/12/27 13:02:57 millert Exp $ */ +/* $OpenBSD: table.h,v 1.14 2018/04/09 17:53:36 tobias Exp $ */ /* $From: table.h,v 1.3 1994/05/31 13:34:34 michael Exp $ */ @@ -19,7 +19,7 @@ struct tbl { /* table item */ Area *areap; /* area to allocate from */ union { char *s; /* string */ - long i; /* integer */ + int64_t i; /* integer */ int (*f)(char **); /* int function */ struct op *t; /* "function" tree */ } val; /* value */ diff --git a/bin/ksh/tree.c b/bin/ksh/tree.c index 172a416a097..e3ba260ca8a 100644 --- a/bin/ksh/tree.c +++ b/bin/ksh/tree.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tree.c,v 1.33 2018/03/15 16:51:29 anton Exp $ */ +/* $OpenBSD: tree.c,v 1.34 2018/04/09 17:53:36 tobias Exp $ */ /* * command tree climbing @@ -365,7 +365,7 @@ vfptreef(struct shf *shf, int indent, const char *fmt, va_list va) while ((c = *fmt++)) { if (c == '%') { - long n; + int64_t n; char *p; int neg; @@ -376,7 +376,7 @@ vfptreef(struct shf *shf, int indent, const char *fmt, va_list va) case 'd': /* decimal */ n = va_arg(va, int); neg = n < 0; - p = ulton(neg ? -n : n, 10); + p = u64ton(neg ? -n : n, 10); if (neg) *--p = '-'; while (*p) @@ -392,7 +392,7 @@ vfptreef(struct shf *shf, int indent, const char *fmt, va_list va) tputS(p, shf); break; case 'u': /* unsigned decimal */ - p = ulton(va_arg(va, unsigned int), 10); + p = u64ton(va_arg(va, unsigned int), 10); while (*p) tputc(*p++, shf); break; diff --git a/bin/ksh/var.c b/bin/ksh/var.c index 6761358b953..ad1e8947a92 100644 --- a/bin/ksh/var.c +++ b/bin/ksh/var.c @@ -1,9 +1,10 @@ -/* $OpenBSD: var.c,v 1.66 2018/03/15 16:51:29 anton Exp $ */ +/* $OpenBSD: var.c,v 1.67 2018/04/09 17:53:36 tobias Exp $ */ #include <sys/stat.h> #include <ctype.h> #include <errno.h> +#include <inttypes.h> #include <limits.h> #include <stdlib.h> #include <string.h> @@ -136,7 +137,7 @@ array_index_calc(const char *n, bool *arrayp, int *valp) p = skip_varname(n, false); if (p != n && *p == '[' && (len = array_ref_len(p))) { char *sub, *tmp; - long rval; + int64_t rval; /* Calculate the value of the subscript */ *arrayp = true; @@ -146,7 +147,8 @@ array_index_calc(const char *n, bool *arrayp, int *valp) n = str_nsave(n, p - n, ATEMP); evaluate(sub, &rval, KSH_UNWIND_ERROR, true); if (rval < 0 || rval > INT_MAX) - errorf("%s: subscript %ld out of range", n, rval); + errorf("%s: subscript %" PRIi64 " out of range", + n, rval); *valp = rval; afree(sub, ATEMP); } @@ -295,18 +297,18 @@ str_val(struct tbl *vp) else if (!(vp->flag&INTEGER)) /* string source */ s = vp->val.s + vp->type; else { /* integer source */ - /* worst case number length is when base=2, so use BITS(long) */ - /* minus base # number null */ - char strbuf[1 + 2 + 1 + BITS(long) + 1]; + /* worst case number length is when base=2, so use + * minus base # number BITS(int64_t) NUL */ + char strbuf[1 + 2 + 1 + BITS(int64_t) + 1]; const char *digits = (vp->flag & UCASEV_AL) ? "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" : "0123456789abcdefghijklmnopqrstuvwxyz"; - unsigned long n; + uint64_t n; unsigned int base; s = strbuf + sizeof(strbuf); if (vp->flag & INT_U) - n = (unsigned long) vp->val.i; + n = (uint64_t) vp->val.i; else n = (vp->val.i < 0) ? -vp->val.i : vp->val.i; base = (vp->type == 0) ? 10 : vp->type; @@ -335,10 +337,10 @@ str_val(struct tbl *vp) } /* get variable integer value, with error checking */ -long +int64_t intval(struct tbl *vp) { - long num; + int64_t num; int base; base = getint(vp, &num, false); @@ -393,7 +395,7 @@ setstr(struct tbl *vq, const char *s, int error_ok) /* set variable to integer */ void -setint(struct tbl *vq, long int n) +setint(struct tbl *vq, int64_t n) { if (!(vq->flag&INTEGER)) { struct tbl *vp = &vtemp; @@ -411,13 +413,13 @@ setint(struct tbl *vq, long int n) } int -getint(struct tbl *vp, long int *nump, bool arith) +getint(struct tbl *vp, int64_t *nump, bool arith) { char *s; int c; int base, neg; int have_base = 0; - long num; + int64_t num; if (vp->flag&SPECIAL) getspec(vp); @@ -483,7 +485,7 @@ struct tbl * setint_v(struct tbl *vq, struct tbl *vp, bool arith) { int base; - long num; + int64_t num; if ((base = getint(vp, &num, arith)) == -1) return NULL; @@ -920,27 +922,27 @@ getspec(struct tbl *vp) * (see initcoms[] in main.c). */ if (vp->flag & ISSET) - setint(vp, (long)(time(NULL) - seconds)); /* XXX 2038 */ + setint(vp, (int64_t)(time(NULL) - seconds)); vp->flag |= SPECIAL; break; case V_RANDOM: vp->flag &= ~SPECIAL; - setint(vp, (long) (rand() & 0x7fff)); + setint(vp, (int64_t) (rand() & 0x7fff)); vp->flag |= SPECIAL; break; case V_HISTSIZE: vp->flag &= ~SPECIAL; - setint(vp, (long) histsize); + setint(vp, (int64_t) histsize); vp->flag |= SPECIAL; break; case V_OPTIND: vp->flag &= ~SPECIAL; - setint(vp, (long) user_opt.uoptind); + setint(vp, (int64_t) user_opt.uoptind); vp->flag |= SPECIAL; break; case V_LINENO: vp->flag &= ~SPECIAL; - setint(vp, (long) current_lineno + user_lineno); + setint(vp, (int64_t) current_lineno + user_lineno); vp->flag |= SPECIAL; break; } @@ -1004,7 +1006,7 @@ setspec(struct tbl *vp) break; case V_COLUMNS: { - long l; + int64_t l; if (getint(vp, &l, false) == -1) { x_cols = MIN_COLS; @@ -1034,7 +1036,7 @@ setspec(struct tbl *vp) break; case V_SECONDS: vp->flag &= ~SPECIAL; - seconds = time(NULL) - intval(vp); /* XXX 2038 */ + seconds = time(NULL) - intval(vp); vp->flag |= SPECIAL; break; case V_TMOUT: diff --git a/regress/bin/ksh/integer.t b/regress/bin/ksh/integer.t index 4d19c447e6a..53c2454e3af 100644 --- a/regress/bin/ksh/integer.t +++ b/regress/bin/ksh/integer.t @@ -216,3 +216,14 @@ expected-stdout: 64 --- +name: integer-1 +description: + Check that 64 bit integers get assigned +stdin: + echo $(( zz = 0x7fffffffffffffff)) + echo $zz +expected-stdout: + 9223372036854775807 + 9223372036854775807 +--- + |