1: #include "global.h"
2:
3:
4: struct stridx {
5: char *str;
6: int id;
7: };
8:
9: static struct stridx months[] = {
10: { "jan", 0 }, { "january", 0 },
11: { "feb", 1 }, { "february", 1 },
12: { "mar", 2 }, { "march", 2 },
13: { "apr", 3 }, { "april", 3 },
14: { "may", 4 },
15: { "jun", 5 }, { "june", 5 },
16: { "jul", 6 }, { "july", 6 },
17: { "aug", 7 }, { "august", 7 },
18: { "sep", 8 }, { "september", 8 },
19: { "oct", 9 }, { "october", 9 },
20: { "nov", 10 }, { "november", 10 },
21: { "dec", 11 }, { "december", 11 },
22: };
23:
24: static struct stridx wdays[] = {
25: { "sun", 0 }, { "sunday", 0 },
26: { "mon", 1 }, { "monday", 1 },
27: { "tue", 2 }, { "tuesday", 2 },
28: { "wed", 3 }, { "wednesday", 3 },
29: { "thu", 4 }, { "thursday", 4 },
30: { "fri", 5 }, { "friday", 5 },
31: { "sat", 6 }, { "saturday", 6 },
32: };
33:
34: static int
35: stridx_compare(struct stridx * __restrict a, struct stridx * __restrict b)
36: {
37: return strcmp(a->str, b->str);
38: }
39:
40: static int
41: search4month(char * __restrict psMonth, int * __restrict id)
42: {
43: static int sorted = 0;
44: struct stridx *el;
45:
46: if (!psMonth)
47: return -1;
48:
49: if (!sorted) {
50: qsort(months, sizeof(months) / sizeof(struct stridx), sizeof(struct stridx),
51: (int (*)(const void*, const void*)) stridx_compare);
52: sorted++;
53: }
54:
55: str_Lower(psMonth);
56: el = bsearch(psMonth, months, sizeof(months) / sizeof(struct stridx), sizeof(struct stridx),
57: (int (*)(const void*, const void*)) stridx_compare);
58: if (el && id)
59: *id = el->id;
60:
61: return !!el;
62: }
63:
64: static int
65: search4wday(char * __restrict psWDay, int * __restrict id)
66: {
67: static int sorted = 0;
68: struct stridx *el;
69:
70: if (!psWDay)
71: return -1;
72:
73: if (!sorted) {
74: qsort(wdays, sizeof(wdays) / sizeof(struct stridx), sizeof(struct stridx),
75: (int (*)(const void*, const void*)) stridx_compare);
76: sorted++;
77: }
78:
79: str_Lower(psWDay);
80: el = bsearch(psWDay, wdays, sizeof(wdays) / sizeof(struct stridx), sizeof(struct stridx),
81: (int (*)(const void*, const void*)) stridx_compare);
82: if (el && id)
83: *id = el->id;
84:
85: return !!el;
86: }
87:
88:
89: /*
90: * time_Parse() - Parse and make unix time from standart time strings ...
91: *
92: * @csTime = Time string
93: * return: =0 error or !=0 converted time
94: */
95: time_t
96: time_Parse(const char *csTime)
97: {
98: struct tm tm;
99: char *s;
100: int tm_sec, tm_min, tm_hour, tm_mday, tm_year, tm_mon, tm_wday;
101: char str_mon[512], str_wday[512];
102:
103: memset(&tm, 0, sizeof tm);
104: memset(&str_mon, 0, sizeof str_mon);
105: memset(&str_wday, 0, sizeof str_wday);
106:
107: for (s = (char*) csTime; isspace(*s); s++);
108:
109: /*
110: * And do the sscanfs. WARNING: you can add more formats here,
111: * but be careful! You can easily screw up the parsing of existing
112: * formats when you add new ones. The order is important.
113: */
114:
115: /* DD-mth-YY HH:MM:SS GMT */
116: if (sscanf(s, "%d-%400[a-zA-Z]-%d %d:%d:%d GMT",
117: &tm_mday, str_mon, &tm_year,
118: &tm_hour, &tm_min, &tm_sec) == 6 &&
119: search4month(str_mon, &tm_mon)) {
120: tm.tm_mday = tm_mday;
121: tm.tm_mon = tm_mon;
122: tm.tm_year = tm_year;
123: tm.tm_hour = tm_hour;
124: tm.tm_min = tm_min;
125: tm.tm_sec = tm_sec;
126: }
127: /* DD mth YY HH:MM:SS GMT */
128: else if (sscanf(s, "%d %400[a-zA-Z] %d %d:%d:%d GMT",
129: &tm_mday, str_mon, &tm_year,
130: &tm_hour, &tm_min, &tm_sec) == 6 &&
131: search4month(str_mon, &tm_mon)) {
132: tm.tm_mday = tm_mday;
133: tm.tm_mon = tm_mon;
134: tm.tm_year = tm_year;
135: tm.tm_hour = tm_hour;
136: tm.tm_min = tm_min;
137: tm.tm_sec = tm_sec;
138: }
139: /* HH:MM:SS GMT DD-mth-YY */
140: else if (sscanf(s, "%d:%d:%d GMT %d-%400[a-zA-Z]-%d",
141: &tm_hour, &tm_min, &tm_sec,
142: &tm_mday, str_mon, &tm_year) == 6 &&
143: search4month(str_mon, &tm_mon)) {
144: tm.tm_hour = tm_hour;
145: tm.tm_min = tm_min;
146: tm.tm_sec = tm_sec;
147: tm.tm_mday = tm_mday;
148: tm.tm_mon = tm_mon;
149: tm.tm_year = tm_year;
150: }
151: /* HH:MM:SS GMT DD mth YY */
152: else if (sscanf(s, "%d:%d:%d GMT %d %400[a-zA-Z] %d",
153: &tm_hour, &tm_min, &tm_sec,
154: &tm_mday, str_mon, &tm_year) == 6 &&
155: search4month(str_mon, &tm_mon)) {
156: tm.tm_hour = tm_hour;
157: tm.tm_min = tm_min;
158: tm.tm_sec = tm_sec;
159: tm.tm_mday = tm_mday;
160: tm.tm_mon = tm_mon;
161: tm.tm_year = tm_year;
162: }
163: /* wdy, DD-mth-YY HH:MM:SS GMT */
164: else if (sscanf(s, "%400[a-zA-Z], %d-%400[a-zA-Z]-%d %d:%d:%d GMT",
165: str_wday, &tm_mday, str_mon,
166: &tm_year, &tm_hour, &tm_min, &tm_sec) == 7 &&
167: search4wday(str_wday, &tm_wday) &&
168: search4month(str_mon, &tm_mon)) {
169: tm.tm_wday = tm_wday;
170: tm.tm_mday = tm_mday;
171: tm.tm_mon = tm_mon;
172: tm.tm_year = tm_year;
173: tm.tm_hour = tm_hour;
174: tm.tm_min = tm_min;
175: tm.tm_sec = tm_sec;
176: }
177: /* wdy, DD mth YY HH:MM:SS GMT */
178: else if (sscanf(s, "%400[a-zA-Z], %d %400[a-zA-Z] %d %d:%d:%d GMT",
179: str_wday, &tm_mday, str_mon,
180: &tm_year, &tm_hour, &tm_min, &tm_sec) == 7 &&
181: search4wday(str_wday, &tm_wday) &&
182: search4month(str_mon, &tm_mon)) {
183: tm.tm_wday = tm_wday;
184: tm.tm_mday = tm_mday;
185: tm.tm_mon = tm_mon;
186: tm.tm_year = tm_year;
187: tm.tm_hour = tm_hour;
188: tm.tm_min = tm_min;
189: tm.tm_sec = tm_sec;
190: }
191: /* wdy mth DD HH:MM:SS GMT YY */
192: else if (sscanf(s, "%400[a-zA-Z] %400[a-zA-Z] %d %d:%d:%d GMT %d",
193: str_wday, str_mon, &tm_mday,
194: &tm_hour, &tm_min, &tm_sec, &tm_year) == 7 &&
195: search4wday(str_wday, &tm_wday) &&
196: search4month(str_mon, &tm_mon)) {
197: tm.tm_wday = tm_wday;
198: tm.tm_mon = tm_mon;
199: tm.tm_mday = tm_mday;
200: tm.tm_hour = tm_hour;
201: tm.tm_min = tm_min;
202: tm.tm_sec = tm_sec;
203: tm.tm_year = tm_year;
204: } else
205: return (time_t) -1;
206:
207: if (tm.tm_year > 1900)
208: tm.tm_year -= 1900;
209: else if (tm.tm_year < 70)
210: tm.tm_year += 100;
211:
212: return timegm(&tm);
213: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>