calendar_move_*() functions modified to properly handle leap years and

merged into calendar_move()
date_change() added
This commit is contained in:
Frederic Culot 2007-12-10 18:59:48 +00:00
parent 4227e47ae4
commit 2c4f7c9e27

View File

@ -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;
} }
/* /*