2 * timestr.c See if a string like 'Su2300-0700' matches (UUCP style).
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * Copyright 2000 The FreeRADIUS server project
21 * Copyright 2000 Alan DeKok <aland@ox.org>
24 static const char rcsid[] = "$Id$";
27 #include "libradius.h"
36 static const char *days[] =
37 { "su", "mo", "tu", "we", "th", "fr", "sa", "wk", "any", "al" };
39 #define DAYMIN (24*60)
40 #define WEEKMIN (24*60*7)
41 #define val(x) (( (x) < 48 || (x) > 57) ? 0 : ((x) - 48))
46 static int strcode (const char **str)
51 DEBUG2("strcode %s called\n", *str);
53 for (i = 0; i < 10; i++) {
57 if (strncmp(*str, days[i], l) == 0) {
62 DEBUG2("strcode result %d\n", i);
64 return (i >= 10) ? -1 : i;
69 * Fill bitmap with hours/mins.
71 static int hour_fill(char *bitmap, const char *tm)
77 DEBUG2("hour_fill called for %s\n", tm);
80 * Get timerange in start and end.
83 if ((p = strchr(tm, '-')) != NULL) {
85 if (p - tm != 5 || strlen(p) < 4 || !isdigit(*p))
87 end = 600 * val(p[0]) + 60 * val(p[1]) + atoi(p + 2);
93 if (strlen(tm) < 4 || !isdigit(*tm))
95 start = 600 * val(tm[0]) + 60 * val(tm[1]) + atoi(tm + 2);
96 if (end < 0) end = start;
98 /* Treat 2400 as 0000, and do some more silent error checks. */
100 if (start < 0) start = 0;
101 if (end >= DAYMIN) end = DAYMIN - 1;
102 if (start >= DAYMIN) start = DAYMIN - 1;
104 DEBUG2("hour_fill: range from %d to %d\n", start, end);
113 DEBUG2("setting byte %d, bit %d\n", byte, bit);
114 bitmap[byte] |= (1 << bit);
123 * Call the fill bitmap function for every day listed.
125 static int day_fill(char *bitmap, const char *tm)
131 for (hr = tm; *hr; hr++)
137 DEBUG2("dayfill: hr %s tm %s\n", hr, tm);
139 while ((start = strcode(&tm)) >= 0) {
141 * Find start and end weekdays and
142 * build a valid range 0 - 6.
146 if ((end = strcode(&tm)) < 0)
159 DEBUG2("day_fill: range from %d to %d\n", start, end);
161 hour_fill(bitmap + 180 * n, hr);
172 * Fill the week bitmap with allowed times.
174 static int week_fill(char *bitmap, char *tm)
179 strncpy(tmp, tm, 128);
181 for (s = tmp; *s; s++)
182 if (isupper(*s)) *s = tolower(*s);
184 s = strtok(tmp, ",|");
187 s = strtok(NULL, ",|");
194 * Match a timestring and return seconds left.
195 * -1 for no match, 0 for unlimited.
197 int timestr_match(char *tmstr, time_t t)
200 char bitmap[WEEKMIN / 8];
210 now = tm->tm_wday * DAYMIN + tm->tm_hour * 60 + tm->tm_min;
212 memset(bitmap, 0, sizeof(bitmap));
213 week_fill(bitmap, tmstr);
217 for (i = 0; i < 7; i++) {
219 s = bitmap + 180 * i;
220 for (y = 0; y < 23; y++) {
221 s = bitmap + 180 * i + (75 * y) / 10;
222 printf("%c", memcmp(s, null, 8) == 0 ? '.' : '#');
229 * See how many minutes we have.
235 DEBUG2("READ: checking byte %d bit %d\n", byte, bit);
236 if (!(bitmap[byte] & (1 << bit)))
247 return (i == now) ? 0 : tot;
252 int main(int argc, char **argv)
257 fprintf(stderr, "Usage: test timestring\n");
260 l = timestr_match(argv[1], time(NULL));
261 printf ("%s: %d seconds left\n", argv[1], l);