File Coverage

DJB.xs
Criterion Covered Total %
statement 103 108 95.3
branch 86 156 55.1
condition n/a
subroutine n/a
pod n/a
total 189 264 71.5


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT
2             #include "EXTERN.h"
3             #include "perl.h"
4             #include "XSUB.h"
5              
6             #include
7             #include
8             #include "djbsort_src/djbsort.h"
9              
10             /* ---- int32 helpers ---- */
11              
12             static int32_t *
13 15           av_to_int32(pTHX_ AV *av, SSize_t *n_out)
14             {
15 15           SSize_t n = av_len(av) + 1;
16             int32_t *buf;
17             SSize_t i;
18 15           *n_out = n;
19 15 100         if (n == 0) return NULL;
20 14 50         Newx(buf, n, int32_t);
21 1249 100         for (i = 0; i < n; i++) {
22 1235           SV **svp = av_fetch(av, i, 0);
23 1235 50         buf[i] = (int32_t)SvIV(svp ? *svp : &PL_sv_undef);
24             }
25 14           return buf;
26             }
27              
28             static AV *
29 14           int32_to_av(pTHX_ int32_t *buf, SSize_t n)
30             {
31 14           AV *av = newAV();
32             SSize_t i;
33 14           av_extend(av, n - 1);
34 1249 100         for (i = 0; i < n; i++)
35 1235           av_store(av, i, newSViv((IV)buf[i]));
36 14           return av;
37             }
38              
39             /* ---- uint32 helpers ---- */
40              
41             static uint32_t *
42 3           av_to_uint32(pTHX_ AV *av, SSize_t *n_out)
43             {
44 3           SSize_t n = av_len(av) + 1;
45             uint32_t *buf;
46             SSize_t i;
47 3           *n_out = n;
48 3 50         if (n == 0) return NULL;
49 3 50         Newx(buf, n, uint32_t);
50 17 100         for (i = 0; i < n; i++) {
51 14           SV **svp = av_fetch(av, i, 0);
52 14 50         buf[i] = (uint32_t)SvUV(svp ? *svp : &PL_sv_undef);
53             }
54 3           return buf;
55             }
56              
57             static AV *
58 3           uint32_to_av(pTHX_ uint32_t *buf, SSize_t n)
59             {
60 3           AV *av = newAV();
61             SSize_t i;
62 3           av_extend(av, n - 1);
63 17 100         for (i = 0; i < n; i++)
64 14           av_store(av, i, newSVuv((UV)buf[i]));
65 3           return av;
66             }
67              
68             /* ---- int64 helpers ---- */
69              
70             static int64_t *
71 3           av_to_int64(pTHX_ AV *av, SSize_t *n_out)
72             {
73 3           SSize_t n = av_len(av) + 1;
74             int64_t *buf;
75             SSize_t i;
76 3           *n_out = n;
77 3 50         if (n == 0) return NULL;
78 3 50         Newx(buf, n, int64_t);
79 18 100         for (i = 0; i < n; i++) {
80 15           SV **svp = av_fetch(av, i, 0);
81 15 50         buf[i] = (int64_t)SvIV(svp ? *svp : &PL_sv_undef);
82             }
83 3           return buf;
84             }
85              
86             static AV *
87 3           int64_to_av(pTHX_ int64_t *buf, SSize_t n)
88             {
89 3           AV *av = newAV();
90             SSize_t i;
91 3           av_extend(av, n - 1);
92 18 100         for (i = 0; i < n; i++)
93 15           av_store(av, i, newSViv((IV)buf[i]));
94 3           return av;
95             }
96              
97             /* ---- uint64 helpers ---- */
98              
99             static uint64_t *
100 1           av_to_uint64(pTHX_ AV *av, SSize_t *n_out)
101             {
102 1           SSize_t n = av_len(av) + 1;
103             uint64_t *buf;
104             SSize_t i;
105 1           *n_out = n;
106 1 50         if (n == 0) return NULL;
107 1 50         Newx(buf, n, uint64_t);
108 6 100         for (i = 0; i < n; i++) {
109 5           SV **svp = av_fetch(av, i, 0);
110 5 50         buf[i] = (uint64_t)SvUV(svp ? *svp : &PL_sv_undef);
111             }
112 1           return buf;
113             }
114              
115             static AV *
116 1           uint64_to_av(pTHX_ uint64_t *buf, SSize_t n)
117             {
118 1           AV *av = newAV();
119             SSize_t i;
120 1           av_extend(av, n - 1);
121 6 100         for (i = 0; i < n; i++)
122 5           av_store(av, i, newSVuv((UV)buf[i]));
123 1           return av;
124             }
125              
126             /* ---- float32 helpers ---- */
127              
128             static float *
129 1           av_to_float32(pTHX_ AV *av, SSize_t *n_out)
130             {
131 1           SSize_t n = av_len(av) + 1;
132             float *buf;
133             SSize_t i;
134 1           *n_out = n;
135 1 50         if (n == 0) return NULL;
136 1 50         Newx(buf, n, float);
137 4 100         for (i = 0; i < n; i++) {
138 3           SV **svp = av_fetch(av, i, 0);
139 3 50         buf[i] = (float)SvNV(svp ? *svp : &PL_sv_undef);
140             }
141 1           return buf;
142             }
143              
144             static AV *
145 1           float32_to_av(pTHX_ float *buf, SSize_t n)
146             {
147 1           AV *av = newAV();
148             SSize_t i;
149 1           av_extend(av, n - 1);
150 4 100         for (i = 0; i < n; i++)
151 3           av_store(av, i, newSVnv((NV)buf[i]));
152 1           return av;
153             }
154              
155             /* ---- float64 helpers ---- */
156              
157             static double *
158 3           av_to_float64(pTHX_ AV *av, SSize_t *n_out)
159             {
160 3           SSize_t n = av_len(av) + 1;
161             double *buf;
162             SSize_t i;
163 3           *n_out = n;
164 3 50         if (n == 0) return NULL;
165 3 50         Newx(buf, n, double);
166 18 100         for (i = 0; i < n; i++) {
167 15           SV **svp = av_fetch(av, i, 0);
168 15 50         buf[i] = (double)SvNV(svp ? *svp : &PL_sv_undef);
169             }
170 3           return buf;
171             }
172              
173             static AV *
174 3           float64_to_av(pTHX_ double *buf, SSize_t n)
175             {
176 3           AV *av = newAV();
177             SSize_t i;
178 3           av_extend(av, n - 1);
179 18 100         for (i = 0; i < n; i++)
180 15           av_store(av, i, newSVnv((NV)buf[i]));
181 3           return av;
182             }
183              
184             /* Common sort body used by all sort functions */
185             #define SORT_BODY(croak_name, av_ref, c_type, c_func, av_to_fn, to_av_fn) \
186             { \
187             AV *av; \
188             SSize_t n; \
189             c_type *buf; \
190             AV *result; \
191             if (!SvROK(av_ref) || SvTYPE(SvRV(av_ref)) != SVt_PVAV) \
192             croak(croak_name ": argument must be an array reference"); \
193             av = (AV *)SvRV(av_ref); \
194             buf = av_to_fn(aTHX_ av, &n); \
195             if (n > 0) { \
196             c_func(buf, (long long)n); \
197             result = to_av_fn(aTHX_ buf, n); \
198             Safefree(buf); \
199             } else { \
200             result = newAV(); \
201             } \
202             mXPUSHs(newRV_noinc((SV *)result)); \
203             XSRETURN(1); \
204             }
205              
206             MODULE = Sort::DJB PACKAGE = Sort::DJB
207              
208             PROTOTYPES: DISABLE
209              
210             const char *
211             version()
212             CODE:
213 2           RETVAL = djbsort_version();
214             OUTPUT:
215             RETVAL
216              
217             const char *
218             arch()
219             CODE:
220 2           RETVAL = djbsort_arch();
221             OUTPUT:
222             RETVAL
223              
224             const char *
225             int32_implementation()
226             CODE:
227 2           RETVAL = djbsort_int32_implementation();
228             OUTPUT:
229             RETVAL
230              
231             const char *
232             int32_compiler()
233             CODE:
234 0           RETVAL = djbsort_int32_compiler();
235             OUTPUT:
236             RETVAL
237              
238             const char *
239             int64_implementation()
240             CODE:
241 0           RETVAL = djbsort_int64_implementation();
242             OUTPUT:
243             RETVAL
244              
245             const char *
246             int64_compiler()
247             CODE:
248 0           RETVAL = djbsort_int64_compiler();
249             OUTPUT:
250             RETVAL
251              
252             void
253             sort_int32(av_ref)
254             SV *av_ref
255             PPCODE:
256 15 100         SORT_BODY("sort_int32", av_ref, int32_t, djbsort_int32, av_to_int32, int32_to_av)
    100          
    100          
    50          
257              
258             void
259             sort_int32down(av_ref)
260             SV *av_ref
261             PPCODE:
262 2 50         SORT_BODY("sort_int32down", av_ref, int32_t, djbsort_int32down, av_to_int32, int32_to_av)
    50          
    50          
    50          
263              
264             void
265             sort_uint32(av_ref)
266             SV *av_ref
267             PPCODE:
268 2 50         SORT_BODY("sort_uint32", av_ref, uint32_t, djbsort_uint32, av_to_uint32, uint32_to_av)
    50          
    50          
    50          
269              
270             void
271             sort_uint32down(av_ref)
272             SV *av_ref
273             PPCODE:
274 1 50         SORT_BODY("sort_uint32down", av_ref, uint32_t, djbsort_uint32down, av_to_uint32, uint32_to_av)
    50          
    50          
    50          
275              
276             void
277             sort_int64(av_ref)
278             SV *av_ref
279             PPCODE:
280 2 50         SORT_BODY("sort_int64", av_ref, int64_t, djbsort_int64, av_to_int64, int64_to_av)
    50          
    50          
    50          
281              
282             void
283             sort_int64down(av_ref)
284             SV *av_ref
285             PPCODE:
286 1 50         SORT_BODY("sort_int64down", av_ref, int64_t, djbsort_int64down, av_to_int64, int64_to_av)
    50          
    50          
    50          
287              
288             void
289             sort_uint64(av_ref)
290             SV *av_ref
291             PPCODE:
292 1 50         SORT_BODY("sort_uint64", av_ref, uint64_t, djbsort_uint64, av_to_uint64, uint64_to_av)
    50          
    50          
    50          
293              
294             void
295             sort_uint64down(av_ref)
296             SV *av_ref
297             PPCODE:
298 0 0         SORT_BODY("sort_uint64down", av_ref, uint64_t, djbsort_uint64down, av_to_uint64, uint64_to_av)
    0          
    0          
    0          
299              
300             void
301             sort_float32(av_ref)
302             SV *av_ref
303             PPCODE:
304 1 50         SORT_BODY("sort_float32", av_ref, float, djbsort_float32, av_to_float32, float32_to_av)
    50          
    50          
    50          
305              
306             void
307             sort_float32down(av_ref)
308             SV *av_ref
309             PPCODE:
310 0 0         SORT_BODY("sort_float32down", av_ref, float, djbsort_float32down, av_to_float32, float32_to_av)
    0          
    0          
    0          
311              
312             void
313             sort_float64(av_ref)
314             SV *av_ref
315             PPCODE:
316 2 50         SORT_BODY("sort_float64", av_ref, double, djbsort_float64, av_to_float64, float64_to_av)
    50          
    50          
    50          
317              
318             void
319             sort_float64down(av_ref)
320             SV *av_ref
321             PPCODE:
322 1 50         SORT_BODY("sort_float64down", av_ref, double, djbsort_float64down, av_to_float64, float64_to_av)
    50          
    50          
    50