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