From owner-svn-src-user@FreeBSD.ORG Wed Dec 30 11:46:39 2009 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 5C3201065672; Wed, 30 Dec 2009 11:46:39 +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 337408FC1C; Wed, 30 Dec 2009 11:46:39 +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 nBUBkdnw058374; Wed, 30 Dec 2009 11:46:39 GMT (envelope-from edwin@svn.freebsd.org) Received: (from edwin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id nBUBkd4G058372; Wed, 30 Dec 2009 11:46:39 GMT (envelope-from edwin@svn.freebsd.org) Message-Id: <200912301146.nBUBkd4G058372@svn.freebsd.org> From: Edwin Groothuis Date: Wed, 30 Dec 2009 11:46:39 +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: r201256 - 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: Wed, 30 Dec 2009 11:46:39 -0000 Author: edwin Date: Wed Dec 30 11:46:38 2009 New Revision: 201256 URL: http://svn.freebsd.org/changeset/base/201256 Log: Be able to process dayofweek of a month with a modifier. Modified: user/edwin/calendar/parsedata.c Modified: user/edwin/calendar/parsedata.c ============================================================================== --- user/edwin/calendar/parsedata.c Wed Dec 30 10:44:39 2009 (r201255) +++ user/edwin/calendar/parsedata.c Wed Dec 30 11:46:38 2009 (r201256) @@ -41,6 +41,7 @@ static int checkmonth(char *s, int *len, static char *getdayofweekname(int i); static int checkdayofweek(char *s, int *len, int *offset, char **dow); static int isonlydigits(char *s, int nostar); +static int indextooffset(char *s); /* * Expected styles: @@ -320,7 +321,7 @@ parsedaymonth(char *date, int *yearp, in char modifierindex[100], specialday[100]; int idayofweek, imonth, idayofmonth, year, index; - int *mondays, d, m, dow, rm, rd; + int *mondays, d, m, dow, rm, rd, offset; /* * CONVENTION @@ -410,6 +411,42 @@ parsedaymonth(char *date, int *yearp, in continue; } + /* A certain dayofweek of a month */ + if (*flags == + (F_MONTH | F_DAYOFWEEK | F_MODIFIERINDEX | F_VARIABLE)) { + offset = indextooffset(modifierindex); + dow = first_dayofweek_of_month(year, imonth); + d = (idayofweek - dow + 8) % 7; + + if (offset > 0) { + while (d <= mondays[imonth]) { + if (--offset == 0 + && remember_ymd(year, imonth, d)) { + remember(index++, yearp, + monthp, dayp, year, imonth, + rd); + continue; + } + d += 7; + } + continue; + } + if (offset < 0) { + while (d <= mondays[imonth]) + d += 7; + while (offset != 0) { + offset++; + d -= 7; + } + if (remember_ymd(year, imonth, d)) + remember(index++, yearp, + monthp, dayp, year, imonth, + rd); + continue; + } + continue; + } + /* Every dayofweek of the month */ if (*flags == (F_DAYOFWEEK | F_MONTH | F_VARIABLE)) { dow = first_dayofweek_of_month(year, imonth); @@ -421,7 +458,6 @@ parsedaymonth(char *date, int *yearp, in d += 7; } continue; - } printf("Unprocessed:\n"); @@ -752,3 +788,20 @@ isonlydigits(char *s, int nostar) return (1); } +static int +indextooffset(char *s) +{ + if (strcasecmp(s, "first") == 0) + return (1); + if (strcasecmp(s, "second") == 0) + return (2); + if (strcasecmp(s, "third") == 0) + return (3); + if (strcasecmp(s, "fourth") == 0) + return (4); + if (strcasecmp(s, "fifth") == 0) + return (5); + if (strcasecmp(s, "last") == 0) + return (-1); + return (0); +}