1 | /*
|
---|
2 | =============================================================================
|
---|
3 | datebook.c -- F A S T C A L E N D A R
|
---|
4 | Version 11 -- 1989-02-06 -- D.N. Lynx Crowe
|
---|
5 |
|
---|
6 | Adapted from public domain source code retrieved from Usenet.
|
---|
7 |
|
---|
8 | This C program is a faster, more general version of the
|
---|
9 | standard UNIX utility CALENDAR(1), only modified for GEMDOS
|
---|
10 | and with a few kinks added...
|
---|
11 |
|
---|
12 | It recognizes the following formats for dates:
|
---|
13 |
|
---|
14 | numeric/numeric As in: 1/12, 01/12, 12/1, ...
|
---|
15 | month/day format
|
---|
16 |
|
---|
17 | 3-charmonth[any chars] numeric As in: January 12, Jan. 12,
|
---|
18 | jan. 12, JAN. 12, ...
|
---|
19 |
|
---|
20 | 3-charweekday[any chars] As in: Friday, Monday, MON.,
|
---|
21 | mon., tue, wed, ...
|
---|
22 |
|
---|
23 | numeric month A month from 1 to 12 as in:
|
---|
24 | 1, 2, 04, 12, ...
|
---|
25 |
|
---|
26 | Any lines, following a line that is matched, that have "whitespace"
|
---|
27 | in the first column will be printed along with the matched line.
|
---|
28 | =============================================================================
|
---|
29 | */
|
---|
30 |
|
---|
31 | #define HASARGS 0 /* define non-zero to allow file arg */
|
---|
32 |
|
---|
33 | #include "stdio.h"
|
---|
34 | #include "ctype.h"
|
---|
35 |
|
---|
36 | #include "types.h"
|
---|
37 | #include "time.h"
|
---|
38 | #include "math.h"
|
---|
39 |
|
---|
40 | #include "stddefs.h"
|
---|
41 |
|
---|
42 | #define CALFILE "c:\\datebook.dat" /* default name for datebook file */
|
---|
43 |
|
---|
44 | #define DAY (24*3600) /* Number of seconds in a day. */
|
---|
45 |
|
---|
46 | #define EPOCH 1985
|
---|
47 | #define EPSILONg 279.611371 /* solar ecliptic long at EPOCH */
|
---|
48 | #define RHOg 282.680403 /* solar ecliptic long of perigee at EPOCH */
|
---|
49 | #define e 0.01671542 /* solar orbit eccentricity */
|
---|
50 | #define lzero 18.251907 /* lunar mean long at EPOCH */
|
---|
51 | #define Pzero 192.917585 /* lunar mean long of perigee at EPOCH */
|
---|
52 | #define Nzero 55.204723 /* lunar mean long of node at EPOCH */
|
---|
53 |
|
---|
54 | /* Remove this for SYS5 machines, or others with strchr instead of index. */
|
---|
55 | /* #define strchr index */
|
---|
56 |
|
---|
57 | /* |
---|
58 |
|
---|
59 | */
|
---|
60 |
|
---|
61 | char mstring[128];
|
---|
62 |
|
---|
63 | char datebuf[300]; /* Global input line. */
|
---|
64 |
|
---|
65 | char *months[] = { /* Month definitions. */
|
---|
66 |
|
---|
67 | "JAN", "FEB", "MAR",
|
---|
68 | "APR", "MAY", "JUN",
|
---|
69 | "JUL", "AUG", "SEP",
|
---|
70 | "OCT", "NOV", "DEC"
|
---|
71 | };
|
---|
72 |
|
---|
73 | char *nm_mon[] = {
|
---|
74 |
|
---|
75 | "January", "February", "March",
|
---|
76 | "April", "May", "June",
|
---|
77 | "July", "August", "September",
|
---|
78 | "October", "November", "December"
|
---|
79 | };
|
---|
80 |
|
---|
81 | char *weekdays[] = { /* Weekday definitions. */
|
---|
82 |
|
---|
83 | "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"
|
---|
84 | };
|
---|
85 |
|
---|
86 | char *nm_day[] = {
|
---|
87 |
|
---|
88 | "Sunday" , "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
|
---|
89 | "Saturday"
|
---|
90 | };
|
---|
91 |
|
---|
92 | short tisnow;
|
---|
93 | short seen;
|
---|
94 |
|
---|
95 | FILE *outfp = stdout;
|
---|
96 |
|
---|
97 | int
|
---|
98 | ly(yr)
|
---|
99 | int yr;
|
---|
100 | {
|
---|
101 | /* returns 1 if leapyear, 0 otherwise */
|
---|
102 |
|
---|
103 | return (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0);
|
---|
104 | }
|
---|
105 |
|
---|
106 | double
|
---|
107 | dtor(deg)
|
---|
108 | double deg;
|
---|
109 | {
|
---|
110 | /* convert degrees to radians */
|
---|
111 |
|
---|
112 | return (deg * PI / 180);
|
---|
113 | }
|
---|
114 |
|
---|
115 | double
|
---|
116 | adj360(deg)
|
---|
117 | double *deg;
|
---|
118 | {
|
---|
119 | /* adjust value so 0 <= deg <= 360 */
|
---|
120 |
|
---|
121 | do {
|
---|
122 |
|
---|
123 | if (*deg < 0)
|
---|
124 | *deg += 360;
|
---|
125 | else if (*deg > 360)
|
---|
126 | *deg -= 360;
|
---|
127 |
|
---|
128 | } while (*deg < 0 || *deg > 360);
|
---|
129 | }
|
---|
130 |
|
---|
131 | double
|
---|
132 | potm(days)
|
---|
133 | double days;
|
---|
134 | {
|
---|
135 | double N;
|
---|
136 | double Msol;
|
---|
137 | double Ec;
|
---|
138 | double LambdaSol;
|
---|
139 | double l;
|
---|
140 | double Mm;
|
---|
141 | double Ev;
|
---|
142 | double Ac;
|
---|
143 | double A3;
|
---|
144 | double Mmprime;
|
---|
145 | double A4;
|
---|
146 | double lprime;
|
---|
147 | double V;
|
---|
148 | double ldprime;
|
---|
149 | double D;
|
---|
150 | double Nm;
|
---|
151 |
|
---|
152 | N = 360 * days / 365.2422; /* sec 42 #3 */
|
---|
153 | adj360(&N);
|
---|
154 |
|
---|
155 | Msol = N + EPSILONg - RHOg; /* sec 42 #4 */
|
---|
156 | adj360(&Msol);
|
---|
157 |
|
---|
158 | Ec = 360 / PI * e * sin(dtor(Msol)); /* sec 42 #5 */
|
---|
159 |
|
---|
160 | LambdaSol = N + Ec + EPSILONg; /* sec 42 #6 */
|
---|
161 | adj360(&LambdaSol);
|
---|
162 |
|
---|
163 | l = 13.1763966 * days + lzero; /* sec 61 #4 */
|
---|
164 | adj360(&l);
|
---|
165 |
|
---|
166 | Mm = l - (0.1114041 * days) - Pzero; /* sec 61 #5 */
|
---|
167 | adj360(&Mm);
|
---|
168 |
|
---|
169 | Nm = Nzero - (0.0529539 * days); /* sec 61 #6 */
|
---|
170 | adj360(&Nm);
|
---|
171 |
|
---|
172 | Ev = 1.2739 * sin(dtor(2*(l - LambdaSol) - Mm)); /* sec 61 #7 */
|
---|
173 |
|
---|
174 | Ac = 0.1858 * sin(dtor(Msol)); /* sec 61 #8 */
|
---|
175 | A3 = 0.37 * sin(dtor(Msol));
|
---|
176 |
|
---|
177 | Mmprime = Mm + Ev - Ac - A3; /* sec 61 #9 */
|
---|
178 |
|
---|
179 | Ec = 6.2886 * sin(dtor(Mmprime)); /* sec 61 #10 */
|
---|
180 |
|
---|
181 | A4 = 0.214 * sin(dtor(2 * Mmprime)); /* sec 61 #11 */
|
---|
182 |
|
---|
183 | lprime = l + Ev + Ec - Ac + A4; /* sec 61 #12 */
|
---|
184 |
|
---|
185 | V = 0.6583 * sin(dtor(2 * (lprime - LambdaSol))); /* sec 61 #13 */
|
---|
186 |
|
---|
187 | ldprime = lprime + V; /* sec 61 #14 */
|
---|
188 |
|
---|
189 | D = ldprime - LambdaSol; /* sec 63 #2 */
|
---|
190 |
|
---|
191 | return((double)(50 * (1 - cos(dtor(D))))); /* sec 63 #3 */
|
---|
192 | }
|
---|
193 |
|
---|
194 | moontxt(buf)
|
---|
195 | char buf[];
|
---|
196 | {
|
---|
197 | char *cp = buf;
|
---|
198 | long *lo; /* used by time calls */
|
---|
199 | long curtime;
|
---|
200 | double days; /* days since EPOCH */
|
---|
201 | double phase; /* percent of lunar surface illuminated */
|
---|
202 | double phase2; /* percent of lunar surface illuminated one day later */
|
---|
203 | int i = EPOCH;
|
---|
204 | struct tm *pt; /* ptr to time structure */
|
---|
205 |
|
---|
206 | lo = &curtime;
|
---|
207 | time(lo); /* get system time */
|
---|
208 | pt = gmtime(lo); /* get ptr to gmt time struct */
|
---|
209 |
|
---|
210 | /* calculate days since EPOCH */
|
---|
211 |
|
---|
212 | days = (pt->tm_yday +1) + ((pt->tm_hour + (pt->tm_min / 60.0)
|
---|
213 | + (pt->tm_sec / 3600.0)) / 24.0);
|
---|
214 |
|
---|
215 | while (i < pt->tm_year + 1900)
|
---|
216 | days = days + 365 + ly(i++);
|
---|
217 |
|
---|
218 | phase = potm(days);
|
---|
219 | sprintf(cp,"The Moon is ");
|
---|
220 | cp += strlen(buf);
|
---|
221 |
|
---|
222 | if ((int)(phase + .5) == 100)
|
---|
223 | sprintf(cp,"Full");
|
---|
224 | else if ((int)(phase + 0.5) == 0)
|
---|
225 | sprintf(cp,"New");
|
---|
226 | else if ((int)(phase + 0.5) == 50) {
|
---|
227 |
|
---|
228 | phase2 = potm(++days);
|
---|
229 |
|
---|
230 | if (phase2 > phase)
|
---|
231 | sprintf(cp,"at the First Quarter");
|
---|
232 | else
|
---|
233 | sprintf(cp,"at the Last Quarter");
|
---|
234 |
|
---|
235 | } else if ((int)(phase + 0.5) > 50) {
|
---|
236 |
|
---|
237 | phase2 = potm(++days);
|
---|
238 |
|
---|
239 | if (phase2 > phase)
|
---|
240 | sprintf(cp,"Waxing ");
|
---|
241 | else
|
---|
242 | sprintf(cp,"Waning ");
|
---|
243 |
|
---|
244 | cp = buf + strlen(buf);
|
---|
245 | sprintf(cp,"Gibbous (%1.0f%% of Full)", phase);
|
---|
246 |
|
---|
247 | } else if ((int)(phase + 0.5) < 50) {
|
---|
248 |
|
---|
249 | phase2 = potm(++days);
|
---|
250 |
|
---|
251 | if (phase2 > phase)
|
---|
252 | sprintf(cp,"Waxing ");
|
---|
253 | else
|
---|
254 | sprintf(cp,"Waning ");
|
---|
255 |
|
---|
256 | cp = buf + strlen(buf);
|
---|
257 | sprintf(cp,"Crescent (%1.0f%% of Full)", phase);
|
---|
258 | }
|
---|
259 | }
|
---|
260 |
|
---|
261 | /* |
---|
262 |
|
---|
263 | */
|
---|
264 |
|
---|
265 | /*
|
---|
266 | =============================================================================
|
---|
267 | chinayr() -- returns a pointer to a static string for the Chinese year
|
---|
268 | =============================================================================
|
---|
269 | */
|
---|
270 |
|
---|
271 | char *
|
---|
272 | chinayr(year)
|
---|
273 | register int year;
|
---|
274 | {
|
---|
275 | static char *chyrs[] = { /* Chinese Year cycle */
|
---|
276 |
|
---|
277 | "Rat", /* 0 */
|
---|
278 | "Ox", /* 1 */
|
---|
279 | "Tiger", /* 2 */
|
---|
280 | "Rabbit", /* 3 */
|
---|
281 | "Dragon", /* 4 */
|
---|
282 | "Snake", /* 5 */
|
---|
283 | "Horse", /* 6 */
|
---|
284 | "Ram", /* 7 */
|
---|
285 | "Monkey", /* 8 */
|
---|
286 | "Cock", /* 9 */
|
---|
287 | "Dog", /* 10 */
|
---|
288 | "Boar" /* 11 */
|
---|
289 | };
|
---|
290 |
|
---|
291 | year -= 4;
|
---|
292 |
|
---|
293 | if (year < 0)
|
---|
294 | return((char *)"?????");
|
---|
295 | else
|
---|
296 | return(chyrs[year % 12]);
|
---|
297 | }
|
---|
298 |
|
---|
299 | /* |
---|
300 |
|
---|
301 | */
|
---|
302 |
|
---|
303 | /*
|
---|
304 | =============================================================================
|
---|
305 | getdate() -- Check the input line, and get only the lines without
|
---|
306 | leading "whitespace". Conditionally print those lines with leading
|
---|
307 | blanks, based on the "success" flag.
|
---|
308 | =============================================================================
|
---|
309 | */
|
---|
310 |
|
---|
311 | char *
|
---|
312 | getdate(fp, success)
|
---|
313 | char *success;
|
---|
314 | register FILE *fp;
|
---|
315 | {
|
---|
316 | register int c;
|
---|
317 | static char inbuf[300];
|
---|
318 | register char *t, *s;
|
---|
319 |
|
---|
320 | t = inbuf;
|
---|
321 | s = datebuf;
|
---|
322 |
|
---|
323 | while ((c = getc(fp)) LE ' ' AND c NE EOF) { /* Skip leading space. */
|
---|
324 |
|
---|
325 | ungetc(c, fp);
|
---|
326 | fgets(inbuf, 300, fp);
|
---|
327 |
|
---|
328 | /* Print the line if we previously printed a match. */
|
---|
329 |
|
---|
330 | if (*success)
|
---|
331 | fprintf(outfp,"%s\t%s", (tisnow ? ">" : " "), inbuf);
|
---|
332 | }
|
---|
333 |
|
---|
334 | *success = 1; /* Assume success for now. */
|
---|
335 |
|
---|
336 | if (c EQ EOF) /* Return EOF if we are there. */
|
---|
337 | return((char *)0);
|
---|
338 |
|
---|
339 | ungetc(c, fp); /* Unget the character. */
|
---|
340 | fgets(t, 300, fp); /* Get the input line. */
|
---|
341 | strcpy(s, t); /* Make a copy of it. */
|
---|
342 |
|
---|
343 | return(inbuf);
|
---|
344 | }
|
---|
345 |
|
---|
346 | /* |
---|
347 |
|
---|
348 | */
|
---|
349 |
|
---|
350 | /*
|
---|
351 | =============================================================================
|
---|
352 | isnow() -- See if the passed string has a "NOW" date in it.
|
---|
353 | =============================================================================
|
---|
354 | */
|
---|
355 |
|
---|
356 | int
|
---|
357 | isnow(datebuf)
|
---|
358 | char *datebuf;
|
---|
359 | {
|
---|
360 | char *s, *t;
|
---|
361 | long l;
|
---|
362 | register int before, after, offset, month, day;
|
---|
363 | register struct tm *tmptr;
|
---|
364 | long timenow;
|
---|
365 |
|
---|
366 | time(&timenow); /* Get the current time. */
|
---|
367 | tmptr = localtime(&timenow);
|
---|
368 |
|
---|
369 | before = 0;
|
---|
370 | after = 0;
|
---|
371 |
|
---|
372 | t = datebuf;
|
---|
373 |
|
---|
374 | /* |
---|
375 |
|
---|
376 | */
|
---|
377 | /* Is the first character a digit in a Month? */
|
---|
378 |
|
---|
379 | if (isdigit(*t) AND (month = getnum(&t) - 1) GE 0 AND month < 12) {
|
---|
380 |
|
---|
381 | tisnow = (tmptr->tm_mon EQ month);
|
---|
382 |
|
---|
383 | /* Find the separating slash. */
|
---|
384 |
|
---|
385 | if (s = (char *)strchr(t, '/'))
|
---|
386 | t = s + 1;
|
---|
387 | else if (tmptr->tm_mon EQ month)
|
---|
388 | return(1);
|
---|
389 | else
|
---|
390 | return(0);
|
---|
391 |
|
---|
392 | /* Is the string a month name? */
|
---|
393 |
|
---|
394 | } else if ((month = ischmonth(t)) GE 0) {
|
---|
395 |
|
---|
396 | /* Skip till while space. */
|
---|
397 |
|
---|
398 | while (!isspace(*t) AND *t)
|
---|
399 | ++t;
|
---|
400 |
|
---|
401 | /* Skip to first NON-white space. */
|
---|
402 |
|
---|
403 | while (isspace(*t) AND *t)
|
---|
404 | ++t;
|
---|
405 |
|
---|
406 | /* Not a month, so try a DAY as in Friday, Saturday, etc... */
|
---|
407 |
|
---|
408 | } else if ((day = ischday(datebuf)) GE 0) {
|
---|
409 |
|
---|
410 | tisnow = (day EQ tmptr->tm_wday);
|
---|
411 |
|
---|
412 | /* Is this today? */
|
---|
413 |
|
---|
414 | if (day EQ tmptr->tm_wday OR ((day + 6)%7) EQ tmptr->tm_wday)
|
---|
415 | return(1);
|
---|
416 | else
|
---|
417 | return(0);
|
---|
418 |
|
---|
419 | } else {
|
---|
420 |
|
---|
421 | /* Fail to recognize any other data as a valid date. */
|
---|
422 |
|
---|
423 | return(0);
|
---|
424 | }
|
---|
425 | /* |
---|
426 |
|
---|
427 | */
|
---|
428 | /* Is there only what looks to be a month? If so, then OK. */
|
---|
429 |
|
---|
430 | if (! *t OR ! isdigit(*t)) {
|
---|
431 |
|
---|
432 | /* Is it this month? */
|
---|
433 |
|
---|
434 | if (tmptr->tm_mon EQ month)
|
---|
435 | return(1);
|
---|
436 |
|
---|
437 | return(0);
|
---|
438 | }
|
---|
439 |
|
---|
440 | /* Calculate the value of the day. */
|
---|
441 |
|
---|
442 | day = getnum(&t);
|
---|
443 |
|
---|
444 | /* Check for *w or *W extended week specifiers. */
|
---|
445 |
|
---|
446 | if (*t EQ '*') {
|
---|
447 |
|
---|
448 | if (t[1] EQ 'w')
|
---|
449 | ++before;
|
---|
450 |
|
---|
451 | if (t[1] EQ 'W')
|
---|
452 | ++after;
|
---|
453 |
|
---|
454 | if (t[2] EQ 'W')
|
---|
455 | ++after;
|
---|
456 |
|
---|
457 | if (t[2] EQ 'w')
|
---|
458 | ++before;
|
---|
459 | }
|
---|
460 |
|
---|
461 | /* |
---|
462 |
|
---|
463 | */
|
---|
464 | offset = 1; /* Set weekend offset. */
|
---|
465 |
|
---|
466 | switch (tmptr->tm_wday) { /* Get offset based on the weekend. */
|
---|
467 |
|
---|
468 | case 5: ++offset;
|
---|
469 |
|
---|
470 | case 6: ++offset;
|
---|
471 |
|
---|
472 | default: ++offset;
|
---|
473 |
|
---|
474 | }
|
---|
475 |
|
---|
476 | tisnow = istoday(timenow, month, day);
|
---|
477 |
|
---|
478 | /* Step through all dates by DAY. */
|
---|
479 |
|
---|
480 | l = timenow - (after * 7 * DAY);
|
---|
481 |
|
---|
482 | while (l < timenow + (before * 7 * DAY) + (offset * DAY)) {
|
---|
483 |
|
---|
484 | if (istoday(l, month, day))
|
---|
485 | return(1);
|
---|
486 |
|
---|
487 | l += DAY;
|
---|
488 | }
|
---|
489 |
|
---|
490 | return(0); /* Return failure. */
|
---|
491 | }
|
---|
492 |
|
---|
493 | /* |
---|
494 |
|
---|
495 | */
|
---|
496 |
|
---|
497 | /*
|
---|
498 | =============================================================================
|
---|
499 | ischday() -- Check if the string s is a DAY of the week as in monday,
|
---|
500 | tues, wed, THU., or any derivative thereof.
|
---|
501 | =============================================================================
|
---|
502 | */
|
---|
503 |
|
---|
504 | int
|
---|
505 | ischday(s)
|
---|
506 | register char *s;
|
---|
507 | {
|
---|
508 | register char *tt;
|
---|
509 | register int i, found = 0, c;
|
---|
510 | register char t[30];
|
---|
511 |
|
---|
512 | /* Copy the input, and capitalize it. */
|
---|
513 |
|
---|
514 | for (tt = t, i=0; isalpha(*s) AND i < 28; ++i)
|
---|
515 | *tt++ = islower(c = *s++) ? toupper(c) : c;
|
---|
516 |
|
---|
517 | *tt = '\0';
|
---|
518 |
|
---|
519 | /* Search the list of valid day names for the string. */
|
---|
520 |
|
---|
521 | for (i = 0; i < 7; ++i) {
|
---|
522 |
|
---|
523 | if (strncmp(t, weekdays[i], 3) EQ 0) {
|
---|
524 |
|
---|
525 | found++;
|
---|
526 | break;
|
---|
527 | }
|
---|
528 | }
|
---|
529 |
|
---|
530 | /* Return the numeric equivalent if we found it. */
|
---|
531 |
|
---|
532 | if (found)
|
---|
533 | return(i);
|
---|
534 |
|
---|
535 | /* Return invalid day name. */
|
---|
536 |
|
---|
537 | return(-1);
|
---|
538 | }
|
---|
539 |
|
---|
540 | /* |
---|
541 |
|
---|
542 | */
|
---|
543 |
|
---|
544 | /*
|
---|
545 | =============================================================================
|
---|
546 | ischmonth() -- Check if the string s is a valid derivative of the name
|
---|
547 | of a month as in JUNE, jun, August, etc...
|
---|
548 | =============================================================================
|
---|
549 | */
|
---|
550 |
|
---|
551 | int
|
---|
552 | ischmonth(s)
|
---|
553 | register char *s;
|
---|
554 | {
|
---|
555 | register char *tt;
|
---|
556 | register int i, found = 0, c;
|
---|
557 | register char t[30];
|
---|
558 |
|
---|
559 | /* Copy and capitalize. */
|
---|
560 |
|
---|
561 | for (tt = t, i=0; isalpha(*s) AND i < 28; ++i)
|
---|
562 | *tt++ = islower(c = *s++) ? toupper(c) : c;
|
---|
563 |
|
---|
564 | *tt = '\0';
|
---|
565 |
|
---|
566 | /* Look through the list for a match. */
|
---|
567 |
|
---|
568 | for (i = 0; i < 12; ++i) {
|
---|
569 |
|
---|
570 | if (strncmp(t, months[i], 3) EQ 0) {
|
---|
571 |
|
---|
572 | found++;
|
---|
573 | break;
|
---|
574 | }
|
---|
575 | }
|
---|
576 |
|
---|
577 | /* Return the numeric equivalent if we found it. */
|
---|
578 |
|
---|
579 | if (found)
|
---|
580 | return(i);
|
---|
581 |
|
---|
582 | /* Return faliure. */
|
---|
583 |
|
---|
584 | return(-1);
|
---|
585 | }
|
---|
586 |
|
---|
587 | /* |
---|
588 |
|
---|
589 | */
|
---|
590 |
|
---|
591 | /*
|
---|
592 | =============================================================================
|
---|
593 | getnum() -- Scan the string *t, and evaluate any integer contained
|
---|
594 | there. It is assumed that at least 1 digit exists (**t).
|
---|
595 | =============================================================================
|
---|
596 | */
|
---|
597 |
|
---|
598 | int
|
---|
599 | getnum(t)
|
---|
600 | char **t;
|
---|
601 | {
|
---|
602 | register int i, c;
|
---|
603 | register char *s;
|
---|
604 |
|
---|
605 | i = 0;
|
---|
606 |
|
---|
607 | /* Get the starting address. */
|
---|
608 | s = *t;
|
---|
609 |
|
---|
610 | /* Get the starting value from the first digit. */
|
---|
611 | i = (c = *s++) - '0';
|
---|
612 |
|
---|
613 | /* Evaluate the rest of the digits (if any). */
|
---|
614 |
|
---|
615 | while (isdigit(c = *s++))
|
---|
616 | i = i * 10 + (c - '0');
|
---|
617 |
|
---|
618 | /* Set the new address. */
|
---|
619 | *t = --s;
|
---|
620 |
|
---|
621 | /* Return the value. */
|
---|
622 | return(i);
|
---|
623 | }
|
---|
624 |
|
---|
625 | /* |
---|
626 |
|
---|
627 | */
|
---|
628 |
|
---|
629 | /*
|
---|
630 | =============================================================================
|
---|
631 | istoday() -- Return whether or not the time t corresponds to
|
---|
632 | the month and day.
|
---|
633 | =============================================================================
|
---|
634 | */
|
---|
635 |
|
---|
636 | int
|
---|
637 | istoday(t, month, day)
|
---|
638 | long t;
|
---|
639 | register int month, day;
|
---|
640 | {
|
---|
641 | register struct tm *tm;
|
---|
642 |
|
---|
643 | tm = localtime(&t);
|
---|
644 |
|
---|
645 | return(tm->tm_mon EQ month AND tm->tm_mday EQ day);
|
---|
646 | }
|
---|
647 |
|
---|
648 | /* |
---|
649 |
|
---|
650 | */
|
---|
651 |
|
---|
652 | /*
|
---|
653 | =============================================================================
|
---|
654 | main function for datebook.c
|
---|
655 | =============================================================================
|
---|
656 | */
|
---|
657 |
|
---|
658 | main(argc, argv)
|
---|
659 | int argc;
|
---|
660 | char **argv;
|
---|
661 | {
|
---|
662 | register char *s;
|
---|
663 | char success;
|
---|
664 | register char file[200];
|
---|
665 | register FILE *fp;
|
---|
666 | long intime;
|
---|
667 | long *timeloc;
|
---|
668 | int year;
|
---|
669 | struct tm *intmp;
|
---|
670 |
|
---|
671 | /* Use file passed as an argument if it is there,
|
---|
672 | otherwise use default file. */
|
---|
673 |
|
---|
674 | #if HASARGS
|
---|
675 | if (argc LE 1)
|
---|
676 | #endif
|
---|
677 | strcpy(file, CALFILE);
|
---|
678 | #if HASARGS
|
---|
679 | else
|
---|
680 | strcpy(file, argv[1]);
|
---|
681 | #endif
|
---|
682 |
|
---|
683 | if ((fp = fopen(file, "r")) EQ NULL) { /* Open the input file. */
|
---|
684 |
|
---|
685 | perror(file);
|
---|
686 | exit(1);
|
---|
687 | }
|
---|
688 |
|
---|
689 | time(timeloc = &intime);
|
---|
690 | intmp = localtime(timeloc);
|
---|
691 | year = intmp->tm_year+1900;
|
---|
692 |
|
---|
693 | fprintf(outfp,"\nThe time is %02d:%02d and ",
|
---|
694 | intmp->tm_hour, intmp->tm_min);
|
---|
695 |
|
---|
696 | fprintf(outfp,"today is %s,\n%s %d, %d - the year of the %s.\n\n",
|
---|
697 | nm_day[intmp->tm_wday], nm_mon[intmp->tm_mon],
|
---|
698 | intmp->tm_mday, year, chinayr(year));
|
---|
699 |
|
---|
700 | moontxt(mstring);
|
---|
701 | fprintf(outfp, "%s\n\n", mstring);
|
---|
702 |
|
---|
703 | if ((intmp->tm_wday EQ 5) AND (intmp->tm_mday EQ 13))
|
---|
704 | fprintf(outfp,"!\tWatch out -- It's Friday the Thirteenth!\n\n");
|
---|
705 |
|
---|
706 | success = 0; /* Initially, no success. */
|
---|
707 | seen = FALSE;
|
---|
708 |
|
---|
709 | while (s = getdate(fp, &success)) { /* Loop till EOF is encountered. */
|
---|
710 |
|
---|
711 | if (isnow(datebuf)) { /* Check date for "NOW" */
|
---|
712 |
|
---|
713 | /* Print it, it is valid. */
|
---|
714 |
|
---|
715 | fprintf(outfp,"%s\t%s", (tisnow ? ">" : " "), s);
|
---|
716 | seen = TRUE;
|
---|
717 |
|
---|
718 | } else {
|
---|
719 |
|
---|
720 | /* Reset the "print lines with leading blanks" flag. */
|
---|
721 |
|
---|
722 | success = 0;
|
---|
723 | }
|
---|
724 | }
|
---|
725 |
|
---|
726 | if (NOT seen)
|
---|
727 | fprintf(outfp, "No reminders for today.\n");
|
---|
728 |
|
---|
729 | fclose(fp); /* Close up and exit. */
|
---|
730 | exit(0);
|
---|
731 | }
|
---|