bin/113250: [patch] fix calendar -A and -B options

Edwin Groothuis edwin at mavetju.org
Sat Jun 2 13:00:12 UTC 2007


>Number:         113250
>Category:       bin
>Synopsis:       [patch] fix calendar -A and -B options
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jun 02 13:00:10 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Edwin Groothuis
>Release:        FreeBSD 6.2-RELEASE-p4 i386
>Organization:
-
>Environment:
System: FreeBSD k7.mavetju 6.2-RELEASE-p4 FreeBSD 6.2-RELEASE-p4 #0: Thu Apr 26 17:55:55 UTC 2007 root at i386-builder.daemonology.net:/usr/obj/usr/src/sys/SMP i386

>Description:

calendar has the following two options:

    -A num  Print lines from today and the next num days (forward, future).
    -B num  Print lines from today and the previous num days (backward, past).

Currently, while using the attached calibration file, calendar says:

[/usr/src/usr.bin/calendar] root at k7>calendar -B 3 -f c.calibrate -t 04.01.2006
Jan  1  jan 1
Jan  2  jan 2
Jan  3  jan 3
Jan  4  jan 4
Jan  5  jan 5

That is one day too much

[/usr/src/usr.bin/calendar] root at k7>calendar -B 3 -f c.calibrate -t 01.01.2006
Jan  1  jan 1
Jan  2  jan 2
Jan  3  jan 3

That is not three days before 01.01.2006

[/usr/src/usr.bin/calendar] root at k7>calendar -A 3 -f c.calibrate -t 27.12.2006
Dec 27  dec 27
Dec 28  dec 28
Dec 29  dec 29
Dec 30  dec 30
Dec 31  dec 31

That is one day too much

[/usr/src/usr.bin/calendar] root at k7>calendar -A 3 -f c.calibrate -t 31.12.2006
Jan  1  jan 1
Jan  2  jan 2
Jan  3  jan 3
Jan  4  jan 4
Dec 31  dec 31

That is in the wrong order

>How-To-Repeat:

Use this calendar file:

calendar.calibration file:
01/01	jan 1
01/02	jan 2
01/03	jan 3
01/04	jan 4
01/05	jan 5
01/06	jan 6
01/07	jan 7
01/08	jan 8
01/09	jan 9
12/22	dec 22
12/23	dec 23
12/24	dec 24
12/25	dec 25
12/26	dec 26
12/27	dec 27
12/28	dec 28
12/29	dec 29
12/30	dec 30
12/31	dec 31


Fix:

Instead of doing the matches of before, after, offset etc in one
function, split it out properly. First do checks if the standard
dates have to be given, then check if the -A or -B option is given.

--- day.c.orig	Sat Jun  2 14:48:00 2007
+++ day.c	Sat Jun  2 22:46:57 2007
@@ -381,17 +381,45 @@
 #ifdef DEBUG
 	fprintf(stderr, "day2: day %d(%d-%d) yday %d\n", *dayp, day, cumdays[month], tp->tm_yday);
 #endif
-	/* if today or today + offset days */
+
+	/* when only today and tomorrow (or today and the next three days if
+	   it is friday) is needed */
+	if (f_dayBefore == 0 &&
+	    f_dayAfter == 0 ) {
+		/* no year rollover */
+		if (day >= tp->tm_yday &&
+		    day <= tp->tm_yday + offset)
+			return (1);
+		/* year rollover */
+		if (tp->tm_yday + offset >= yrdays) {
+			int end = tp->tm_yday + offset - yrdays;
+			if (day <= end)
+				return (1);
+		}
+
+		return (0);
+	}
+
+	/* When days before or days after is specified */
+	/* no year rollover */
 	if (day >= tp->tm_yday - f_dayBefore &&
-	    day <= tp->tm_yday + offset + f_dayAfter)
+	    day <= tp->tm_yday + f_dayAfter)
 		return (1);
 
-	/* if number of days left in this year + days to event in next year */
-	if (yrdays - tp->tm_yday + day <= offset + f_dayAfter ||
-	    /* a year backward, eg. 6 Jan and 10 days before -> 27. Dec */
-	    tp->tm_yday + day - f_dayBefore < 0
-	    )
-		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);
+	}
+
 	return (0);
 }
 
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list