bin/date: Upgrade calculations

Use long instead of int for numerous calculations, fixing a number of
date calculation overflow issues.

Obtained from:	DragonflyBSD
Git log:	4238ce6f0c6df33ce677ae298b245c62cd60fb43 (only partial)
This commit is contained in:
Pedro F. Giffuni 2023-07-02 21:32:10 -05:00
parent ee8b0c436d
commit 4456846a1a

View file

@ -34,7 +34,7 @@ __FBSDID("$FreeBSD$");
#include "vary.h"
struct trans {
int val;
long val;
const char *str;
};
@ -52,7 +52,7 @@ static struct trans trans_wday[] = {
};
static char digits[] = "0123456789";
static int adjhour(struct tm *, char, int, int);
static int adjhour(struct tm *, char, long, int);
static int
domktime(struct tm *t, char type)
@ -125,7 +125,7 @@ daysinmonth(const struct tm *t)
static int
adjyear(struct tm *t, char type, int val, int mk)
adjyear(struct tm *t, char type, long val, int mk)
{
switch (type) {
case '+':
@ -146,7 +146,7 @@ adjyear(struct tm *t, char type, int val, int mk)
}
static int
adjmon(struct tm *t, char type, int val, int istext, int mk)
adjmon(struct tm *t, char type, long val, int istext, int mk)
{
int lmdays;
@ -206,7 +206,7 @@ adjmon(struct tm *t, char type, int val, int istext, int mk)
}
static int
adjday(struct tm *t, char type, int val, int mk)
adjday(struct tm *t, char type, long val, int mk)
{
int lmdays;
@ -250,7 +250,7 @@ adjday(struct tm *t, char type, int val, int mk)
}
static int
adjwday(struct tm *t, char type, int val, int istext, int mk)
adjwday(struct tm *t, char type, long val, int istext, int mk)
{
if (val < 0)
return 0;
@ -286,7 +286,7 @@ adjwday(struct tm *t, char type, int val, int istext, int mk)
}
static int
adjhour(struct tm *t, char type, int val, int mk)
adjhour(struct tm *t, char type, long val, int mk)
{
if (val < 0)
return 0;
@ -331,7 +331,7 @@ adjhour(struct tm *t, char type, int val, int mk)
}
static int
adjmin(struct tm *t, char type, int val, int mk)
adjmin(struct tm *t, char type, long val, int mk)
{
if (val < 0)
return 0;
@ -372,7 +372,7 @@ adjmin(struct tm *t, char type, int val, int mk)
}
static int
adjsec(struct tm *t, char type, int val, int mk)
adjsec(struct tm *t, char type, long val, int mk)
{
if (val < 0)
return 0;
@ -419,7 +419,7 @@ vary_apply(const struct vary *v, struct tm *t)
char which;
char *arg;
size_t len;
int val;
long val;
for (; v; v = v->next) {
type = *v->arg;