svn commit: r201531 - user/edwin/calendar
Edwin Groothuis
edwin at FreeBSD.org
Mon Jan 4 20:55:47 UTC 2010
Author: edwin
Date: Mon Jan 4 20:55:47 2010
New Revision: 201531
URL: http://svn.freebsd.org/changeset/base/201531
Log:
Behold! Calendar prints events again, even over multiple years.
Modified:
user/edwin/calendar/calendar.c
user/edwin/calendar/calendar.h
user/edwin/calendar/dates.c
user/edwin/calendar/day.c
user/edwin/calendar/events.c
user/edwin/calendar/io.c
user/edwin/calendar/ostern.c
user/edwin/calendar/parsedata.c
user/edwin/calendar/paskha.c
user/edwin/calendar/pathnames.h
Modified: user/edwin/calendar/calendar.c
==============================================================================
--- user/edwin/calendar/calendar.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/calendar.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (c) 1989, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
Modified: user/edwin/calendar/calendar.h
==============================================================================
--- user/edwin/calendar/calendar.h Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/calendar.h Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (c) 1989, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
@@ -83,10 +83,11 @@ extern int year1, year2;
* - Use event_continue() to add more text to the last added event
* - Use event_print_all() to display them in time chronological order
*/
-struct event *event_add(struct event *, int, int, char *, int, char *);
+struct event *event_add(int, int, int, char *, int, char *);
void event_continue(struct event *events, char *txt);
-void event_print_all(FILE *fp, struct event *events);
+void event_print_all(FILE *fp);
struct event {
+ int year;
int month;
int day;
int var;
@@ -140,3 +141,5 @@ int remember_ymd(int y, int m, int d);
int remember_yd(int y, int d, int *rm, int *rd);
int first_dayofweek_of_year(int y);
int first_dayofweek_of_month(int y, int m);
+int walkthrough_dates(struct event **e);
+void addtodate(struct event *e, int year, int month, int day);
Modified: user/edwin/calendar/dates.c
==============================================================================
--- user/edwin/calendar/dates.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/dates.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -79,6 +79,8 @@ int mondaytab[][14] = {
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 30},
};
+static struct cal_day * find_day(int yy, int mm, int dd);
+
static void
createdate(int y, int m, int d)
{
@@ -282,7 +284,7 @@ remember_ymd(int yy, int mm, int dd)
if (d->dayofmonth == dd)
return (1);
d = d->nextday;
- continue;;
+ continue;
}
return (0);
}
@@ -366,3 +368,85 @@ first_dayofweek_of_month(int yy, int mm)
/* Should not happen */
return (-1);
}
+
+int
+walkthrough_dates(struct event **e)
+{
+ static struct cal_year *y = NULL;
+ static struct cal_month *m = NULL;
+ static struct cal_day *d = NULL;
+
+ if (y == NULL) {
+ y = hyear;
+ m = y->months;
+ d = m->days;
+ *e = d->events;
+ return (1);
+ };
+ if (d->nextday != NULL) {
+ d = d->nextday;
+ *e = d->events;
+ return (1);
+ }
+ if (m->nextmonth != NULL) {
+ m = m->nextmonth;
+ d = m->days;
+ *e = d->events;
+ return (1);
+ }
+ if (y->nextyear != NULL) {
+ y = y->nextyear;
+ m = y->months;
+ d = m->days;
+ *e = d->events;
+ return (1);
+ }
+
+ return (0);
+}
+
+static struct cal_day *
+find_day(int yy, int mm, int dd)
+{
+ struct cal_year *y;
+ struct cal_month *m;
+ struct cal_day *d;
+
+ if (debug_remember)
+ printf("remember_ymd: %d - %d - %d\n", yy, mm, dd);
+
+ y = hyear;
+ while (y != NULL) {
+ if (y->year != yy) {
+ y = y->nextyear;
+ continue;
+ }
+ m = y->months;
+ while (m != NULL) {
+ if (m->month != mm) {
+ m = m->nextmonth;
+ continue;
+ }
+ d = m->days;
+ while (d != NULL) {
+ if (d->dayofmonth == dd)
+ return (d);
+ d = d->nextday;
+ continue;
+ }
+ return (NULL);
+ }
+ return (NULL);
+ }
+ return (NULL);
+}
+
+void
+addtodate(struct event *e, int year, int month, int day)
+{
+ struct cal_day *d;
+
+ d = find_day(year, month, day);
+ e->next = d->events;
+ d->events = e;
+}
Modified: user/edwin/calendar/day.c
==============================================================================
--- user/edwin/calendar/day.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/day.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (c) 1989, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
Modified: user/edwin/calendar/events.c
==============================================================================
--- user/edwin/calendar/events.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/events.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (c) 1989, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
@@ -44,8 +44,7 @@ __FBSDID("$FreeBSD: user/edwin/calendar/
#include "calendar.h"
struct event *
-event_add(struct event *events, int month, int day,
- char *date, int var, char *txt)
+event_add(int year, int month, int day, char *date, int var, char *txt)
{
struct event *e;
@@ -68,9 +67,8 @@ event_add(struct event *events, int mont
e->text = strdup(txt);
if (e->text == NULL)
errx(1, "event_add: cannot allocate memory");
- e->next = events;
-
- return e;
+ addtodate(e, year, month, day);
+ return (e);
}
void
@@ -102,42 +100,11 @@ event_continue(struct event *e, char *tx
}
void
-event_print_all(FILE *fp, struct event *events)
+event_print_all(FILE *fp)
{
- struct event *e, *e_next;
- int daycounter;
- int day, month;
-
- /*
- * Print all events:
- * - We know the number of days to be counted (f_dayAfter + f_dayBefore)
- * - We know the current day of the year ("now" - f_dayBefore + counter)
- * - We know the number of days in the year (yrdays, set in settime())
- * - So we know the date on which the current daycounter is on the
- * calendar in days and months.
- * - Go through the list of events, and print all matching dates
- */
- for (daycounter = 0; daycounter <= f_dayAfter + f_dayBefore;
- daycounter++) {
- day = tp1.tm_yday - f_dayBefore + daycounter;
-// if (day < 0)
-// day += yrdays;
-// if (day >= yrdays)
-// day -= yrdays;
-
- /*
- * When we know the day of the year, we can determine the day
- * of the month and the month.
- */
-// month = 1;
-// while (month <= 12) {
-// if (day <= cumdays[month])
-// break;
-// month++;
-// }
-// month--;
-// day -= cumdays[month];
+ struct event *e;
+ while (walkthrough_dates(&e) != 0) {
#ifdef DEBUG
fprintf(stderr, "event_print_allmonth: %d, day: %d\n",
month, day);
@@ -147,14 +114,10 @@ event_print_all(FILE *fp, struct event *
* Go through all events and print the text of the matching
* dates
*/
- for (e = events; e != NULL; e = e_next) {
- e_next = e->next;
-
- if (month != e->month || day != e->day)
- continue;
-
+ while (e != NULL) {
(void)fprintf(fp, "%s%c%s\n", e->date,
e->var ? '*' : ' ', e->text);
+ e = e->next;
}
}
}
Modified: user/edwin/calendar/io.c
==============================================================================
--- user/edwin/calendar/io.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/io.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (c) 1989, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
@@ -96,7 +96,6 @@ cal(void)
static int d_first = -1;
char buf[2048 + 1];
struct event *events[MAXCOUNT];
- struct event *eventshead = NULL;
struct tm tm;
char dbuf[80];
@@ -167,12 +166,14 @@ cal(void)
/* Trim spaces in front of the tab */
while (isspace(pp[-1]))
pp--;
+
p = *pp;
*pp = '\0';
if ((count = parsedaymonth(buf, year, month, day, &flags)) == 0)
continue;
printf("%s - count: %d\n", buf, count);
*pp = p;
+
/* Find the last tab */
while (pp[1] == '\t')
pp++;
@@ -183,91 +184,18 @@ cal(void)
for (i = 0; i < count; i++) {
tm.tm_mon = month[i] - 1;
tm.tm_mday = day[i];
- tm.tm_year = tp1.tm_year; /* unused */
+ tm.tm_year = year[i] - 1900;
(void)strftime(dbuf, sizeof(dbuf),
d_first ? "%e %b" : "%b %e", &tm);
- eventshead = event_add(eventshead, month[i], day[i],
- dbuf, (flags &= F_VARIABLE != 0) ? 1 : 0, pp);
- events[i] = eventshead;
+ events[i] = event_add(year[i], month[i], day[i], dbuf,
+ ((flags &= F_VARIABLE) != 0) ? 1 : 0, pp);
}
}
- event_print_all(fp, eventshead);
+ event_print_all(fp);
closecal(fp);
}
-#ifdef NOTDEF
-//int
-//getfield(char *p, int *flags)
-//{
-// int val, var;
-// char *start, savech;
-//
-// if (*p == '\0')
-// return(0);
-//
-// /* Find the first digit, alpha or * */
-// for (; !isdigit((unsigned char)*p) && !isalpha((unsigned char)*p)
-// && *p != '*'; ++p)
-// ;
-// if (*p == '*') { /* `*' is current month */
-// *flags |= F_ISMONTH;
-// return (tp->tm_mon + 1);
-// }
-// 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);
-// return (val);
-// }
-// for (start = p; isalpha((unsigned char)*++p););
-//
-// /* Sunday-1 */
-// if (*p == '+' || *p == '-')
-// for(; isdigit((unsigned char)*++p);)
-// ;
-//
-// savech = *p;
-// *p = '\0';
-//
-// /* Month */
-// if ((val = getmonth(start)) != 0)
-// *flags |= F_ISMONTH;
-//
-// /* Day */
-// else if ((val = getday(start)) != 0) {
-// *flags |= F_ISDAY;
-//
-// /* variable weekday */
-// if ((var = getdayvar(start)) != 0) {
-// if (var <= 5 && var >= -4)
-// val += var * 10;
-//#ifdef DEBUG
-// printf("var: %d\n", var);
-//#endif
-// }
-// }
-//
-// /* Easter */
-// else if ((val = geteaster(start, tp->tm_year + 1900)) != 0)
-// *flags |= F_EASTER;
-//
-// /* Paskha */
-// else if ((val = getpaskha(start, tp->tm_year + 1900)) != 0)
-// *flags |= F_EASTER;
-//
-// /* undefined rest */
-// else {
-// *p = savech;
-// return (0);
-// }
-// for (*p = savech; !isdigit((unsigned char)*p)
-// && !isalpha((unsigned char)*p) && *p != '*'; ++p)
-// ;
-// return (val);
-//}
-#endif
-
FILE *
opencal(void)
{
Modified: user/edwin/calendar/ostern.c
==============================================================================
--- user/edwin/calendar/ostern.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/ostern.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (c) 1996 Wolfram Schneider <wosch at FreeBSD.org>. Berlin.
* All rights reserved.
*
Modified: user/edwin/calendar/parsedata.c
==============================================================================
--- user/edwin/calendar/parsedata.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/parsedata.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -424,7 +424,7 @@ parsedaymonth(char *date, int *yearp, in
&& remember_ymd(year, imonth, d)) {
remember(index++, yearp,
monthp, dayp, year, imonth,
- rd);
+ d);
continue;
}
d += 7;
@@ -440,8 +440,7 @@ parsedaymonth(char *date, int *yearp, in
}
if (remember_ymd(year, imonth, d))
remember(index++, yearp,
- monthp, dayp, year, imonth,
- rd);
+ monthp, dayp, year, imonth, d);
continue;
}
continue;
@@ -454,7 +453,7 @@ parsedaymonth(char *date, int *yearp, in
while (d <= mondays[imonth]) {
if (remember_ymd(year, imonth, d))
remember(index++, yearp, monthp, dayp,
- year, imonth, rd);
+ year, imonth, d);
d += 7;
}
continue;
Modified: user/edwin/calendar/paskha.c
==============================================================================
--- user/edwin/calendar/paskha.c Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/paskha.c Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (C) 1993-1996 by Andrey A. Chernov, Moscow, Russia.
* All rights reserved.
*
Modified: user/edwin/calendar/pathnames.h
==============================================================================
--- user/edwin/calendar/pathnames.h Mon Jan 4 20:34:15 2010 (r201530)
+++ user/edwin/calendar/pathnames.h Mon Jan 4 20:55:47 2010 (r201531)
@@ -1,4 +1,4 @@
-/*
+/*-
* Copyright (c) 1989, 1993
* The Regents of the University of California. All rights reserved.
*
More information about the svn-src-user
mailing list