Author: gonzo
Date: Fri Apr  3 01:17:43 2020
New Revision: 359585
URL: https://svnweb.freebsd.org/changeset/base/359585

Log:
  Fix calculation of the recurring weekdays
  
  Both the result of the first_dayofweek_of_year and the target
  weekday are zero-based (0 fo sunday) while the target month-day
  or year-day is 1-based. Adjust logic accordingly.
  
  Also add testcase for this PR to the kyua test suite
  
  PR:           201062
  Submitted by: Richard Narron <comet.berke...@gmail.com>
  MFC after:    1 week

Added:
  head/usr.bin/calendar/tests/regress.s5.out   (contents, props changed)
Modified:
  head/usr.bin/calendar/parsedata.c
  head/usr.bin/calendar/tests/calendar.calibrate
  head/usr.bin/calendar/tests/regress.sh

Modified: head/usr.bin/calendar/parsedata.c
==============================================================================
--- head/usr.bin/calendar/parsedata.c   Fri Apr  3 00:38:12 2020        
(r359584)
+++ head/usr.bin/calendar/parsedata.c   Fri Apr  3 01:17:43 2020        
(r359585)
@@ -578,7 +578,9 @@ parsedaymonth(char *date, int *yearp, int *monthp, int
                /* Every dayofweek of the year */
                if (lflags == (F_DAYOFWEEK | F_VARIABLE)) {
                        dow = first_dayofweek_of_year(year);
-                       d = (idayofweek - dow + 8) % 7;
+                       if (dow < 0)
+                               continue;
+                       d = (idayofweek - dow + 7) % 7 + 1;
                        while (d <= 366) {
                                if (remember_yd(year, d, &rm, &rd))
                                        remember(&remindex,
@@ -616,7 +618,9 @@ parsedaymonth(char *date, int *yearp, int *monthp, int
                    (F_MONTH | F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) {
                        offset = indextooffset(modifierindex);
                        dow = first_dayofweek_of_month(year, imonth);
-                       d = (idayofweek - dow + 8) % 7;
+                       if (dow < 0)
+                               continue;
+                       d = (idayofweek - dow + 7) % 7 + 1;
 
                        if (offset > 0) {
                                while (d <= yearinfo->monthdays[imonth]) {
@@ -650,7 +654,9 @@ parsedaymonth(char *date, int *yearp, int *monthp, int
                /* Every dayofweek of the month */
                if (lflags == (F_DAYOFWEEK | F_MONTH | F_VARIABLE)) {
                        dow = first_dayofweek_of_month(year, imonth);
-                       d = (idayofweek - dow + 8) % 7;
+                       if (dow < 0)
+                               continue;
+                       d = (idayofweek - dow + 7) % 7 + 1;
                        while (d <= yearinfo->monthdays[imonth]) {
                                if (remember_ymd(year, imonth, d))
                                        remember(&remindex,

Modified: head/usr.bin/calendar/tests/calendar.calibrate
==============================================================================
--- head/usr.bin/calendar/tests/calendar.calibrate      Fri Apr  3 00:38:12 
2020        (r359584)
+++ head/usr.bin/calendar/tests/calendar.calibrate      Fri Apr  3 01:17:43 
2020        (r359585)
@@ -188,6 +188,7 @@ LANG=C
 06/28  jun 28
 06/29  jun 29
 06/30  jun 30
+06/SunThird    sunthird
 07/01  jul 1
 07/02  jul 2
 07/03  jul 3

Added: head/usr.bin/calendar/tests/regress.s5.out
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/usr.bin/calendar/tests/regress.s5.out  Fri Apr  3 01:17:43 2020        
(r359585)
@@ -0,0 +1,3 @@
+Jun 21*        sunthird
+Jun 21         jun 21
+Jun 22         jun 22

Modified: head/usr.bin/calendar/tests/regress.sh
==============================================================================
--- head/usr.bin/calendar/tests/regress.sh      Fri Apr  3 00:38:12 2020        
(r359584)
+++ head/usr.bin/calendar/tests/regress.sh      Fri Apr  3 01:17:43 2020        
(r359585)
@@ -7,12 +7,13 @@ CALENDAR="${CALENDAR_BIN} ${CALENDAR_FILE}"
 
 REGRESSION_START($1)
 
-echo 1..28
+echo 1..29
 
 REGRESSION_TEST(`s1',`$CALENDAR -t 29.12.2006')
 REGRESSION_TEST(`s2',`$CALENDAR -t 30.12.2006')
 REGRESSION_TEST(`s3',`$CALENDAR -t 31.12.2006')
 REGRESSION_TEST(`s4',`$CALENDAR -t 01.01.2007')
+REGRESSION_TEST(`s5',`$CALENDAR -t 21.06.2015')
 
 REGRESSION_TEST(`a1',`$CALENDAR -A 3 -t 28.12.2006')
 REGRESSION_TEST(`a2',`$CALENDAR -A 3 -t 29.12.2006')
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to