chiark / gitweb /
Concentrate knowledge about the `pcre' API in one place.
[disorder] / lib / dateparse.c
1 /*
2  * This file is part of DisOrder
3  * Copyright (C) 2008 Richard Kettlewell
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 /** @file lib/dateparse.c
20  * @brief Date parsing
21  */
22
23 #include "common.h"
24
25 #include <time.h>
26
27 #include "dateparse.h"
28 #include "log.h"
29
30 /** @brief Date parsing patterns
31  *
32  * This set of patterns is designed to parse a specific time of a specific day,
33  * since that's what the scheduler needs.  Other requirements might need other
34  * pattern lists.
35  *
36  * NB DisOrder now uses my_strptime() instead of the system strptime().  This
37  * has some bits missing.  Therefore check carefuly before adding to this
38  * table.
39  */
40 static const char *const datemsk[] = {
41   /* ISO format */
42   "%Y-%m-%d %H:%M:%S",
43   /* Generic time, same day */
44   "%H:%M:%S",
45   "%H:%M",
46   /* "%Y-%m-%d %H:%M:%S %Z" - no, not sensibly supported anywhere */
47   /* Locale-specific date + time */
48   "%c",
49   "%Ec",
50   /* Locale-specific time, same day */
51   "%X",
52   "%EX",
53   NULL,
54 };
55
56 /** @brief Convert string to a @c time_t */
57 time_t dateparse(const char *s) {
58   struct tm t;
59   int rc;
60
61   switch(rc = xgetdate_r(s, &t, datemsk)) {
62   case 0:
63     return mktime(&t);
64   case 7:
65     disorder_fatal(0, "date string '%s' not in a recognized format", s);
66   case 8:
67     disorder_fatal(0, "date string '%s' not representable", s);
68   default:
69     disorder_fatal(0, "date string '%s' produced unexpected error %d", s, rc);
70   }
71 }
72
73 /*
74 Local Variables:
75 c-basic-offset:2
76 comment-column:40
77 fill-column:79
78 indent-tabs-mode:nil
79 End:
80 */