1 /*
2  * Copyright (c) 2000, Hellmuth Michaelis. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  *---------------------------------------------------------------------------
26  *
27  *	isdnd - holiday file handling
28  *      =============================
29  *
30  *      $Id: holiday.c,v 1.3 2003/10/06 09:43:27 itojun Exp $
31  *
32  * $FreeBSD$
33  *
34  *      last edit-date: [Mon Oct  9 11:32:28 2000]
35  *
36  *	Format:
37  *
38  *	day.month.year	optional comment (different day every year)	or
39  *	day.month	optional comment (same day every year)
40  *
41  *	i.e.:
42  *
43  *	23.4.2000	Ostersonntag
44  *	3.10		Tag der deutschen Einheit
45  *
46  *
47  *
48  *----------------------------------------------------------------------------*/
49 
50 #include "isdnd.h"
51 
52 struct holiday {
53 	int	day;
54 	int	month;
55 	int	year;
56 	struct holiday *next;
57 };
58 
59 static struct holiday *firsth = NULL;
60 
61 #define MAXBUFSZ	256
62 
63 static void free_holiday(struct holiday *ptr);
64 
65 /*---------------------------------------------------------------------------*
66  *	read in and init holidayes
67  *---------------------------------------------------------------------------*/
68 void
init_holidays(char * filename)69 init_holidays(char *filename)
70 {
71 	FILE *fp;
72 	unsigned char buffer[MAXBUFSZ + 1];
73 	struct holiday *newh = NULL;
74 	struct holiday *lasth = NULL;
75 	int ret;
76 	int day, month, year;
77 
78 	firsth = NULL;
79 
80 	if ((fp = fopen(filename, "r")) == NULL)
81 	{
82 		logit(LL_ERR, "init_holiday: error opening holidayfile %s: %s!", filename, strerror(errno));
83 		exit(1);
84 	}
85 
86 	while((fgets(buffer, MAXBUFSZ, fp)) != NULL)
87 	{
88 		if (buffer[0] == '#'  || buffer[0] == ' ' ||
89 		   buffer[0] == '\t' || buffer[0] == '\n')
90 		{
91 			continue;
92 		}
93 
94 		ret = sscanf(buffer, "%d.%d.%d", &day, &month, &year);
95 
96 		if (ret != 3)
97 		{
98 			ret = sscanf(buffer, "%d.%d", &day, &month);
99 			if (ret != 2)
100 			{
101 				logit(LL_ERR, "init_holiday: parse error for string [%s]!", buffer);
102 				exit(1);
103 			}
104 			year = 0;
105 		}
106 
107 		if ((newh = (struct holiday *) malloc(sizeof(struct holiday))) == NULL)
108 		{
109 			logit(LL_ERR, "init_holiday: malloc failed for struct holiday!\n");
110 			exit(1);
111 		}
112 
113 		if (year)
114 		{
115 			DBGL(DL_MSG, (logit(LL_DBG, "init_holidays: add %d.%d.%d", day, month, year)));
116 		}
117 		else
118 		{
119 			DBGL(DL_MSG, (logit(LL_DBG, "init_holidays: add %d.%d", day, month)));
120 		}
121 
122 		newh->day = day;
123 		newh->month = month;
124 		newh->year = year;
125 		newh->next = NULL;
126 
127 		if (firsth == NULL)
128 		{
129 			firsth = newh;
130 		}
131 		else
132 		{
133 			lasth->next = newh;
134 		}
135 		lasth = newh;
136 	}
137 	fclose(fp);
138 }
139 
140 /*---------------------------------------------------------------------------*
141  *	free all holidays
142  *---------------------------------------------------------------------------*/
143 void
free_holidays(void)144 free_holidays(void)
145 {
146 	free_holiday(firsth);
147 }
148 
149 /*---------------------------------------------------------------------------*
150  *	free holidayes
151  *---------------------------------------------------------------------------*/
152 static void
free_holiday(struct holiday * ptr)153 free_holiday(struct holiday *ptr)
154 {
155 
156 	if (ptr == NULL)
157 		return;
158 
159 	if (ptr->next != NULL)
160 		free_holiday(ptr->next);
161 
162 	free(ptr);
163 }
164 
165 /*---------------------------------------------------------------------------*
166  *	check if date/month/year is a holiday
167  *---------------------------------------------------------------------------*/
168 int
isholiday(int d,int m,int y)169 isholiday(int d, int m, int y)
170 {
171 	struct holiday *ch = NULL;
172 
173 	if (firsth == NULL)
174 		return(0);
175 
176 	ch = firsth;
177 
178 	for (;;)
179 	{
180 		if (ch->day == d && ch->month == m)
181 		{
182 			if (ch->year == 0)
183 			{
184 				DBGL(DL_MSG, (logit(LL_DBG, "isholiday: %d.%d is a holiday!", d, m)));
185 				return(1);
186 			}
187 			else if (ch->year == y)
188 			{
189 				DBGL(DL_MSG, (logit(LL_DBG, "isholiday: %d.%d.%d is a holiday!", d, m, y)));
190 				return(1);
191 			}
192 		}
193 
194 		if (ch->next == NULL)
195 			break;
196 
197 		ch = ch->next;
198 	}
199 	return(0);
200 }
201 
202 /* EOF */
203