2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2004, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure
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
22 * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
23 * related information and legal notices. It is expected that any future
24 * projects/authors will amend these files as needed.
28 * hours.c: Game hours determination; is it legal to play now?
30 * Known contributors to this file:
41 static char *weekday(char *str, int *wday);
42 static char *daytime(char *str, int *min);
43 static char *daytime_range(char *str, int *from_min, int *to_min);
46 * Is week day WDAY (Sunday is 0) allowed by restriction DAYS?
47 * If DAYS is not empty, it lists the allowed week day names. See
48 * weekday() for syntax.
51 is_wday_allowed(int wday, char *days)
58 while (NULL != (days = weekday(days, &wd)))
66 * Is day time DTIME (minutes since midnight) allowed by restriction TIMES?
67 * If TIMES is not empty, it lists the allowed day time ranges. See
68 * daytime_range() for syntax.
71 is_daytime_allowed(int dtime, char *times)
75 if (!times || !*times)
78 while (NULL != (times = daytime_range(times, &from, &to)))
79 if (from <= dtime && dtime < to)
86 * Can the game played at time T?
94 if (!is_wday_allowed(tm->tm_wday, game_days))
96 return is_daytime_allowed(60 * tm->tm_hour + tm->tm_min, game_hours);
100 * Is day time DTIME (minutes since midnight) near a time in TIMES?
101 * TIMES is a list of day times. See daytime() for syntax.
102 * DTIME is near a listed time T if its within T and T + SLOP minutes.
105 is_daytime_near(int dtime, char *times, int slop)
110 while (NULL != (times = daytime(times, &dt)))
111 if (dt <= dtime && dtime < dt + slop)
118 * Return time in minutes between DTIME and next time in TIMES.
119 * If TIMES doesn't give a time, return -1.
120 * DTIME is day time in minutes since midnight.
121 * TIMES is a list of day times. See daytime() for syntax.
124 min_to_next_daytime(int dtime, char *times)
130 while (NULL != (times = daytime(times, &dt))) {
132 dt += 24 * 60; /* tomorrow */
138 if (mindt == INT_MAX)
140 return mindt - dtime;
144 * Parse weekday name in STR.
145 * On success assign day number (Sunday is 0) to *WDAY and return
146 * pointer to first character not parsed.
148 * Abbreviated names are recognized, but not single characters.
149 * Initial whitespace is ignored.
152 weekday(char *str, int *wday)
155 * strptime() format " %a" would do fine, but it's XPG and Windows
156 * doesn't have it. Besides, Empire accepts more abbreviations.
158 static char *day_name[7] = {
159 "sunday", "monday", "tuesday", "wednesday",
160 "thursday", "friday", "saturday" };
163 for (; isspace(*str); ++str) ;
165 for (i = 0; i < 7; ++i) {
167 while (str[j] && tolower(str[j]) == day_name[i][j])
179 * Parse day time in STR.
180 * On success store minutes since midnight in *MIN and return pointer
181 * to first character not parsed.
183 * Time format is HOUR:MINUTE. Initial whitespace is ignored.
186 daytime(char *str, int *min)
189 * strptime() format " %H:%M" would do fine, but it's XPG and
190 * Windows doesn't have it.
195 h = strtoul(str, &end, 10);
196 if (end == str || h > 23)
203 m = strtoul(str, &end, 10);
204 if (end == str || m > 59)
212 * Parse a day time range in STR.
213 * On success store minutes since midnight in *FROM and *TO, return
214 * pointer to first character not parsed.
216 * Format is HOUR:MINUTE-HOUR:MINUTE. Initial whitespace is ignored.
219 daytime_range(char *str, int *from_min, int *to_min)
223 end = daytime(str, from_min);
226 while (isspace(*end)) ++end;
229 return daytime(end, to_min);