Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Feb 2010 21:24:19 +0000 (UTC)
From:      Edwin Groothuis <edwin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r203406 - user/edwin/calendar
Message-ID:  <201002022124.o12LOJAO081133@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: edwin
Date: Tue Feb  2 21:24:19 2010
New Revision: 203406
URL: http://svn.freebsd.org/changeset/base/203406

Log:
  Improve speed on overlapping years by remembering the important
  dates in those years.

Modified:
  user/edwin/calendar/Makefile
  user/edwin/calendar/parsedata.c

Modified: user/edwin/calendar/Makefile
==============================================================================
--- user/edwin/calendar/Makefile	Tue Feb  2 21:23:36 2010	(r203405)
+++ user/edwin/calendar/Makefile	Tue Feb  2 21:24:19 2010	(r203406)
@@ -1,7 +1,7 @@
 #	@(#)Makefile	8.1 (Berkeley) 6/6/93
 # $FreeBSD$
 
-CFLAGS=	 -pipe  -g -std=gnu99 -fstack-protector   -Wall
+CFLAGS=	 -pipe  -g -pg -std=gnu99 -fstack-protector   -Wall
 
 PROG=	calendar
 SRCS=   calendar.c locale.c events.c dates.c parsedata.c io.c day.c \

Modified: user/edwin/calendar/parsedata.c
==============================================================================
--- user/edwin/calendar/parsedata.c	Tue Feb  2 21:23:36 2010	(r203405)
+++ user/edwin/calendar/parsedata.c	Tue Feb  2 21:24:19 2010	(r203406)
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD: user/edwin/calendar/
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <err.h>
 
 #include "calendar.h"
 
@@ -328,7 +329,14 @@ debug_determinestyle(int dateonly, char 
 		printf("specialday: |%s|\n", specialday);
 }
 
-
+struct yearinfo {
+	int year;
+	int ieaster, ipaskha, firstcnyday;
+	int ifullmoon[MAXMOONS], inewmoon[MAXMOONS],
+	    ichinesemonths[MAXMOONS], equinoxdays[2], solsticedays[2];
+	int *mondays;
+	struct yearinfo *next;
+};
 /*
  * Possible date formats include any combination of:
  *	3-charmonth			(January, Jan, Jan)
@@ -345,12 +353,9 @@ 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 d, m, dow, rm, rd, offset;
 
-	int ieaster, ipaskha;
-	int ifullmoon[MAXMOONS], inewmoon[MAXMOONS], ichinesemonths[MAXMOONS];
-	int equinoxdays[2], solsticedays[2];
-
-	int *mondays, d, m, dow, rm, rd, offset, firstcnyday;
+	static struct yearinfo *years, *yearinfo;
 
 	/*
 	 * CONVENTION
@@ -384,18 +389,40 @@ parsedaymonth(char *date, int *yearp, in
 	index = 0;
 	for (year = year1; year <= year2; year++) {
 		/* Get important dates for this year */
-		mondays = mondaytab[isleap(year)];
-		ieaster = easter(year);
-		pom(year, ifullmoon, inewmoon);
-		equinoxsolstice(year, 0.0, equinoxdays, solsticedays);
-
-		/* CNY: Match day with sun longitude at 330` with new moon */
-		firstcnyday = calculatesunlongitude30(year, 120,
-		    ichinesemonths);
-		for (m = 0; inewmoon[m] != 0; m++) {
-			if (inewmoon[m] > firstcnyday) {
-				firstcnyday = inewmoon[m - 1];
+		yearinfo = years;
+		while (yearinfo != NULL) {
+			if (yearinfo->year == year)
 				break;
+			yearinfo = yearinfo -> next;
+		}
+		if (yearinfo == NULL) {
+			yearinfo = (struct yearinfo *)calloc(1,
+			    sizeof(struct yearinfo));
+			if (yearinfo == NULL)
+				errx(1, "Unable to allocate more years");
+			yearinfo->year = year;
+			yearinfo->next = years;
+			years = yearinfo;
+
+			yearinfo->mondays = mondaytab[isleap(year)];
+			yearinfo->ieaster = easter(year);
+			pom(year, yearinfo->ifullmoon, yearinfo->inewmoon);
+			equinoxsolstice(year, 0.0,
+			    yearinfo->equinoxdays, yearinfo->solsticedays);
+
+			/*
+			 * CNY: Match day with sun longitude at 330` with new
+			 * moon
+			 */
+			yearinfo->firstcnyday = calculatesunlongitude30(year,
+			    120, yearinfo->ichinesemonths);
+			for (m = 0; yearinfo->inewmoon[m] != 0; m++) {
+				if (yearinfo->inewmoon[m] >
+				    yearinfo->firstcnyday) {
+					yearinfo->firstcnyday =
+					    yearinfo->inewmoon[m - 1];
+					break;
+				}
 			}
 		}
 
@@ -421,7 +448,7 @@ parsedaymonth(char *date, int *yearp, in
 
 		/* Every day of a month */
 		if (*flags == (F_ALLDAY | F_MONTH)) {
-			for (d = 1; d <= mondays[imonth]; d++) {
+			for (d = 1; d <= yearinfo->mondays[imonth]; d++) {
 				if (!remember_ymd(year, imonth, d))
 					continue;
 				remember(index++, yearp, monthp, dayp,
@@ -462,7 +489,7 @@ parsedaymonth(char *date, int *yearp, in
 			d = (idayofweek - dow + 8) % 7;
 
 			if (offset > 0) {
-				while (d <= mondays[imonth]) {
+				while (d <= yearinfo->mondays[imonth]) {
 					if (--offset == 0
 					 && remember_ymd(year, imonth, d)) {
 						remember(index++, yearp,
@@ -475,7 +502,7 @@ parsedaymonth(char *date, int *yearp, in
 				continue;
 			}
 			if (offset < 0) {
-				while (d <= mondays[imonth])
+				while (d <= yearinfo->mondays[imonth])
 					d += 7;
 				while (offset != 0) {
 					offset++;
@@ -493,7 +520,7 @@ parsedaymonth(char *date, int *yearp, in
 		if (*flags == (F_DAYOFWEEK | F_MONTH | F_VARIABLE)) {
 			dow = first_dayofweek_of_month(year, imonth);
 			d = (idayofweek - dow + 8) % 7;
-			while (d <= mondays[imonth]) {
+			while (d <= yearinfo->mondays[imonth]) {
 				if (remember_ymd(year, imonth, d))
 					remember(index++, yearp, monthp, dayp,
 					    year, imonth, d);
@@ -508,7 +535,8 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			if (remember_yd(year, ieaster + offset, &rm, &rd))
+			if (remember_yd(year, yearinfo->ieaster + offset,
+			    &rm, &rd))
 				remember(index++, yearp, monthp, dayp,
 				    year, rm, rd);
 			continue;
@@ -520,7 +548,8 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			if (remember_yd(year, ipaskha + offset, &rm, &rd))
+			if (remember_yd(year, yearinfo->ipaskha + offset,
+			    &rm, &rd))
 				remember(index++, yearp, monthp, dayp,
 				    year, rm, rd);
 			continue;
@@ -532,7 +561,8 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			if (remember_yd(year, firstcnyday + offset, &rm, &rd))
+			if (remember_yd(year, yearinfo->firstcnyday + offset,
+			    &rm, &rd))
 				remember(index++, yearp, monthp, dayp,
 				    year, rm, rd);
 			continue;
@@ -546,9 +576,9 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			for (i = 0; ifullmoon[i] != 0; i++) {
-				if (remember_yd(year, ifullmoon[i] + offset,
-				    &rm, &rd))
+			for (i = 0; yearinfo->ifullmoon[i] != 0; i++) {
+				if (remember_yd(year,
+				    yearinfo->ifullmoon[i] + offset, &rm, &rd))
 					remember(index++, yearp, monthp, dayp,
 						year, rm, rd);
 			}
@@ -563,9 +593,9 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			for (i = 0; ifullmoon[i] != 0; i++) {
-				if (remember_yd(year, inewmoon[i] + offset,
-				    &rm, &rd))
+			for (i = 0; yearinfo->ifullmoon[i] != 0; i++) {
+				if (remember_yd(year,
+				    yearinfo->inewmoon[i] + offset, &rm, &rd))
 					remember(index++, yearp, monthp, dayp,
 						year, rm, rd);
 			}
@@ -578,7 +608,7 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			if (remember_yd(year, equinoxdays[0] + offset,
+			if (remember_yd(year, yearinfo->equinoxdays[0] + offset,
 			    &rm, &rd))
 				remember(index++, yearp, monthp, dayp,
 				    year, rm, rd);
@@ -589,7 +619,7 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			if (remember_yd(year, equinoxdays[1] + offset,
+			if (remember_yd(year, yearinfo->equinoxdays[1] + offset,
 			    &rm, &rd))
 				remember(index++, yearp, monthp, dayp,
 				    year, rm, rd);
@@ -602,8 +632,8 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			if (remember_yd(year, solsticedays[0] + offset,
-			    &rm, &rd))
+			if (remember_yd(year,
+			    yearinfo->solsticedays[0] + offset, &rm, &rd))
 				remember(index++, yearp, monthp, dayp,
 				    year, rm, rd);
 			continue;
@@ -613,8 +643,8 @@ parsedaymonth(char *date, int *yearp, in
 			offset = 0;
 			if ((*flags & F_MODIFIEROFFSET) != 0)
 				offset = parseoffset(modifieroffset);
-			if (remember_yd(year, solsticedays[1] + offset,
-			    &rm, &rd))
+			if (remember_yd(year,
+			    yearinfo->solsticedays[1] + offset, &rm, &rd))
 				remember(index++, yearp, monthp, dayp,
 				    year, rm, rd);
 			continue;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002022124.o12LOJAO081133>