File Coverage

tstr_sv.h
Criterion Covered Total %
statement 73 111 65.7
branch 52 74 70.2
condition n/a
subroutine n/a
pod n/a
total 125 185 67.5


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 1074           static inline tstr_format_t tstr_sv_format(pTHX_ SV *sv) {
25             const char *s;
26             STRLEN len;
27             tstr_format_t fmt;
28 1074           s = SvPV_const(sv, len);
29 1074           fmt = tstr_format_from_string(s, len);
30 1074 100         if (fmt == TSTR_FORMAT_UNKNOWN)
31 2           croak("Parameter 'format' is unknown: '%"SVf"'", sv);
32 1072           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 109           static inline int tstr_sv_precision(pTHX_ SV *sv) {
43 109           int v = (int)SvIV(sv);
44 109 100         if (v < 0 || v > 9)
    100          
45 4           croak("Parameter 'precision' is out of range [0, 9]");
46 105           return v;
47             }
48              
49 37           static inline int tstr_sv_offset(pTHX_ SV *sv) {
50 37           int v = (int)SvIV(sv);
51 37 100         if (v < -1439 || v > 1439)
    100          
52 2           croak("Parameter 'offset' is out of range [-1439, 1439]");
53 35           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 73           static inline int tstr_sv_year(pTHX_ SV *sv) {
64 73           int v = (int)SvIV(sv);
65 73 100         if (v < 1 || v > 9999)
    100          
66 4           croak("Parameter 'year' is out of range [1, 9999]");
67 69           return v;
68             }
69              
70 86           static inline int tstr_sv_month(pTHX_ SV *sv) {
71 86           int v = (int)SvIV(sv);
72 86 100         if (v < 1 || v > 12)
    100          
73 6           croak("Parameter 'month' is out of range [1, 12]");
74 80           return v;
75             }
76              
77 65           static inline int tstr_sv_day(pTHX_ SV *sv) {
78 65           int v = (int)SvIV(sv);
79 65 100         if (v < 1 || v > 31)
    100          
80 4           croak("Parameter 'day' is out of range [1, 31]");
81 61           return v;
82             }
83              
84 73           static inline void tstr_sv_ymd(pTHX_ SV *sv_y, SV *sv_m, SV *sv_d,
85             int *yp, int *mp, int *dp) {
86 73           *yp = tstr_sv_year(aTHX_ sv_y);
87 69           *mp = tstr_sv_month(aTHX_ sv_m);
88 65           *dp = tstr_sv_day(aTHX_ sv_d);
89 61           }
90              
91 760           static inline HV * tstr_sv_parsed_to_hv(pTHX_ const tstr_parsed_t *p,
92             tstr_sv_keys_t *k) {
93 760           HV *hv = newHV();
94             int hour;
95              
96 760           hv_store_ent(hv, k->k_year, newSViv(p->year), 0);
97 760 100         if (p->flags & TSTR_PARSED_HAS_MONTH)
98 758           hv_store_ent(hv, k->k_month, newSViv(p->month), 0);
99 760 100         if (p->flags & TSTR_PARSED_HAS_DAY)
100 755           hv_store_ent(hv, k->k_day, newSViv(p->day), 0);
101              
102 760 100         if (p->flags & TSTR_PARSED_HAS_TIME) {
103 638           hour = p->hour;
104 638 100         if (p->flags & TSTR_PARSED_HAS_MERIDIEM)
105 22           hour = p->hour % 12 + p->meridiem;
106 638           hv_store_ent(hv, k->k_hour, newSViv(hour), 0);
107 638 100         if (p->flags & TSTR_PARSED_HAS_MINUTE)
108 629           hv_store_ent(hv, k->k_minute, newSViv(p->minute), 0);
109 638 100         if (p->flags & TSTR_PARSED_HAS_SECOND)
110 591           hv_store_ent(hv, k->k_second, newSViv(p->second), 0);
111 638 100         if (p->flags & TSTR_PARSED_HAS_NANOSECOND)
112 213           hv_store_ent(hv, k->k_nanosecond, newSViv(p->nanosecond), 0);
113 638 100         if (p->flags & TSTR_PARSED_HAS_OFFSET)
114 582           hv_store_ent(hv, k->k_tz_offset, newSViv(p->offset), 0);
115             }
116              
117 760 100         if (p->flags & TSTR_PARSED_HAS_TZ_UTC)
118 320           hv_store_ent(hv, k->k_tz_utc,
119             newSVpvn(p->tz_utc, p->tz_utc_len), 0);
120 760 100         if (p->flags & TSTR_PARSED_HAS_TZ_ABBREV)
121 5           hv_store_ent(hv, k->k_tz_abbrev,
122             newSVpvn(p->tz_abbrev, p->tz_abbrev_len), 0);
123 760 100         if (p->flags & TSTR_PARSED_HAS_TZ_ANNOTATION)
124 23           hv_store_ent(hv, k->k_tz_annotation,
125             newSVpvn(p->tz_annotation, p->tz_annotation_len), 0);
126              
127 760           return hv;
128             }
129              
130 0           static inline int tstr_sv_parsed_to_stack(pTHX_ const tstr_parsed_t* p,
131             tstr_sv_keys_t* k,
132             SV** sp) {
133             int hour;
134 0           SV** start = sp;
135              
136 0           *++sp = k->k_year;
137 0           *++sp = sv_2mortal(newSViv(p->year));
138 0 0         if (p->flags & TSTR_PARSED_HAS_MONTH) {
139 0           *++sp = k->k_month;
140 0           *++sp = sv_2mortal(newSViv(p->month));
141             }
142 0 0         if (p->flags & TSTR_PARSED_HAS_DAY) {
143 0           *++sp = k->k_day;
144 0           *++sp = sv_2mortal(newSViv(p->day));
145             }
146              
147 0 0         if (p->flags & TSTR_PARSED_HAS_TIME) {
148 0           hour = p->hour;
149 0 0         if (p->flags & TSTR_PARSED_HAS_MERIDIEM)
150 0           hour = p->hour % 12 + p->meridiem;
151 0           *++sp = k->k_hour;
152 0           *++sp = sv_2mortal(newSViv(hour));
153 0 0         if (p->flags & TSTR_PARSED_HAS_MINUTE) {
154 0           *++sp = k->k_minute;
155 0           *++sp = sv_2mortal(newSViv(p->minute));
156             }
157 0 0         if (p->flags & TSTR_PARSED_HAS_SECOND) {
158 0           *++sp = k->k_second;
159 0           *++sp = sv_2mortal(newSViv(p->second));
160             }
161 0 0         if (p->flags & TSTR_PARSED_HAS_NANOSECOND) {
162 0           *++sp = k->k_nanosecond;
163 0           *++sp = sv_2mortal(newSViv(p->nanosecond));
164             }
165 0 0         if (p->flags & TSTR_PARSED_HAS_OFFSET) {
166 0           *++sp = k->k_tz_offset;
167 0           *++sp = sv_2mortal(newSViv(p->offset));
168             }
169             }
170              
171 0 0         if (p->flags & TSTR_PARSED_HAS_TZ_UTC) {
172 0           *++sp = k->k_tz_utc;
173 0           *++sp = sv_2mortal(newSVpvn(p->tz_utc, p->tz_utc_len));
174             }
175 0 0         if (p->flags & TSTR_PARSED_HAS_TZ_ABBREV) {
176 0           *++sp = k->k_tz_abbrev;
177 0           *++sp = sv_2mortal(newSVpvn(p->tz_abbrev, p->tz_abbrev_len));
178             }
179 0 0         if (p->flags & TSTR_PARSED_HAS_TZ_ANNOTATION) {
180 0           *++sp = k->k_tz_annotation;
181 0           *++sp = sv_2mortal(newSVpvn(p->tz_annotation, p->tz_annotation_len));
182             }
183              
184 0           return (int)(sp - start);
185             }
186              
187             #endif /* TSTR_SV_H */