File Coverage

tstr_parsed.h
Criterion Covered Total %
statement 0 15 0.0
branch 0 20 0.0
condition n/a
subroutine n/a
pod n/a
total 0 35 0.0


line stmt bran cond sub pod time code
1             #ifndef TSTR_PARSED_H
2             #define TSTR_PARSED_H
3              
4             #include
5             #include
6             #include
7              
8             enum {
9             TSTR_PARSED_HAS_TIME = (1 << 0),
10             TSTR_PARSED_HAS_MINUTE = (1 << 1),
11             TSTR_PARSED_HAS_SECOND = (1 << 2),
12             TSTR_PARSED_HAS_NANOSECOND = (1 << 3),
13             TSTR_PARSED_HAS_OFFSET = (1 << 4),
14             TSTR_PARSED_HAS_TZ_UTC = (1 << 5),
15             TSTR_PARSED_HAS_TZ_ABBREV = (1 << 6),
16             TSTR_PARSED_HAS_TZ_ANNOTATION = (1 << 7),
17             TSTR_PARSED_HAS_DAY_NAME = (1 << 8),
18             TSTR_PARSED_HAS_MERIDIEM = (1 << 9),
19             TSTR_PARSED_HAS_MONTH = (1 << 10),
20             TSTR_PARSED_HAS_DAY = (1 << 11),
21             TSTR_PARSED_HAS_YEAR2 = (1 << 12)
22             };
23              
24             #define TSTR_NANOS_PER_SECOND 1000000000
25             #define TSTR_PARSED_MAX_FIELDS 11
26              
27             typedef struct {
28             int year;
29             int month;
30             int day;
31             int hour;
32             int minute;
33             int second;
34             int nanosecond;
35             int offset;
36             int day_name;
37             int meridiem;
38             unsigned int flags;
39             const char *tz_utc;
40             const char *tz_abbrev;
41             const char *tz_annotation;
42             size_t tz_utc_len;
43             size_t tz_abbrev_len;
44             size_t tz_annotation_len;
45             } tstr_parsed_t;
46              
47             static inline tstr_parsed_t * tstr_parsed_init(tstr_parsed_t *p) {
48             memset(p, 0, sizeof(*p));
49             return p;
50             };
51              
52 0           static inline int tstr_parsed_field_count(const tstr_parsed_t *p) {
53 0           int n = 1; // year
54 0           unsigned int f = p->flags;
55              
56 0 0         if (f & TSTR_PARSED_HAS_MONTH) n++;
57 0 0         if (f & TSTR_PARSED_HAS_DAY) n++;
58 0 0         if (f & TSTR_PARSED_HAS_TIME) {
59 0           n++;
60 0 0         if (f & TSTR_PARSED_HAS_MINUTE) n++;
61 0 0         if (f & TSTR_PARSED_HAS_SECOND) n++;
62 0 0         if (f & TSTR_PARSED_HAS_NANOSECOND) n++;
63 0 0         if (f & TSTR_PARSED_HAS_OFFSET) n++;
64             }
65 0 0         if (f & TSTR_PARSED_HAS_TZ_UTC) n++;
66 0 0         if (f & TSTR_PARSED_HAS_TZ_ABBREV) n++;
67 0 0         if (f & TSTR_PARSED_HAS_TZ_ANNOTATION) n++;
68 0           return n;
69             }
70              
71             static inline void tstr_parsed_set_year4(tstr_parsed_t *p, int v) {
72             p->year = v;
73             }
74              
75             static inline void tstr_parsed_set_year2(tstr_parsed_t *p, int v) {
76             p->year = v;
77             p->flags |= TSTR_PARSED_HAS_YEAR2;
78             }
79              
80             static inline void tstr_parsed_set_month(tstr_parsed_t *p, int v) {
81             p->month = v;
82             p->flags |= TSTR_PARSED_HAS_MONTH;
83             }
84              
85             static inline void tstr_parsed_set_day(tstr_parsed_t *p, int v) {
86             p->day = v;
87             p->flags |= TSTR_PARSED_HAS_DAY;
88             }
89              
90             static inline void tstr_parsed_set_day_name(tstr_parsed_t *p, int v) {
91             p->day_name = v;
92             p->flags |= TSTR_PARSED_HAS_DAY_NAME;
93             }
94              
95             static inline void tstr_parsed_set_hour(tstr_parsed_t *p, int v) {
96             p->hour = v;
97             p->flags |= TSTR_PARSED_HAS_TIME;
98             }
99              
100             static inline void tstr_parsed_set_meridiem(tstr_parsed_t *p, int v) {
101             p->meridiem = v;
102             p->flags |= TSTR_PARSED_HAS_MERIDIEM;
103             }
104              
105             static inline void tstr_parsed_set_minute(tstr_parsed_t *p, int v) {
106             p->minute = v;
107             p->flags |= TSTR_PARSED_HAS_MINUTE;
108             }
109              
110             static inline void tstr_parsed_set_second(tstr_parsed_t *p, int v) {
111             p->second = v;
112             p->flags |= TSTR_PARSED_HAS_SECOND;
113             }
114              
115             static inline void tstr_parsed_set_nanosecond(tstr_parsed_t *p, int v) {
116             p->nanosecond = v;
117             p->flags |= TSTR_PARSED_HAS_NANOSECOND;
118             }
119              
120             static inline void tstr_parsed_set_offset(tstr_parsed_t *p, int v) {
121             p->offset = v;
122             p->flags |= TSTR_PARSED_HAS_OFFSET;
123             }
124              
125             static inline void tstr_parsed_set_tz_utc(tstr_parsed_t *p, const char *s, size_t len) {
126             p->tz_utc = s;
127             p->tz_utc_len = len;
128             p->flags |= TSTR_PARSED_HAS_TZ_UTC;
129             if (!(p->flags & TSTR_PARSED_HAS_OFFSET)) {
130             p->offset = 0;
131             p->flags |= TSTR_PARSED_HAS_OFFSET;
132             }
133             }
134              
135             static inline void tstr_parsed_set_tz_abbrev(tstr_parsed_t *p, const char *s, size_t len) {
136             p->tz_abbrev = s;
137             p->tz_abbrev_len = len;
138             p->flags |= TSTR_PARSED_HAS_TZ_ABBREV;
139             }
140              
141             static inline void tstr_parsed_set_tz_annotation(tstr_parsed_t *p, const char *s, size_t len) {
142             p->tz_annotation = s;
143             p->tz_annotation_len = len;
144             p->flags |= TSTR_PARSED_HAS_TZ_ANNOTATION;
145             }
146              
147             static inline void tstr_parsed_set_fraction(tstr_parsed_t *p, int nanos) {
148             if (p->flags & TSTR_PARSED_HAS_SECOND) {
149             p->nanosecond = nanos;
150             p->flags |= TSTR_PARSED_HAS_NANOSECOND;
151             } else if (p->flags & TSTR_PARSED_HAS_MINUTE) {
152             uint64_t total_ns = (uint64_t)nanos * 60;
153             p->second = (int)(total_ns / TSTR_NANOS_PER_SECOND);
154             p->flags |= TSTR_PARSED_HAS_SECOND;
155             nanos = (int)(total_ns % TSTR_NANOS_PER_SECOND);
156             if (nanos) {
157             p->nanosecond = nanos;
158             p->flags |= TSTR_PARSED_HAS_NANOSECOND;
159             }
160             } else {
161             uint64_t total_ns = (uint64_t)nanos * 3600;
162             int min, sec;
163             min = (int)(total_ns / ((uint64_t)60 * TSTR_NANOS_PER_SECOND));
164             p->minute = min;
165             p->flags |= TSTR_PARSED_HAS_MINUTE;
166             total_ns -= (uint64_t)min * 60 * TSTR_NANOS_PER_SECOND;
167             sec = (int)(total_ns / TSTR_NANOS_PER_SECOND);
168             nanos = (int)(total_ns % TSTR_NANOS_PER_SECOND);
169             if (sec || nanos) {
170             p->second = sec;
171             p->flags |= TSTR_PARSED_HAS_SECOND;
172             if (nanos) {
173             p->nanosecond = nanos;
174             p->flags |= TSTR_PARSED_HAS_NANOSECOND;
175             }
176             }
177             }
178             }
179              
180             #endif /* TSTR_PARSED_H */