calendar_move_*() functions modified to properly handle leap years and
merged into calendar_move() date_change() added
This commit is contained in:
parent
4227e47ae4
commit
2c4f7c9e27
126
src/calendar.c
126
src/calendar.c
@ -1,4 +1,4 @@
|
|||||||
/* $calcurse: calendar.c,v 1.12 2007/10/21 13:42:34 culot Exp $ */
|
/* $calcurse: calendar.c,v 1.13 2007/12/10 18:59:48 culot Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calcurse - text-based organizer
|
* Calcurse - text-based organizer
|
||||||
@ -394,79 +394,73 @@ calendar_change_day(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move to next day, next month or next year in calendar. */
|
/*
|
||||||
void
|
* Used to change date by adding a certain amount of days or weeks.
|
||||||
calendar_move_right(void)
|
* Returns 0 on success, 1 otherwise.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
date_change(struct tm *date, int delta_month, int delta_day)
|
||||||
{
|
{
|
||||||
if ((slctd_day.dd == 31) && (slctd_day.mm == 12) &&
|
struct tm t;
|
||||||
(slctd_day.yyyy == 2037))
|
|
||||||
return;
|
t = *date;
|
||||||
else if ((slctd_day.dd == 31) && (slctd_day.mm == 12)) {
|
t.tm_mon += delta_month;
|
||||||
slctd_day.dd = 0;
|
t.tm_mday += delta_day;
|
||||||
slctd_day.mm = 1;
|
|
||||||
slctd_day.yyyy++;
|
if (mktime(&t) == -1)
|
||||||
} else if (slctd_day.dd == days[slctd_day.mm - 1]) {
|
return (1);
|
||||||
slctd_day.mm++;
|
else {
|
||||||
slctd_day.dd = 1;
|
*date = t;
|
||||||
} else
|
return (0);
|
||||||
slctd_day.dd++;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move to previous day, previous month or previous year in calendar. */
|
|
||||||
void
|
void
|
||||||
calendar_move_left(void)
|
calendar_move(move_t move)
|
||||||
{
|
{
|
||||||
if ((slctd_day.dd == 1) && (slctd_day.mm == 1) &&
|
int ret;
|
||||||
(slctd_day.yyyy == 1902))
|
struct tm t;
|
||||||
return;
|
|
||||||
else if ((slctd_day.dd == 1) && (slctd_day.mm == 1)) {
|
|
||||||
slctd_day.dd = 32;
|
|
||||||
slctd_day.mm = 12;
|
|
||||||
slctd_day.yyyy--;
|
|
||||||
} else if (slctd_day.dd == 1) {
|
|
||||||
slctd_day.dd = days[slctd_day.mm - 2];
|
|
||||||
slctd_day.mm--;
|
|
||||||
} else
|
|
||||||
slctd_day.dd--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Move to previous week, previous month or previous year in calendar. */
|
memset(&t, 0, sizeof(struct tm));
|
||||||
void
|
t.tm_mday = slctd_day.dd;
|
||||||
calendar_move_up(void)
|
t.tm_mon = slctd_day.mm - 1;
|
||||||
{
|
t.tm_year = slctd_day.yyyy - 1900;
|
||||||
if ((slctd_day.dd <= 7) && (slctd_day.mm == 1) &&
|
|
||||||
(slctd_day.yyyy == 1902))
|
|
||||||
return;
|
|
||||||
else if ((slctd_day.dd <= 7) && (slctd_day.mm == 1)) {
|
|
||||||
slctd_day.dd = 31 - (7 - slctd_day.dd);
|
|
||||||
slctd_day.mm = 12;
|
|
||||||
slctd_day.yyyy--;
|
|
||||||
} else if (slctd_day.dd <= 7) {
|
|
||||||
slctd_day.dd = days[slctd_day.mm - 2] -
|
|
||||||
(7 - slctd_day.dd);
|
|
||||||
slctd_day.mm--;
|
|
||||||
} else
|
|
||||||
slctd_day.dd -= 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Move to next week, next month or next year in calendar. */
|
switch (move) {
|
||||||
void
|
case UP:
|
||||||
calendar_move_down(void)
|
if ((slctd_day.dd <= 7) && (slctd_day.mm == 1) &&
|
||||||
{
|
(slctd_day.yyyy == 1902))
|
||||||
|
return;
|
||||||
|
ret = date_change(&t, 0, -WEEKINDAYS);
|
||||||
|
break;
|
||||||
|
case DOWN:
|
||||||
|
if ((slctd_day.dd > days[slctd_day.mm - 1] - 7)
|
||||||
|
&& (slctd_day.mm == 12) && (slctd_day.yyyy == 2037))
|
||||||
|
return;
|
||||||
|
ret = date_change(&t, 0, WEEKINDAYS);
|
||||||
|
break;
|
||||||
|
case LEFT:
|
||||||
|
if ((slctd_day.dd == 1) && (slctd_day.mm == 1) &&
|
||||||
|
(slctd_day.yyyy == 1902))
|
||||||
|
return;
|
||||||
|
ret = date_change(&t, 0, -1);
|
||||||
|
break;
|
||||||
|
case RIGHT:
|
||||||
|
if ((slctd_day.dd == 31) && (slctd_day.mm == 12) &&
|
||||||
|
(slctd_day.yyyy == 2037))
|
||||||
|
return;
|
||||||
|
ret = date_change(&t, 0, 1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret = 1;
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
if ((slctd_day.dd > days[slctd_day.mm - 1] - 7)
|
if (ret == 0) {
|
||||||
&& (slctd_day.mm == 12) && (slctd_day.yyyy == 2037))
|
slctd_day.dd = t.tm_mday;
|
||||||
return;
|
slctd_day.mm = t.tm_mon + 1;
|
||||||
else if ((slctd_day.dd > days[slctd_day.mm - 1] - 7)
|
slctd_day.yyyy = t.tm_year + 1900;
|
||||||
&& (slctd_day.mm == 12)) {
|
}
|
||||||
slctd_day.dd = (7 - (31 - slctd_day.dd));
|
|
||||||
slctd_day.mm = 1;
|
|
||||||
slctd_day.yyyy++;
|
|
||||||
} else if (slctd_day.dd > days[slctd_day.mm - 1] - 7) {
|
|
||||||
slctd_day.dd = (7 - (days[slctd_day.mm - 1] - slctd_day.dd));
|
|
||||||
slctd_day.mm++;
|
|
||||||
} else
|
|
||||||
slctd_day.dd += 7;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user