From 6adfd2e7399e1844037811e9f0452c09b342fc0e Mon Sep 17 00:00:00 2001 From: Dianne Skoll Date: Tue, 13 Apr 2021 12:08:20 -0400 Subject: [PATCH] Wrap code to advance to next specified weekday in a macro. --- src/trigger.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/trigger.c b/src/trigger.c index 53d0f985..b0b957b6 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -24,6 +24,8 @@ #define GOT_YR 4 #define GOT_WD 8 +#define ADVANCE_TO_WD(x) while (! (trig->wd & (1 << ((x)%7)))) (x)++ + static int JYear(int jul); static int JMonth(int jul); static int NextSimpleTrig(int startdate, Trigger *trig, int *err); @@ -59,8 +61,7 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) switch(typ) { case 0: case GOT_WD: - if (trig->wd != NO_WD) - while(! (trig->wd & (1 << (startdate%7)))) startdate++; + if (trig->wd != NO_WD) ADVANCE_TO_WD(startdate); return startdate; case GOT_DAY: @@ -121,19 +122,19 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) if (y > trig->y) return -1; if (y < trig->y) j = Julian(trig->y, 0, 1); else j = startdate; - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (JYear(j) > trig->y) return -1; return j; case GOT_MON+GOT_WD: if (m == trig->m) { j = startdate; - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (JMonth(j) == trig->m) return j; } if (m >= trig->m) j = Julian(y+1, trig->m, 1); else j = Julian(y, trig->m, 1); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); return j; /* Guaranteed to be within the month */ case GOT_DAY+GOT_WD: @@ -144,7 +145,7 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) /* If there are fewer days in previous month, no match */ if (trig->d <= DaysInMonth(m2, y2)) { j = Julian(y2, m2, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (j >= startdate) return j; } @@ -153,7 +154,7 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) /* Try this month */ if (trig->d <= DaysInMonth(m, y)) { j = Julian(y, m, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (j >= startdate) return j; } @@ -162,18 +163,18 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) if (m2 > 11) { m2 = 0; y++; } while (trig->d > DaysInMonth(m2, y)) m2++; j = Julian(y, m2, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); return j; case GOT_WD+GOT_YR+GOT_DAY: if (y > trig->y+1 || (y > trig->y && m>0)) return -1; if (y > trig->y) { j = Julian(trig->y, 11, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (j >= startdate) return j; } else if (y < trig->y) { j = Julian(trig->y, 0, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); return j; } else { /* Try last month */ @@ -181,14 +182,14 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) m2 = m-1; while (trig->d > DaysInMonth(m2, trig->y)) m2--; j = Julian(trig->y, m2, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (j >= startdate) return j; } } /* Try this month */ if (trig->d <= DaysInMonth(m, trig->y)) { j = Julian(trig->y, m, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (j >= startdate) return j; } @@ -197,7 +198,7 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) m++; while (trig->d > DaysInMonth(m, trig->d)) m++; j = Julian(trig->y, m, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); return j; case GOT_DAY+GOT_MON+GOT_WD: @@ -215,31 +216,31 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) /* Try last year */ j = Julian(y, trig->m, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (j >= startdate) return j; /* Try this year */ y++; j = Julian(y, trig->m, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); if (j >= startdate) return j; /* Must be next year */ y++; while (trig->d > DaysInMonth(trig->m, y)) y++; j = Julian(y, trig->m, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); return j; case GOT_WD+GOT_MON+GOT_YR: if (y > trig->y || (y == trig->y && m > trig->m)) return -1; if (trig->y > y || (trig->y == y && trig->m > m)) { j = Julian(trig->y, trig->m, 1); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); return j; } else { j = startdate; - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); FromJulian(j, &y2, &m2, &d2); if (m2 == trig->m) return j; else return -1; } @@ -250,7 +251,7 @@ static int NextSimpleTrig(int startdate, Trigger *trig, int *err) return -1; } j = Julian(trig->y, trig->m, trig->d); - while(! (trig->wd & (1 << (j%7)))) j++; + ADVANCE_TO_WD(j); return j; default: