Do not use "false" in C
[digest-highwayhash.git] / HighwayHash.xs
1 #define PERL_NO_GET_CONTEXT
2 #define MATH_INT64_NATIVE_IF_AVAILABLE
3 #include "EXTERN.h"
4 #include "perl.h"
5 #include "XSUB.h"
6
7 #include "perl_math_int64.h"
8 #include "ppport.h"
9
10 #include "highwayhash.c"
11
12 void process_key(pTHX_ AV *key_av, uint64_t *key) {
13 int i;
14 SV *elt;
15
16 if(av_len(key_av) + 1 != 4)
17 croak("Key for highway_hash must be a 4-element array");
18 for(i = 0 ; i < 4 ; i++) {
19 elt = *av_fetch(key_av, i, false);
20 if(SvU64OK(elt))
21 key[i] = SvU64(elt);
22 else
23 key[i] = SvUV(elt);
24 }
25 }
26
27 uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t size) {
28 dTHX;
29 uint64_t key[4];
30 process_key(aTHX_ key_av, key);
31 return HighwayHash64(bytes, size, key);
32 }
33
34 AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t size) {
35 dTHX;
36 AV* result;
37 uint64_t key[4];
38 uint64_t hash[2];
39 process_key(aTHX_ key_av, key);
40 HighwayHash128(bytes, size, key, hash);
41 result = newAV();
42 av_push(result, sv_2mortal(newSVu64(hash[0])));
43 av_push(result, sv_2mortal(newSVu64(hash[1])));
44 return result;
45 }
46
47 AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t size) {
48 dTHX;
49 AV* result;
50 uint64_t key[4];
51 uint64_t hash[4];
52 process_key(aTHX_ key_av, key);
53 HighwayHash256(bytes, size, key, hash);
54 result = newAV();
55 av_push(result, sv_2mortal(newSVu64(hash[0])));
56 av_push(result, sv_2mortal(newSVu64(hash[1])));
57 av_push(result, sv_2mortal(newSVu64(hash[2])));
58 av_push(result, sv_2mortal(newSVu64(hash[3])));
59 return result;
60 }
61
62 MODULE = Digest::HighwayHash PACKAGE = Digest::HighwayHash
63 PROTOTYPES: DISABLE
64 BOOT:
65 PERL_MATH_INT64_LOAD_OR_CROAK;
66
67 uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t length(bytes))
68
69 AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t length(bytes))
70
71 AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t length(bytes))
This page took 0.025348 seconds and 5 git commands to generate.