From owner-svn-src-user@FreeBSD.ORG Tue Feb 2 21:24:19 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6B8BE1065672; Tue, 2 Feb 2010 21:24:19 +0000 (UTC) (envelope-from edwin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5AEB28FC18; Tue, 2 Feb 2010 21:24:19 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o12LOJ6t081136; Tue, 2 Feb 2010 21:24:19 GMT (envelope-from edwin@svn.freebsd.org) Received: (from edwin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o12LOJAO081133; Tue, 2 Feb 2010 21:24:19 GMT (envelope-from edwin@svn.freebsd.org) Message-Id: <201002022124.o12LOJAO081133@svn.freebsd.org> From: Edwin Groothuis Date: Tue, 2 Feb 2010 21:24:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r203406 - user/edwin/calendar X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Feb 2010 21:24:19 -0000 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 #include #include +#include #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;