xref: /freebsd/usr.bin/calendar/day.c (revision 1d386b48)
1fd1efedcSConrad Meyer /*-
2fd1efedcSConrad Meyer  * SPDX-License-Identifier: BSD-3-Clause
3fd1efedcSConrad Meyer  *
4fd1efedcSConrad Meyer  * Copyright (c) 1989, 1993, 1994
5fd1efedcSConrad Meyer  *	The Regents of the University of California.  All rights reserved.
6fd1efedcSConrad Meyer  *
7fd1efedcSConrad Meyer  * Redistribution and use in source and binary forms, with or without
8fd1efedcSConrad Meyer  * modification, are permitted provided that the following conditions
9fd1efedcSConrad Meyer  * are met:
10fd1efedcSConrad Meyer  * 1. Redistributions of source code must retain the above copyright
11fd1efedcSConrad Meyer  *    notice, this list of conditions and the following disclaimer.
12fd1efedcSConrad Meyer  * 2. Redistributions in binary form must reproduce the above copyright
13fd1efedcSConrad Meyer  *    notice, this list of conditions and the following disclaimer in the
14fd1efedcSConrad Meyer  *    documentation and/or other materials provided with the distribution.
15fd1efedcSConrad Meyer  * 3. Neither the name of the University nor the names of its contributors
16fd1efedcSConrad Meyer  *    may be used to endorse or promote products derived from this software
17fd1efedcSConrad Meyer  *    without specific prior written permission.
18fd1efedcSConrad Meyer  *
19fd1efedcSConrad Meyer  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20fd1efedcSConrad Meyer  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21fd1efedcSConrad Meyer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22fd1efedcSConrad Meyer  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23fd1efedcSConrad Meyer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24fd1efedcSConrad Meyer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25fd1efedcSConrad Meyer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26fd1efedcSConrad Meyer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27fd1efedcSConrad Meyer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28fd1efedcSConrad Meyer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29fd1efedcSConrad Meyer  * SUCH DAMAGE.
30fd1efedcSConrad Meyer  */
31fd1efedcSConrad Meyer 
32fd1efedcSConrad Meyer #include <sys/cdefs.h>
33fd1efedcSConrad Meyer #include <err.h>
34fd1efedcSConrad Meyer #include <locale.h>
35fd1efedcSConrad Meyer #include <stdio.h>
36fd1efedcSConrad Meyer #include <stdlib.h>
37fd1efedcSConrad Meyer #include <string.h>
38fd1efedcSConrad Meyer #include <time.h>
39fd1efedcSConrad Meyer 
40fd1efedcSConrad Meyer #include "calendar.h"
41fd1efedcSConrad Meyer 
42fd1efedcSConrad Meyer static time_t		time1, time2;
43fd1efedcSConrad Meyer const struct tm		tm0;
44fd1efedcSConrad Meyer char			dayname[100];
45fd1efedcSConrad Meyer int			year1, year2;
46fd1efedcSConrad Meyer 
47fd1efedcSConrad Meyer 
48fd1efedcSConrad Meyer void
settimes(time_t now,int before,int after,int friday,struct tm * tp1,struct tm * tp2)49fd1efedcSConrad Meyer settimes(time_t now, int before, int after, int friday, struct tm *tp1, struct tm *tp2)
50fd1efedcSConrad Meyer {
51fd1efedcSConrad Meyer 	struct tm tp;
52fd1efedcSConrad Meyer 
53fd1efedcSConrad Meyer 	localtime_r(&now, &tp);
54fd1efedcSConrad Meyer 
55fd1efedcSConrad Meyer 	/* Friday displays Monday's events */
56fd1efedcSConrad Meyer 	if (after == 0 && before == 0 && friday != -1)
57fd1efedcSConrad Meyer 		after = tp.tm_wday == friday ? 3 : 1;
58fd1efedcSConrad Meyer 
59fd1efedcSConrad Meyer 	time1 = now - SECSPERDAY * before;
60fd1efedcSConrad Meyer 	localtime_r(&time1, tp1);
61fd1efedcSConrad Meyer 	year1 = 1900 + tp1->tm_year;
62fd1efedcSConrad Meyer 	time2 = now + SECSPERDAY * after;
63fd1efedcSConrad Meyer 	localtime_r(&time2, tp2);
64fd1efedcSConrad Meyer 	year2 = 1900 + tp2->tm_year;
65fd1efedcSConrad Meyer 
66fd1efedcSConrad Meyer 	strftime(dayname, sizeof(dayname) - 1, "%A, %d %B %Y", tp1);
67fd1efedcSConrad Meyer 
68fd1efedcSConrad Meyer 	setnnames();
69fd1efedcSConrad Meyer }
70fd1efedcSConrad Meyer 
71fd1efedcSConrad Meyer /* convert Day[/Month][/Year] into unix time (since 1970)
72fd1efedcSConrad Meyer  * Day: two digits, Month: two digits, Year: digits
73fd1efedcSConrad Meyer  */
74fd1efedcSConrad Meyer time_t
Mktime(char * dp)75fd1efedcSConrad Meyer Mktime(char *dp)
76fd1efedcSConrad Meyer {
77fd1efedcSConrad Meyer 	time_t t;
78fd1efedcSConrad Meyer 	int d, m, y;
79fd1efedcSConrad Meyer 	struct tm tm, tp;
80fd1efedcSConrad Meyer 
81fd1efedcSConrad Meyer 	(void)time(&t);
82fd1efedcSConrad Meyer 	localtime_r(&t, &tp);
83fd1efedcSConrad Meyer 
84fd1efedcSConrad Meyer 	tm = tm0;
85fd1efedcSConrad Meyer 	tm.tm_mday = tp.tm_mday;
86fd1efedcSConrad Meyer 	tm.tm_mon = tp.tm_mon;
87fd1efedcSConrad Meyer 	tm.tm_year = tp.tm_year;
88fd1efedcSConrad Meyer 
89fd1efedcSConrad Meyer 	switch (sscanf(dp, "%d.%d.%d", &d, &m, &y)) {
90fd1efedcSConrad Meyer 	case 3:
91fd1efedcSConrad Meyer 		if (y > 1900)
92fd1efedcSConrad Meyer 			y -= 1900;
93fd1efedcSConrad Meyer 		tm.tm_year = y;
94fd1efedcSConrad Meyer 		/* FALLTHROUGH */
95fd1efedcSConrad Meyer 	case 2:
96fd1efedcSConrad Meyer 		tm.tm_mon = m - 1;
97fd1efedcSConrad Meyer 		/* FALLTHROUGH */
98fd1efedcSConrad Meyer 	case 1:
99fd1efedcSConrad Meyer 		tm.tm_mday = d;
100fd1efedcSConrad Meyer 	}
101fd1efedcSConrad Meyer 
102fd1efedcSConrad Meyer #ifdef DEBUG
103fd1efedcSConrad Meyer 	fprintf(stderr, "Mktime: %d %d %s\n",
104fd1efedcSConrad Meyer 	    (int)mktime(&tm), (int)t, asctime(&tm));
105fd1efedcSConrad Meyer #endif
106fd1efedcSConrad Meyer 	return (mktime(&tm));
107fd1efedcSConrad Meyer }
108