File Coverage

tstr_sv.h
Criterion Covered Total %
statement 80 118 67.8
branch 56 78 71.7
condition n/a
subroutine n/a
pod n/a
total 136 196 69.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 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 233           static inline int tstr_sv_year(pTHX_ SV *sv) {
64 233           int v = (int)SvIV(sv);
65 233 100         if (v < 1 || v > 9999)
    100          
66 8           croak("Parameter 'year' is out of range [1, 9999]");
67 225           return v;
68             }
69              
70 150           static inline int tstr_sv_month(pTHX_ SV *sv) {
71 150           int v = (int)SvIV(sv);
72 150 100         if (v < 1 || v > 12)
    100          
73 8           croak("Parameter 'month' is out of range [1, 12]");
74 142           return v;
75             }
76              
77 127           static inline int tstr_sv_day(pTHX_ SV *sv) {
78 127           int v = (int)SvIV(sv);
79 127 100         if (v < 1 || v > 31)
    100          
80 6           croak("Parameter 'day' is out of range [1, 31]");
81 121           return v;
82             }
83              
84 139           static inline void tstr_sv_ymd(pTHX_ SV *sv_y, SV *sv_m, SV *sv_d,
85             int *yp, int *mp, int *dp) {
86 139           *yp = tstr_sv_year(aTHX_ sv_y);
87 133           *mp = tstr_sv_month(aTHX_ sv_m);
88 127           *dp = tstr_sv_day(aTHX_ sv_d);
89 121           }
90              
91 94           static inline void tstr_sv_yd(pTHX_ SV *sv_y, SV *sv_d,
92             int *yp, int *dp) {
93 94           *yp = tstr_sv_year(aTHX_ sv_y);
94 92           int v = (int)SvIV(sv_d);
95 92 100         if (v < 1 || v > 366)
    100          
96 2           croak("Parameter 'day' is out of range [1, 366]");
97 90           *dp = v;
98 90           }
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 0           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 0           SV** start = sp;
144              
145 0           *++sp = k->k_year;
146 0           *++sp = sv_2mortal(newSViv(p->year));
147 0 0         if (p->flags & TSTR_PARSED_HAS_MONTH) {
148 0           *++sp = k->k_month;
149 0           *++sp = sv_2mortal(newSViv(p->month));
150             }
151 0 0         if (p->flags & TSTR_PARSED_HAS_DAY) {
152 0           *++sp = k->k_day;
153 0           *++sp = sv_2mortal(newSViv(p->day));
154             }
155              
156 0 0         if (p->flags & TSTR_PARSED_HAS_TIME) {
157 0           hour = p->hour;
158 0 0         if (p->flags & TSTR_PARSED_HAS_MERIDIEM)
159 0           hour = p->hour % 12 + p->meridiem;
160 0           *++sp = k->k_hour;
161 0           *++sp = sv_2mortal(newSViv(hour));
162 0 0         if (p->flags & TSTR_PARSED_HAS_MINUTE) {
163 0           *++sp = k->k_minute;
164 0           *++sp = sv_2mortal(newSViv(p->minute));
165             }
166 0 0         if (p->flags & TSTR_PARSED_HAS_SECOND) {
167 0           *++sp = k->k_second;
168 0           *++sp = sv_2mortal(newSViv(p->second));
169             }
170 0 0         if (p->flags & TSTR_PARSED_HAS_NANOSECOND) {
171 0           *++sp = k->k_nanosecond;
172 0           *++sp = sv_2mortal(newSViv(p->nanosecond));
173             }
174 0 0         if (p->flags & TSTR_PARSED_HAS_OFFSET) {
175 0           *++sp = k->k_tz_offset;
176 0           *++sp = sv_2mortal(newSViv(p->offset));
177             }
178             }
179              
180 0 0         if (p->flags & TSTR_PARSED_HAS_TZ_UTC) {
181 0           *++sp = k->k_tz_utc;
182 0           *++sp = sv_2mortal(newSVpvn(p->tz_utc, p->tz_utc_len));
183             }
184 0 0         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 0 0         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 0           return (int)(sp - start);
194             }
195              
196             #endif /* TSTR_SV_H */