From: Peter Avalos Date: Mon, 24 Sep 2007 20:31:44 +0000 (+0000) Subject: Sync with FreeBSD: X-Git-Tag: v2.0.1~2138 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/d070c03bd3ec3b19cb1a39dc32ee55e403db4854 Sync with FreeBSD: Sort events by date. Fix off-by-one error in -W option. Shorten some long lines. Fix various bugs in the -A and -B options. Remove break after return. Fix -t option processing. Partially initialized tm structure was passed into mktime(3). Obtained-from: FreeBSD --- diff --git a/usr.bin/calendar/calendar.h b/usr.bin/calendar/calendar.h index 9f8e16ffff..94cfb09639 100644 --- a/usr.bin/calendar/calendar.h +++ b/usr.bin/calendar/calendar.h @@ -30,15 +30,20 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/usr.bin/calendar/calendar.h,v 1.5.2.3 2003/04/06 20:04:57 dwmalone Exp $ - * $DragonFly: src/usr.bin/calendar/calendar.h,v 1.4 2006/09/16 18:38:00 pavalos Exp $ + * $FreeBSD: src/usr.bin/calendar/calendar.h,v 1.12 2007/06/09 05:54:13 grog Exp $ + * $DragonFly: src/usr.bin/calendar/calendar.h,v 1.5 2007/09/24 20:31:44 pavalos Exp $ */ +#include +#include extern struct passwd *pw; extern int doall; extern struct tm *tp; extern const char *calendarFile; +extern int *cumdays; +extern int yrdays; +extern struct fixs neaster, npaskha; void cal(void); void closecal(FILE *); @@ -64,7 +69,7 @@ void setnnames(void); #define F_ISDAYVAR 0x04 /* variables day of week, like SundayLast */ #define F_EASTER 0x08 /* Easter or easter depending days */ -extern int f_dayAfter; /* days after current date */ +extern int f_dayAfter; /* days after current date */ extern int f_dayBefore; /* days bevore current date */ extern int Friday; /* day before weekend */ @@ -73,3 +78,16 @@ struct fixs { int len; }; +struct event *event_add(struct event *events, int month, int day, char *date, + int var, char *txt); +void event_continue(struct event *events, char *txt); +void event_print_all(FILE *fp, struct event *events); +/* Stored calendar event */ +struct event { + int month; + int day; + int var; + char *date; + char *text; + struct event *next; +}; diff --git a/usr.bin/calendar/day.c b/usr.bin/calendar/day.c index ba70a6b50e..41308bd60e 100644 --- a/usr.bin/calendar/day.c +++ b/usr.bin/calendar/day.c @@ -30,8 +30,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/usr.bin/calendar/day.c,v 1.13.2.5 2003/04/06 20:04:57 dwmalone Exp $ - * $DragonFly: src/usr.bin/calendar/day.c,v 1.5 2006/09/16 18:38:00 pavalos Exp $ + * $FreeBSD: src/usr.bin/calendar/day.c,v 1.27 2007/06/09 05:54:13 grog Exp $ + * $DragonFly: src/usr.bin/calendar/day.c,v 1.6 2007/09/24 20:31:44 pavalos Exp $ */ #include @@ -50,10 +50,10 @@ extern struct iovec header[]; struct tm *tp; -int *cumdays; +static const struct tm tm0; +int *cumdays, yrdays; static char dayname[10]; -static int offset, yrdays; /* 1-based month, 0-based days, cumulative */ static int daytab[][14] = { @@ -152,7 +152,8 @@ settime(time_t now) cumdays = daytab[0]; } /* Friday displays Monday's events */ - offset = tp->tm_wday == Friday ? 3 : 1; + if (f_dayAfter == 0 && f_dayBefore == 0 && Friday != -1) + f_dayAfter = tp->tm_wday == Friday ? 3 : 1; header[5].iov_base = dayname; oldl = NULL; @@ -181,10 +182,7 @@ Mktime(char *dp) time(&t); tp = localtime(&t); - tm.tm_sec = 0; - tm.tm_min = 0; - tm.tm_hour = 0; - tm.tm_wday = 0; + tm = tm0; tm.tm_mday = tp->tm_mday; tm.tm_mon = tp->tm_mon; tm.tm_year = tp->tm_year; @@ -361,6 +359,11 @@ isnow(char *endp, int *monthp, int *dayp, int *varp) } if (!(flags & F_EASTER)) { + if (day + cumdays[month] > cumdays[month + 1]) { /* off end of month */ + day -= (cumdays[month + 1] - cumdays[month]); /* adjust */ + if (++month > 12) /* next year */ + month = 1; + } *monthp = month; *dayp = day; day = cumdays[month] + day; @@ -374,19 +377,30 @@ isnow(char *endp, int *monthp, int *dayp, int *varp) } #ifdef DEBUG - fprintf(stderr, "day2: day %d(%d-%d) yday %d\n", *dayp, day, cumdays[month], tp->tm_yday); + 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 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); } @@ -449,10 +463,8 @@ getdayvar(char *s) switch(*(s + offs - 2)) { case '-': return(-(atoi(s + offs - 1))); - break; case '+': return(atoi(s + offs - 1)); - break; } diff --git a/usr.bin/calendar/io.c b/usr.bin/calendar/io.c index 78b6b327d3..af6424e3be 100644 --- a/usr.bin/calendar/io.c +++ b/usr.bin/calendar/io.c @@ -32,8 +32,8 @@ * * @(#) Copyright (c) 1989, 1993 The Regents of the University of California. All rights reserved. * @(#)calendar.c 8.3 (Berkeley) 3/25/94 - * $FreeBSD: src/usr.bin/calendar/io.c,v 1.13.2.3 2002/08/26 00:32:46 jmallett Exp $ - * $DragonFly: src/usr.bin/calendar/io.c,v 1.5 2006/09/16 18:38:00 pavalos Exp $ + * $FreeBSD: src/usr.bin/calendar/io.c,v 1.21 2007/06/09 05:54:13 grog Exp $ + * $DragonFly: src/usr.bin/calendar/io.c,v 1.6 2007/09/24 20:31:44 pavalos Exp $ */ #include @@ -89,6 +89,7 @@ cal(void) int var; static int d_first = -1; char buf[2048 + 1]; + struct event *events = NULL; if ((fp = opencal()) == NULL) return; @@ -148,23 +149,109 @@ cal(void) strftime(dbuf, sizeof(dbuf), d_first ? "%e %b" : "%b %e", &tm); - fprintf(fp, "%s%c%s\n", dbuf, - var ? '*' : ' ', p); + events = event_add(events, month, day, dbuf, var, p); } } else if (printing) - fprintf(fp, "%s\n", buf); + event_continue(events, buf); } + + event_print_all(fp, events); closecal(fp); } +/* + * Functions to handle buffered calendar events. + */ +struct event * +event_add(struct event *events, int month, int day, char *date, int var, char *txt) +{ + struct event *e; + + e = (struct event *)calloc(1, sizeof(struct event)); + if (e == NULL) + errx(EXIT_FAILURE, "event_add: cannot allocate memory"); + e->month = month; + e->day = day; + e->var = var; + e->date = strdup(date); + if (e->date == NULL) + errx(EXIT_FAILURE, "event_add: cannot allocate memory"); + e->text = strdup(txt); + if (e->text == NULL) + errx(EXIT_FAILURE, "event_add: cannot allocate memory"); + e->next = events; + + return e; +} + +void +event_continue(struct event *e, char *txt) +{ + char *text; + + text = strdup(e->text); + if (text == NULL) + errx(EXIT_FAILURE, "event_continue: cannot allocate memory"); + + free(e->text); + e->text = (char *)malloc(strlen(text) + strlen(txt) + 3); + if (e->text == NULL) + errx(EXIT_FAILURE, "event_continue: cannot allocate memory"); + strcpy(e->text, text); + strcat(e->text, "\n"); + strcat(e->text, txt); + free(text); + + return; +} + +void +event_print_all(FILE *fp, struct event *events) +{ + struct event *e, *e_next; + int daycount = f_dayAfter + f_dayBefore; + int daycounter; + int day, month; + + for (daycounter = 0; daycounter <= daycount; daycounter++) { + day = tp->tm_yday - f_dayBefore + daycounter; + if (day < 0) day += yrdays; + if (day >= yrdays) day -= yrdays; + + month = 1; + while (month <= 12) { + if (day <= cumdays[month]) + break; + month++; + } + month--; + day -= cumdays[month]; + +#ifdef DEBUG + fprintf(stderr,"event_print_allmonth: %d, day: %d\n",month,day); +#endif + + for (e = events; e != NULL; e = e_next ) { + e_next = e->next; + + if (month != e->month || day != e->day) + continue; + + fprintf(fp, "%s%c%s\n", e->date, + e->var ? '*' : ' ', e->text); + } + } +} + int getfield(char *p, char **endp, int *flags) { int val, var; char *start, savech; - for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*'; ++p); + for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) + && *p != '*'; ++p); if (*p == '*') { /* `*' is current month */ *flags |= F_ISMONTH; *endp = p+1; @@ -172,16 +259,17 @@ getfield(char *p, char **endp, int *flags) } if (isdigit((unsigned char)*p)) { val = strtol(p, &p, 10); /* if 0, it's failure */ - for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*'; ++p); + for (; !isdigit((unsigned char)*p) + && !isalpha((unsigned char)*p) && *p != '*'; ++p); *endp = p; return(val); } for (start = p; isalpha((unsigned char)*++p);); - + /* Sunday-1 */ - if (*p == '+' || *p == '-') + if (*p == '+' || *p == '-') for(; isdigit((unsigned char)*++p);); - + savech = *p; *p = '\0'; @@ -200,7 +288,7 @@ getfield(char *p, char **endp, int *flags) #ifdef DEBUG printf("var: %d\n", var); #endif - } + } } /* Easter */ @@ -216,7 +304,8 @@ getfield(char *p, char **endp, int *flags) *p = savech; return (0); } - for (*p = savech; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p) && *p != '*'; ++p); + for (*p = savech; !isdigit((unsigned char)*p) + && !isalpha((unsigned char)*p) && *p != '*'; ++p); *endp = p; return(val); } diff --git a/usr.bin/calendar/ostern.c b/usr.bin/calendar/ostern.c index bd32942fd7..3d24e8315f 100644 --- a/usr.bin/calendar/ostern.c +++ b/usr.bin/calendar/ostern.c @@ -23,8 +23,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/usr.bin/calendar/ostern.c,v 1.8.2.2 2002/05/27 12:14:46 dwmalone Exp $ - * $DragonFly: src/usr.bin/calendar/ostern.c,v 1.4 2006/09/16 18:38:00 pavalos Exp $ + * $FreeBSD: src/usr.bin/calendar/ostern.c,v 1.12 2007/05/07 11:18:30 dwmalone Exp $ + * $DragonFly: src/usr.bin/calendar/ostern.c,v 1.5 2007/09/24 20:31:44 pavalos Exp $ */ #include @@ -34,8 +34,6 @@ #include "calendar.h" -extern struct fixs neaster; - /* return year day for Easter */ /* @@ -45,7 +43,8 @@ extern struct fixs neaster; * Astronomical Almanac". */ -int easter (int year) +int +easter(int year) /* 0 ... abcd, NOT since 1900 */ { int G, /* Golden number - 1 */ C, /* Century */ @@ -77,6 +76,7 @@ int geteaster(char *s, int year) { int offset = 0; + #define EASTER "easter" #define EASTERNAMELEN (sizeof(EASTER) - 1) diff --git a/usr.bin/calendar/paskha.c b/usr.bin/calendar/paskha.c index 562af422c8..30a5701b62 100644 --- a/usr.bin/calendar/paskha.c +++ b/usr.bin/calendar/paskha.c @@ -23,8 +23,8 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/usr.bin/calendar/paskha.c,v 1.4.10.2 2002/05/27 12:14:46 dwmalone Exp $ - * $DragonFly: src/usr.bin/calendar/paskha.c,v 1.4 2006/09/16 18:38:00 pavalos Exp $ + * $FreeBSD: src/usr.bin/calendar/paskha.c,v 1.8 2007/05/07 11:18:30 dwmalone Exp $ + * $DragonFly: src/usr.bin/calendar/paskha.c,v 1.5 2007/09/24 20:31:44 pavalos Exp $ */ #include @@ -37,9 +37,6 @@ #define PASKHA "paskha" #define PASKHALEN (sizeof(PASKHA) - 1) -extern int *cumdays; -extern struct fixs npaskha; - static int paskha(int); /* return year day for Orthodox Easter using Gauss formula */