Fix tests on 32-bit Perls
[digest-highwayhash.git] / HighwayHash.xs
CommitLineData
096619f2
MG
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/*
13
14uint64_t HighwayHash64(const uint8_t* data, size_t size, const uint64_t key[4]);
15
16void HighwayHash128(const uint8_t* data, size_t size,
17 const uint64_t key[4], uint64_t hash[2]);
18
19void HighwayHash256(const uint8_t* data, size_t size,
20const uint64_t key[4], uint64_t hash[4]);
21 */
22
23void process_key(pTHX_ AV *key_av, uint64_t *key) {
24 int i;
25 SV *elt;
26
27 if(av_len(key_av) + 1 != 4)
28 croak("Key for highway_hash must be a 4-element array");
29 for(i = 0 ; i < 4 ; i++) {
30 elt = *av_fetch(key_av, i, false);
31 if(SvU64OK(elt))
32 key[i] = SvU64(elt);
33 else
34 key[i] = SvUV(elt);
35 }
36}
37
38uint64_t highway_hash64(AV *key_av, char *bytes, uint64_t size) {
39 dTHX;
40 uint64_t key[4];
41 process_key(aTHX_ key_av, key);
42 return HighwayHash64(bytes, size, key);
43}
44
45AV* highway_hash128(AV *key_av, char *bytes, uint64_t size) {
46 dTHX;
47 AV* result;
48 uint64_t key[4];
49 uint64_t hash[2];
50 process_key(aTHX_ key_av, key);
51 HighwayHash128(bytes, size, key, hash);
52 result = newAV();
53 av_push(result, sv_2mortal(newSVu64(hash[0])));
54 av_push(result, sv_2mortal(newSVu64(hash[1])));
55 return result;
56}
57
58AV* highway_hash256(AV *key_av, char *bytes, uint64_t size) {
59 dTHX;
60 AV* result;
61 uint64_t key[4];
62 uint64_t hash[2];
63 process_key(aTHX_ key_av, key);
64 HighwayHash256(bytes, size, key, hash);
65 result = newAV();
66 av_push(result, sv_2mortal(newSVu64(hash[0])));
67 av_push(result, sv_2mortal(newSVu64(hash[1])));
68 av_push(result, sv_2mortal(newSVu64(hash[2])));
69 av_push(result, sv_2mortal(newSVu64(hash[3])));
70 return result;
71}
72
73MODULE = Digest::HighwayHash PACKAGE = Digest::HighwayHash
74BOOT:
75 PERL_MATH_INT64_LOAD_OR_CROAK;
76
77uint64_t highway_hash64(AV *key_av, char *bytes, uint64_t length(bytes))
78
79AV* highway_hash128(AV *key_av, char *bytes, uint64_t length(bytes))
80
81AV* highway_hash256(AV *key_av, char *bytes, uint64_t length(bytes))
This page took 0.01239 seconds and 4 git commands to generate.