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))
43 #if 0 /* Set to 1 if you're a developer and want to debug this code */
44 # define timestr_debug DEBUG2
46 # define timestr_debug if (0) printf
52 static int strcode (const char **str)
57 timestr_debug("strcode %s called\n", *str);
59 for (i = 0; i < 10; i++) {
63 if (strncmp(*str, days[i], l) == 0) {
68 timestr_debug("strcode result %d\n", i);
70 return (i >= 10) ? -1 : i;
75 * Fill bitmap with hours/mins.
77 static int hour_fill(char *bitmap, const char *tm)
83 timestr_debug("hour_fill called for %s\n", tm);
86 * Get timerange in start and end.
89 if ((p = strchr(tm, '-')) != NULL) {
91 if (p - tm != 5 || strlen(p) < 4 || !isdigit(*p))
93 end = 600 * val(p[0]) + 60 * val(p[1]) + atoi(p + 2);
99 if (strlen(tm) < 4 || !isdigit(*tm))
101 start = 600 * val(tm[0]) + 60 * val(tm[1]) + atoi(tm + 2);
102 if (end < 0) end = start;
104 /* Treat 2400 as 0000, and do some more silent error checks. */
105 if (end < 0) end = 0;
106 if (start < 0) start = 0;
107 if (end >= DAYMIN) end = DAYMIN - 1;
108 if (start >= DAYMIN) start = DAYMIN - 1;
110 timestr_debug("hour_fill: range from %d to %d\n", start, end);
119 timestr_debug("setting byte %d, bit %d\n", byte, bit);
120 bitmap[byte] |= (1 << bit);
129 * Call the fill bitmap function for every day listed.
131 static int day_fill(char *bitmap, const char *tm)
137 for (hr = tm; *hr; hr++)
143 timestr_debug("dayfill: hr %s tm %s\n", hr, tm);
145 while ((start = strcode(&tm)) >= 0) {
147 * Find start and end weekdays and
148 * build a valid range 0 - 6.
152 if ((end = strcode(&tm)) < 0)
165 timestr_debug("day_fill: range from %d to %d\n", start, end);
167 hour_fill(bitmap + 180 * n, hr);
178 * Fill the week bitmap with allowed times.
180 static int week_fill(char *bitmap, char *tm)
185 strncpy(tmp, tm, 128);
187 for (s = tmp; *s; s++)
188 if (isupper(*s)) *s = tolower(*s);
190 s = strtok(tmp, ",|");
193 s = strtok(NULL, ",|");
200 * Match a timestring and return seconds left.
201 * -1 for no match, 0 for unlimited.
203 int timestr_match(char *tmstr, time_t t)
206 char bitmap[WEEKMIN / 8];
216 now = tm->tm_wday * DAYMIN + tm->tm_hour * 60 + tm->tm_min;
218 memset(bitmap, 0, sizeof(bitmap));
219 week_fill(bitmap, tmstr);
223 for (i = 0; i < 7; i++) {
225 s = bitmap + 180 * i;
226 for (y = 0; y < 23; y++) {
227 s = bitmap + 180 * i + (75 * y) / 10;
228 printf("%c", memcmp(s, null, 8) == 0 ? '.' : '#');
235 * See how many minutes we have.
241 timestr_debug("READ: checking byte %d bit %d\n", byte, bit);
242 if (!(bitmap[byte] & (1 << bit)))
253 return (i == now) ? 0 : tot;
258 int main(int argc, char **argv)
263 fprintf(stderr, "Usage: test timestring\n");
266 l = timestr_match(argv[1], time(NULL));
267 printf ("%s: %d seconds left\n", argv[1], l);