Sync with FreeBSD:
authorPeter Avalos <pavalos@dragonflybsd.org>
Mon, 24 Sep 2007 20:31:44 +0000 (20:31 +0000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Mon, 24 Sep 2007 20:31:44 +0000 (20:31 +0000)
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

usr.bin/calendar/calendar.h
usr.bin/calendar/day.c
usr.bin/calendar/io.c
usr.bin/calendar/ostern.c
usr.bin/calendar/paskha.c

index 9f8e16f..94cfb09 100644 (file)
  * 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 <sys/types.h>
+#include <sys/uio.h>
 
 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;
+};
index ba70a6b..41308bd 100644 (file)
@@ -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 <sys/types.h>
 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;
        }
 
 
index 78b6b32..af6424e 100644 (file)
@@ -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 <sys/types.h>
@@ -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);
 }
index bd32942..3d24e83 100644 (file)
@@ -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 <stdio.h>
@@ -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)
 
index 562af42..30a5701 100644 (file)
@@ -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 <stdio.h>
@@ -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 */