Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 1 | #include <time.h> |
| 2 | #include <pthread.h> |
| 3 | #include <errno.h> |
| 4 | #include <stdio.h> |
| 5 | #include <stdlib.h> |
| 6 | |
| 7 | int getdate_err; |
| 8 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 9 | struct tm* getdate(const char* s) { |
| 10 | static struct tm tmbuf; |
| 11 | struct tm* ret = 0; |
| 12 | char* datemsk = getenv("DATEMSK"); |
| 13 | FILE* f = 0; |
| 14 | char fmt[100], *p; |
| 15 | int cs; |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 16 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 17 | pthread_setcancelstate(PTHREAD_CANCEL_DEFERRED, &cs); |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 18 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 19 | if (!datemsk) { |
| 20 | getdate_err = 1; |
| 21 | goto out; |
| 22 | } |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 23 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 24 | f = fopen(datemsk, "rbe"); |
| 25 | if (!f) { |
| 26 | if (errno == ENOMEM) |
| 27 | getdate_err = 6; |
| 28 | else |
| 29 | getdate_err = 2; |
| 30 | goto out; |
| 31 | } |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 32 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 33 | while (fgets(fmt, sizeof fmt, f)) { |
| 34 | p = strptime(s, fmt, &tmbuf); |
| 35 | if (p && !*p) { |
| 36 | ret = &tmbuf; |
| 37 | goto out; |
| 38 | } |
| 39 | } |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 40 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 41 | getdate_err = 7; |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 42 | out: |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 43 | if (f) |
| 44 | fclose(f); |
| 45 | pthread_setcancelstate(cs, 0); |
| 46 | return ret; |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 47 | } |