2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure, Markus Armbruster
6 * Empire 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 3 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, see <http://www.gnu.org/licenses/>.
21 * See files README, COPYING and CREDITS in the root of the source
22 * tree for related information and legal notices. It is expected
23 * that future projects/authors will amend these files as needed.
27 * hours.c: Game hours determination; is it legal to play now?
29 * Known contributors to this file:
33 * Markus Armbruster, 2004-2010
42 #include "prototypes.h"
44 static char *weekday(char *str, int *wday);
45 static char *daytime_range(char *str, int *from_min, int *to_min);
48 * Is week day WDAY (Sunday is 0) allowed by restriction DAYS?
49 * If DAYS is not empty, it lists the allowed week day names. See
50 * weekday() for syntax.
53 is_wday_allowed(int wday, char *days)
60 while (NULL != (days = weekday(days, &wd)))
68 * Is day time DTIME (minutes since midnight) allowed by restriction TIMES?
69 * If TIMES is not empty, it lists the allowed day time ranges. See
70 * daytime_range() for syntax.
73 is_daytime_allowed(int dtime, char *times)
77 if (!times || !*times)
80 while (NULL != (times = daytime_range(times, &from, &to)))
81 if (from <= dtime && dtime < to)
88 * Can the game played at time T?
96 if (!is_wday_allowed(tm->tm_wday, game_days))
98 return is_daytime_allowed(60 * tm->tm_hour + tm->tm_min, game_hours);
102 * Parse weekday name in STR.
103 * On success assign day number (Sunday is 0) to *WDAY and return
104 * pointer to first character not parsed.
106 * Abbreviated names are recognized, but not single characters.
107 * Initial whitespace is ignored.
110 weekday(char *str, int *wday)
113 * strptime() format " %a" would do fine, but it's XPG and Windows
114 * doesn't have it. Besides, Empire accepts more abbreviations.
116 static char *day_name[7] = {
117 "sunday", "monday", "tuesday", "wednesday",
118 "thursday", "friday", "saturday"
122 for (; isspace(*str); ++str) ;
124 for (i = 0; i < 7; ++i) {
126 while (str[j] && tolower(str[j]) == day_name[i][j])
138 * Parse day time in STR.
139 * On success store minutes since midnight in *MIN and return pointer
140 * to first character not parsed.
142 * Time format is HOUR:MINUTE. Initial whitespace is ignored.
145 daytime(char *str, int *min)
148 * strptime() format " %H:%M" would do fine, but it's XPG and
149 * Windows doesn't have it.
154 h = strtoul(str, &end, 10);
155 if (end == str || h > 24)
162 m = strtoul(str, &end, 10);
163 if (end == str || m > 59)
165 else if (h == 24 && m != 0)
173 * Parse a day time range in STR.
174 * On success store minutes since midnight in *FROM and *TO, return
175 * pointer to first character not parsed.
177 * Format is HOUR:MINUTE-HOUR:MINUTE. Initial whitespace is ignored.
180 daytime_range(char *str, int *from_min, int *to_min)
184 end = daytime(str, from_min);
187 while (isspace(*end)) ++end;
190 return daytime(end, to_min);