File Coverage

tstr_sv.h
Criterion Covered Total %
statement 111 118 94.0
branch 68 78 87.1
condition n/a
subroutine n/a
pod n/a
total 179 196 91.3


line stmt bran cond sub pod time code
1             #ifndef TSTR_SV_H
2             #define TSTR_SV_H
3              
4             #include "tstr_format.h"
5             #include "tstr_parsed.h"
6              
7             typedef struct {
8             SV *k_year;
9             SV *k_month;
10             SV *k_day;
11             SV *k_hour;
12             SV *k_minute;
13             SV *k_second;
14             SV *k_nanosecond;
15             SV *k_tz_offset;
16             SV *k_tz_utc;
17             SV *k_tz_abbrev;
18             SV *k_tz_annotation;
19             SV *k_fraction;
20             SV *k_day_name;
21             SV *k_meridiem;
22             } tstr_sv_keys_t;
23              
24 1124           static inline tstr_format_t tstr_sv_format(pTHX_ SV *sv) {
25             const char *s;
26             STRLEN len;
27             tstr_format_t fmt;
28 1124           s = SvPV_const(sv, len);
29 1124           fmt = tstr_format_from_string(s, len);
30 1124 100         if (fmt == TSTR_FORMAT_UNKNOWN)
31 2           croak("Parameter 'format' is unknown: '%"SVf"'", sv);
32 1122           return fmt;
33             }
34              
35 26           static inline int tstr_sv_nanosecond(pTHX_ SV *sv) {
36 26           int v = (int)SvIV(sv);
37 26 100         if (v < 0 || v > 999999999)
    100          
38 2           croak("Parameter 'nanosecond' is out of range [0, 999_999_999]");
39 24           return v;
40             }
41              
42 110           static inline int tstr_sv_precision(pTHX_ SV *sv) {
43 110           int v = (int)SvIV(sv);
44 110 100         if (v < 0 || v > 9)
    100          
45 4           croak("Parameter 'precision' is out of range [0, 9]");
46 106           return v;
47             }
48              
49 39           static inline int tstr_sv_offset(pTHX_ SV *sv) {
50 39           int v = (int)SvIV(sv);
51 39 100         if (v < -1439 || v > 1439)
    100          
52 2           croak("Parameter 'offset' is out of range [-1439, 1439]");
53 37           return v;
54             }
55              
56 27           static inline int tstr_sv_pivot_year(pTHX_ SV *sv) {
57 27           int v = (int)SvIV(sv);
58 27 100         if (v < 0 || v > 9899)
    100          
59 4           croak("Parameter 'pivot_year' is out of range [0, 9899]");
60 23           return v;
61             }
62              
63 214           static inline int tstr_sv_year(pTHX_ SV *sv) {
64 214           int v = (int)SvIV(sv);
65 214 100         if (v < 1 || v > 9999)
    100          
66 8           croak("Parameter 'year' is out of range [1, 9999]");
67 206           return v;
68             }
69              
70 173           static inline int tstr_sv_month(pTHX_ SV *sv) {
71 173           int v = (int)SvIV(sv);
72 173 100         if (v < 1 || v > 12)
    100          
73 8           croak("Parameter 'month' is out of range [1, 12]");
74 165           return v;
75             }
76              
77 150           static inline int tstr_sv_day(pTHX_ SV *sv) {
78 150           int v = (int)SvIV(sv);
79 150 100         if (v < 1 || v > 31)
    100          
80 6           croak("Parameter 'day' is out of range [1, 31]");
81 144           return v;
82             }
83              
84 162           static inline void tstr_sv_ymd(pTHX_ SV *sv_y, SV *sv_m, SV *sv_d,
85             int *yp, int *mp, int *dp) {
86 162           *yp = tstr_sv_year(aTHX_ sv_y);
87 156           *mp = tstr_sv_month(aTHX_ sv_m);
88 150           *dp = tstr_sv_day(aTHX_ sv_d);
89 144           }
90              
91 52           static inline void tstr_sv_yd(pTHX_ SV *sv_y, SV *sv_d,
92             int *yp, int *dp) {
93 52           *yp = tstr_sv_year(aTHX_ sv_y);
94 50           int v = (int)SvIV(sv_d);
95 50 100         if (v < 1 || v > 366)
    100          
96 2           croak("Parameter 'day' is out of range [1, 366]");
97 48           *dp = v;
98 48           }
99              
100 760           static inline HV * tstr_sv_parsed_to_hv(pTHX_ const tstr_parsed_t *p,
101             tstr_sv_keys_t *k) {
102 760           HV *hv = newHV();
103             int hour;
104              
105 760           hv_store_ent(hv, k->k_year, newSViv(p->year), 0);
106 760 100         if (p->flags & TSTR_PARSED_HAS_MONTH)
107 758           hv_store_ent(hv, k->k_month, newSViv(p->month), 0);
108 760 100         if (p->flags & TSTR_PARSED_HAS_DAY)
109 755           hv_store_ent(hv, k->k_day, newSViv(p->day), 0);
110              
111 760 100         if (p->flags & TSTR_PARSED_HAS_TIME) {
112 638           hour = p->hour;
113 638 100         if (p->flags & TSTR_PARSED_HAS_MERIDIEM)
114 22           hour = p->hour % 12 + p->meridiem;
115 638           hv_store_ent(hv, k->k_hour, newSViv(hour), 0);
116 638 100         if (p->flags & TSTR_PARSED_HAS_MINUTE)
117 629           hv_store_ent(hv, k->k_minute, newSViv(p->minute), 0);
118 638 100         if (p->flags & TSTR_PARSED_HAS_SECOND)
119 591           hv_store_ent(hv, k->k_second, newSViv(p->second), 0);
120 638 100         if (p->flags & TSTR_PARSED_HAS_NANOSECOND)
121 213           hv_store_ent(hv, k->k_nanosecond, newSViv(p->nanosecond), 0);
122 638 100         if (p->flags & TSTR_PARSED_HAS_OFFSET)
123 582           hv_store_ent(hv, k->k_tz_offset, newSViv(p->offset), 0);
124             }
125              
126 760 100         if (p->flags & TSTR_PARSED_HAS_TZ_UTC)
127 320           hv_store_ent(hv, k->k_tz_utc,
128             newSVpvn(p->tz_utc, p->tz_utc_len), 0);
129 760 100         if (p->flags & TSTR_PARSED_HAS_TZ_ABBREV)
130 5           hv_store_ent(hv, k->k_tz_abbrev,
131             newSVpvn(p->tz_abbrev, p->tz_abbrev_len), 0);
132 760 100         if (p->flags & TSTR_PARSED_HAS_TZ_ANNOTATION)
133 23           hv_store_ent(hv, k->k_tz_annotation,
134             newSVpvn(p->tz_annotation, p->tz_annotation_len), 0);
135              
136 760           return hv;
137             }
138              
139 4           static inline int tstr_sv_parsed_to_stack(pTHX_ const tstr_parsed_t* p,
140             tstr_sv_keys_t* k,
141             SV** sp) {
142             int hour;
143 4           SV** start = sp;
144              
145 4           *++sp = k->k_year;
146 4           *++sp = sv_2mortal(newSViv(p->year));
147 4 50         if (p->flags & TSTR_PARSED_HAS_MONTH) {
148 4           *++sp = k->k_month;
149 4           *++sp = sv_2mortal(newSViv(p->month));
150             }
151 4 50         if (p->flags & TSTR_PARSED_HAS_DAY) {
152 4           *++sp = k->k_day;
153 4           *++sp = sv_2mortal(newSViv(p->day));
154             }
155              
156 4 50         if (p->flags & TSTR_PARSED_HAS_TIME) {
157 4           hour = p->hour;
158 4 50         if (p->flags & TSTR_PARSED_HAS_MERIDIEM)
159 0           hour = p->hour % 12 + p->meridiem;
160 4           *++sp = k->k_hour;
161 4           *++sp = sv_2mortal(newSViv(hour));
162 4 50         if (p->flags & TSTR_PARSED_HAS_MINUTE) {
163 4           *++sp = k->k_minute;
164 4           *++sp = sv_2mortal(newSViv(p->minute));
165             }
166 4 50         if (p->flags & TSTR_PARSED_HAS_SECOND) {
167 4           *++sp = k->k_second;
168 4           *++sp = sv_2mortal(newSViv(p->second));
169             }
170 4 50         if (p->flags & TSTR_PARSED_HAS_NANOSECOND) {
171 0           *++sp = k->k_nanosecond;
172 0           *++sp = sv_2mortal(newSViv(p->nanosecond));
173             }
174 4 50         if (p->flags & TSTR_PARSED_HAS_OFFSET) {
175 4           *++sp = k->k_tz_offset;
176 4           *++sp = sv_2mortal(newSViv(p->offset));
177             }
178             }
179              
180 4 100         if (p->flags & TSTR_PARSED_HAS_TZ_UTC) {
181 3           *++sp = k->k_tz_utc;
182 3           *++sp = sv_2mortal(newSVpvn(p->tz_utc, p->tz_utc_len));
183             }
184 4 50         if (p->flags & TSTR_PARSED_HAS_TZ_ABBREV) {
185 0           *++sp = k->k_tz_abbrev;
186 0           *++sp = sv_2mortal(newSVpvn(p->tz_abbrev, p->tz_abbrev_len));
187             }
188 4 50         if (p->flags & TSTR_PARSED_HAS_TZ_ANNOTATION) {
189 0           *++sp = k->k_tz_annotation;
190 0           *++sp = sv_2mortal(newSVpvn(p->tz_annotation, p->tz_annotation_len));
191             }
192              
193 4           return (int)(sp - start);
194             }
195              
196             #endif /* TSTR_SV_H */