Sync usage with man page.
[netbsd-mini2440.git] / usr.sbin / isdn / isdnd / holiday.c
blob4371ead999fb677580369e23c9efe76c43bf91b8
1 /*
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
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.
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.
25 *---------------------------------------------------------------------------
27 * isdnd - holiday file handling
28 * =============================
30 * $Id: holiday.c,v 1.4 2006/05/24 23:43:11 christos Exp $
32 * $FreeBSD$
34 * last edit-date: [Mon Oct 9 11:32:28 2000]
36 * Format:
38 * day.month.year optional comment (different day every year) or
39 * day.month optional comment (same day every year)
41 * i.e.:
43 * 23.4.2000 Ostersonntag
44 * 3.10 Tag der deutschen Einheit
48 *----------------------------------------------------------------------------*/
50 #include "isdnd.h"
52 struct holiday {
53 int day;
54 int month;
55 int year;
56 struct holiday *next;
59 static struct holiday *firsth = NULL;
61 #define MAXBUFSZ 256
63 static void free_holiday(struct holiday *ptr);
65 /*---------------------------------------------------------------------------*
66 * read in and init holidayes
67 *---------------------------------------------------------------------------*/
68 void
69 init_holidays(char *filename)
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;
78 firsth = NULL;
80 if ((fp = fopen(filename, "r")) == NULL)
82 logit(LL_ERR, "init_holiday: error opening holidayfile %s: %s!", filename, strerror(errno));
83 exit(1);
86 while((fgets(buffer, MAXBUFSZ, fp)) != NULL)
88 if (buffer[0] == '#' || buffer[0] == ' ' ||
89 buffer[0] == '\t' || buffer[0] == '\n')
91 continue;
94 ret = sscanf(buffer, "%d.%d.%d", &day, &month, &year);
96 if (ret != 3)
98 ret = sscanf(buffer, "%d.%d", &day, &month);
99 if (ret != 2)
101 logit(LL_ERR, "init_holiday: parse error for string [%s]!", buffer);
102 exit(1);
104 year = 0;
107 if ((newh = (struct holiday *) malloc(sizeof(struct holiday))) == NULL)
109 logit(LL_ERR, "init_holiday: malloc failed for struct holiday!\n");
110 exit(1);
113 if (year)
115 DBGL(DL_MSG, (logit(LL_DBG, "init_holidays: add %d.%d.%d", day, month, year)));
117 else
119 DBGL(DL_MSG, (logit(LL_DBG, "init_holidays: add %d.%d", day, month)));
122 newh->day = day;
123 newh->month = month;
124 newh->year = year;
125 newh->next = NULL;
127 if (firsth == NULL || lasth == NULL)
129 firsth = newh;
131 else
133 lasth->next = newh;
135 lasth = newh;
137 fclose(fp);
140 /*---------------------------------------------------------------------------*
141 * free all holidays
142 *---------------------------------------------------------------------------*/
143 void
144 free_holidays(void)
146 free_holiday(firsth);
149 /*---------------------------------------------------------------------------*
150 * free holidayes
151 *---------------------------------------------------------------------------*/
152 static void
153 free_holiday(struct holiday *ptr)
156 if (ptr == NULL)
157 return;
159 if (ptr->next != NULL)
160 free_holiday(ptr->next);
162 free(ptr);
165 /*---------------------------------------------------------------------------*
166 * check if date/month/year is a holiday
167 *---------------------------------------------------------------------------*/
169 isholiday(int d, int m, int y)
171 struct holiday *ch = NULL;
173 if (firsth == NULL)
174 return(0);
176 ch = firsth;
178 for (;;)
180 if (ch->day == d && ch->month == m)
182 if (ch->year == 0)
184 DBGL(DL_MSG, (logit(LL_DBG, "isholiday: %d.%d is a holiday!", d, m)));
185 return(1);
187 else if (ch->year == y)
189 DBGL(DL_MSG, (logit(LL_DBG, "isholiday: %d.%d.%d is a holiday!", d, m, y)));
190 return(1);
194 if (ch->next == NULL)
195 break;
197 ch = ch->next;
199 return(0);
202 /* EOF */