2 * Copyright (c) 2000, Hellmuth Michaelis. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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
25 *---------------------------------------------------------------------------
27 * isdnd - holiday file handling
28 * =============================
30 * $Id: holiday.c,v 1.4 2006/05/24 23:43:11 christos Exp $
34 * last edit-date: [Mon Oct 9 11:32:28 2000]
38 * day.month.year optional comment (different day every year) or
39 * day.month optional comment (same day every year)
43 * 23.4.2000 Ostersonntag
44 * 3.10 Tag der deutschen Einheit
48 *----------------------------------------------------------------------------*/
59 static struct holiday
*firsth
= NULL
;
63 static void free_holiday(struct holiday
*ptr
);
65 /*---------------------------------------------------------------------------*
66 * read in and init holidayes
67 *---------------------------------------------------------------------------*/
69 init_holidays(char *filename
)
72 unsigned char buffer
[MAXBUFSZ
+ 1];
73 struct holiday
*newh
= NULL
;
74 struct holiday
*lasth
= NULL
;
80 if ((fp
= fopen(filename
, "r")) == NULL
)
82 logit(LL_ERR
, "init_holiday: error opening holidayfile %s: %s!", filename
, strerror(errno
));
86 while((fgets(buffer
, MAXBUFSZ
, fp
)) != NULL
)
88 if (buffer
[0] == '#' || buffer
[0] == ' ' ||
89 buffer
[0] == '\t' || buffer
[0] == '\n')
94 ret
= sscanf(buffer
, "%d.%d.%d", &day
, &month
, &year
);
98 ret
= sscanf(buffer
, "%d.%d", &day
, &month
);
101 logit(LL_ERR
, "init_holiday: parse error for string [%s]!", buffer
);
107 if ((newh
= (struct holiday
*) malloc(sizeof(struct holiday
))) == NULL
)
109 logit(LL_ERR
, "init_holiday: malloc failed for struct holiday!\n");
115 DBGL(DL_MSG
, (logit(LL_DBG
, "init_holidays: add %d.%d.%d", day
, month
, year
)));
119 DBGL(DL_MSG
, (logit(LL_DBG
, "init_holidays: add %d.%d", day
, month
)));
127 if (firsth
== NULL
|| lasth
== NULL
)
140 /*---------------------------------------------------------------------------*
142 *---------------------------------------------------------------------------*/
146 free_holiday(firsth
);
149 /*---------------------------------------------------------------------------*
151 *---------------------------------------------------------------------------*/
153 free_holiday(struct holiday
*ptr
)
159 if (ptr
->next
!= NULL
)
160 free_holiday(ptr
->next
);
165 /*---------------------------------------------------------------------------*
166 * check if date/month/year is a holiday
167 *---------------------------------------------------------------------------*/
169 isholiday(int d
, int m
, int y
)
171 struct holiday
*ch
= NULL
;
180 if (ch
->day
== d
&& ch
->month
== m
)
184 DBGL(DL_MSG
, (logit(LL_DBG
, "isholiday: %d.%d is a holiday!", d
, m
)));
187 else if (ch
->year
== y
)
189 DBGL(DL_MSG
, (logit(LL_DBG
, "isholiday: %d.%d.%d is a holiday!", d
, m
, y
)));
194 if (ch
->next
== NULL
)