svn commit: r201560 - user/edwin/calendar
Edwin Groothuis
edwin at FreeBSD.org
Tue Jan 5 06:34:20 UTC 2010
Author: edwin
Date: Tue Jan 5 06:34:20 2010
New Revision: 201560
URL: http://svn.freebsd.org/changeset/base/201560
Log:
Add support for Easter and Paskha back in.
Remove lots of old code, #ifdeffed out for a long time already.
Modified:
user/edwin/calendar/parsedata.c
Modified: user/edwin/calendar/parsedata.c
==============================================================================
--- user/edwin/calendar/parsedata.c Tue Jan 5 06:21:29 2010 (r201559)
+++ user/edwin/calendar/parsedata.c Tue Jan 5 06:34:20 2010 (r201560)
@@ -42,6 +42,7 @@ static char *getdayofweekname(int i);
static int checkdayofweek(char *s, int *len, int *offset, char **dow);
static int isonlydigits(char *s, int nostar);
static int indextooffset(char *s);
+static int parseoffset(char *s);
/*
* Expected styles:
@@ -320,6 +321,7 @@ parsedaymonth(char *date, int *yearp, in
char month[100], dayofmonth[100], dayofweek[100], modifieroffset[100];
char modifierindex[100], specialday[100];
int idayofweek, imonth, idayofmonth, year, index;
+ int ieaster, ipaskha;
int *mondays, d, m, dow, rm, rd, offset;
@@ -355,6 +357,7 @@ parsedaymonth(char *date, int *yearp, in
index = 0;
for (year = year1; year <= year2; year++) {
mondays = mondaytab[isleap(year)];
+ ieaster = easter(year);
/* Same day every year */
if (*flags == (F_MONTH | F_DAYOFMONTH)) {
@@ -459,6 +462,30 @@ parsedaymonth(char *date, int *yearp, in
continue;
}
+ /* Easter */
+ if ((*flags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_EASTER)) {
+ offset = 0;
+ if ((*flags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year, ieaster + offset, &rm, &rd))
+ remember(index++, yearp, monthp, dayp,
+ year, rm, rd);
+ continue;
+ }
+
+ /* Paskha */
+ if ((*flags & ~F_MODIFIEROFFSET) ==
+ (F_SPECIALDAY | F_VARIABLE | F_PASKHA)) {
+ offset = 0;
+ if ((*flags & F_MODIFIEROFFSET) != 0)
+ offset = parseoffset(modifieroffset);
+ if (remember_yd(year, ipaskha + offset, &rm, &rd))
+ remember(index++, yearp, monthp, dayp,
+ year, rm, rd);
+ continue;
+ }
+
printf("Unprocessed:\n");
debug_determinestyle(2, date, *flags, month, imonth,
dayofmonth, idayofmonth, dayofweek, idayofweek,
@@ -467,175 +494,6 @@ parsedaymonth(char *date, int *yearp, in
}
return (index);
-
-#ifdef NOTDEF
- if (!(v1 = getfield(date, &flags)))
- return (0);
-
- /* Easter or Easter depending days */
- if (flags & F_EASTER)
- day = v1 - 1; /* days since January 1 [0-365] */
-
- /*
- * 1. {Weekday,Day} XYZ ...
- *
- * where Day is > 12
- */
- else if (flags & F_ISDAY || v1 > 12) {
-
- /* found a day; day: 1-31 or weekday: 1-7 */
- day = v1;
-
- /* {Day,Weekday} {Month,Monthname} ... */
- /* if no recognizable month, assume just a day alone
- * in other words, find month or use current month */
- if (!(month = getfield(endp, &flags)))
- month = tp->tm_mon + 1;
- }
-
- /* 2. {Monthname} XYZ ... */
- else if (flags & F_ISMONTH) {
- month = v1;
-
- /* Monthname {day,weekday} */
- /* if no recognizable day, assume the first day in month */
- if (!(day = getfield(endp, &flags)))
- day = 1;
- }
-
- /* Hm ... */
- else {
- v2 = getfield(endp, &flags);
-
- /*
- * {Day} {Monthname} ...
- * where Day <= 12
- */
- if (flags & F_ISMONTH) {
- day = v1;
- month = v2;
- *varp = 0;
- }
-
- /* {Month} {Weekday,Day} ... */
- else {
- /* F_ISDAY set, v2 > 12, or no way to tell */
- month = v1;
- /* if no recognizable day, assume the first */
- day = v2 ? v2 : 1;
- *varp = 0;
- }
- }
-
- /* convert Weekday into *next* Day,
- * e.g.: 'Sunday' -> 22
- * 'SundayLast' -> ??
- */
- if (flags & F_ISDAY) {
-#ifdef DEBUG
- fprintf(stderr, "\nday: %d %s month %d\n", day, endp, month);
-#endif
-
- *varp = 1;
- /* variable weekday, SundayLast, MondayFirst ... */
- if (day < 0 || day >= 10) {
-
- /* negative offset; last, -4 .. -1 */
- if (day < 0) {
- v1 = day / 10 - 1; /* offset -4 ... -1 */
- day = 10 + (day % 10); /* day 1 ... 7 */
-
- /* day, eg '22nd' */
- v2 = tp->tm_mday +
- (((day - 1) - tp->tm_wday + 7) % 7);
-
- /* (month length - day) / 7 + 1 */
- if (cumdays[month + 1] - cumdays[month] >= v2
- && ((int)((cumdays[month + 1] -
- cumdays[month] - v2) / 7) + 1) == -v1)
- day = v2; /* bingo ! */
-
- /* set to yesterday */
- else {
- day = tp->tm_mday - 1;
- if (day == 0)
- return (0);
- }
- }
-
- /* first, second ... +1 ... +5 */
- else {
- /* offset: +1 (first Sunday) ... */
- v1 = day / 10;
- day = day % 10;
-
- /* day, eg '22th' */
- v2 = tp->tm_mday +
- (((day - 1) - tp->tm_wday + 7) % 7);
-
- /* Hurrah! matched */
- if (((v2 - 1 + 7) / 7) == v1 )
- day = v2;
-
- else {
- /* set to yesterday */
- day = tp->tm_mday - 1;
- if (day == 0)
- return (0);
- }
- }
- } else {
- /* wired */
- day = tp->tm_mday + (((day - 1) - tp->tm_wday + 7) % 7);
- *varp = 1;
- }
- }
-
- if (!(flags & F_EASTER)) {
- if (day + cumdays[month] > cumdays[month + 1]) {
- /* off end of month, adjust */
- day -= (cumdays[month + 1] - cumdays[month]);
- /* next year */
- if (++month > 12)
- month = 1;
- }
- *monthp = month;
- *dayp = day;
- day = cumdays[month] + day;
- } else {
- for (v1 = 0; day > cumdays[v1]; v1++)
- ;
- *monthp = v1 - 1;
- *dayp = day - cumdays[v1 - 1];
- *varp = 1;
- }
-
-#ifdef DEBUG
- fprintf(stderr, "day2: day %d(%d-%d) yday %d\n",
- *dayp, day, cumdays[month], tp->tm_yday);
-#endif
-
- /* When days before or days after is specified */
- /* no year rollover */
- if (day >= tp->tm_yday - f_dayBefore &&
- day <= tp->tm_yday + f_dayAfter)
- return (1);
-
- /* next year */
- if (tp->tm_yday + f_dayAfter >= yrdays) {
- int end = tp->tm_yday + f_dayAfter - yrdays;
- if (day <= end)
- return (1);
- }
-
- /* previous year */
- if (tp->tm_yday - f_dayBefore < 0) {
- int before = yrdays + (tp->tm_yday - f_dayBefore);
- if (day >= before)
- return (1);
- }
-#endif
- return (0);
}
static char *
@@ -804,3 +662,10 @@ indextooffset(char *s)
return (-1);
return (0);
}
+
+static int
+parseoffset(char *s)
+{
+
+ return strtol(s, NULL, 10);
+}
More information about the svn-src-user
mailing list