Handle dates past January 19th, 2038

Try to support dates past year 2038 on systems with 64-bit time_t.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
This commit is contained in:
Lukas Fleischer 2015-01-19 23:47:55 +01:00
parent 4fd8f0b11e
commit a12833ec08
5 changed files with 36 additions and 13 deletions

View File

@ -310,7 +310,7 @@ date_arg_from_to(long from, long to, int add_line, const char *fmt_apt,
} }
} }
static int parse_datearg(const char *str) static long parse_datearg(const char *str)
{ {
struct date day; struct date day;
@ -329,7 +329,7 @@ static int parse_datearg(const char *str)
return -1; return -1;
} }
static int parse_datetimearg(const char *str) static long parse_datetimearg(const char *str)
{ {
char *date = mem_strdup(str); char *date = mem_strdup(str);
char *time; char *time;

View File

@ -630,9 +630,7 @@ void ui_calendar_change_day(int datefmt)
char *outstr; char *outstr;
int dday, dmonth, dyear; int dday, dmonth, dyear;
int wrong_day = 1; int wrong_day = 1;
const char *mesg_line1 = const char *mesg_line1 = _("The day you entered is not valid");
_("The day you entered is not valid "
"(should be between 01/01/1902 and 12/31/2037)");
const char *mesg_line2 = _("Press [ENTER] to continue"); const char *mesg_line2 = _("Press [ENTER] to continue");
const char *request_date = const char *request_date =
_("Enter the day to go to [ENTER for today] : %s"); _("Enter the day to go to [ENTER for today] : %s");
@ -739,10 +737,6 @@ void ui_calendar_move(enum move move, int count)
t.tm_mday = 1; t.tm_mday = 1;
t.tm_mon = 0; t.tm_mon = 0;
t.tm_year = 2; t.tm_year = 2;
} else if (t.tm_year > 137) {
t.tm_mday = 31;
t.tm_mon = 11;
t.tm_year = 137;
} }
slctd_day.dd = t.tm_mday; slctd_day.dd = t.tm_mday;

View File

@ -651,10 +651,8 @@ char *new_tempfile(const char *prefix)
*/ */
int check_date(unsigned year, unsigned month, unsigned day) int check_date(unsigned year, unsigned month, unsigned day)
{ {
return (year >= 1902 && year <= 2037 && month >= 1 && month <= 12 return (year >= 1902 && month >= 1 && month <= 12 && day >= 1 &&
&& day >= 1 && day <= days[month - 1] + (month == 2 day <= days[month - 1] + (month == 2 && ISLEAP(year)) ? 1 : 0);
&& ISLEAP(year)) ?
1 : 0);
} }
/* /*

4
test/data/apts-y2k38-001 Normal file
View File

@ -0,0 +1,4 @@
01/19/2038 [1] Event 1
01/20/2038 [1] Event 2
01/01/2100 [1] Event 3
01/01/9999 [1] Event 4

27
test/y2k38-001.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/sh
. "${TEST_INIT:-./test-init.sh}"
if [ "$1" = 'actual' ]; then
"$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/apts-y2k38-001" \
-d01/19/2038
"$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/apts-y2k38-001" \
-d01/20/2038
"$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/apts-y2k38-001" \
-d01/01/2100
"$CALCURSE" --read-only -D "$DATA_DIR"/ -c "$DATA_DIR/apts-y2k38-001" \
-d01/01/9999
elif [ "$1" = 'expected' ]; then
cat <<EOD
01/19/38:
* Event 1
01/20/38:
* Event 2
01/01/00:
* Event 3
01/01/99:
* Event 4
EOD
else
./run-test "$0"
fi