Export cat (stream) interface too
[digest-highwayhash.git] / HighwayHash.xs
index f806845c5e54fa47c1398aac4473fbf84237f210..e04c57c0911cd359ac51da4d8264f9d3fee07a20 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "highwayhash.c"
 
+typedef HighwayHashCat* Digest__HighwayHash;
+
 void process_key(pTHX_ AV *key_av, uint64_t *key) {
        int i;
        SV *elt;
@@ -24,14 +26,14 @@ void process_key(pTHX_ AV *key_av, uint64_t *key) {
        }
 }
 
-uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t size) {
+uint64_t highway_hash64(AV *key_av, unsigned char *bytes, size_t size) {
        dTHX;
        uint64_t key[4];
        process_key(aTHX_ key_av, key);
        return HighwayHash64(bytes, size, key);
 }
 
-AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t size) {
+AV* highway_hash128(AV *key_av, unsigned char *bytes, size_t size) {
        dTHX;
        AV* result;
        uint64_t key[4];
@@ -44,7 +46,7 @@ AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t size) {
        return result;
 }
 
-AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t size) {
+AV* highway_hash256(AV *key_av, unsigned char *bytes, size_t size) {
        dTHX;
        AV* result;
        uint64_t key[4];
@@ -59,13 +61,66 @@ AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t size) {
        return result;
 }
 
+Digest__HighwayHash new(AV *key_av) {
+       dTHX;
+       uint64_t key[4];
+       Digest__HighwayHash state;
+       Newx(state, 1, HighwayHashCat);
+       process_key(aTHX_ key_av, key);
+       HighwayHashCatStart(key, state);
+       return state;
+}
+
+void append(Digest__HighwayHash state, unsigned char *bytes, size_t size) {
+       HighwayHashCatAppend(bytes, size, state);
+}
+
+uint64_t finish64(Digest__HighwayHash state) {
+       return HighwayHashCatFinish64(state);
+}
+
+AV* finish128(Digest__HighwayHash state) {
+       dTHX;
+       AV* result;
+       uint64_t hash[2];
+       HighwayHashCatFinish128(state, hash);
+       result = newAV();
+       av_push(result, sv_2mortal(newSVu64(hash[0])));
+       av_push(result, sv_2mortal(newSVu64(hash[1])));
+       return result;
+}
+
+AV* finish256(Digest__HighwayHash state) {
+       dTHX;
+       AV* result;
+       uint64_t hash[4];
+       HighwayHashCatFinish256(state, hash);
+       result = newAV();
+       av_push(result, sv_2mortal(newSVu64(hash[0])));
+       av_push(result, sv_2mortal(newSVu64(hash[1])));
+       av_push(result, sv_2mortal(newSVu64(hash[2])));
+       av_push(result, sv_2mortal(newSVu64(hash[3])));
+       return result;
+}
+
 MODULE = Digest::HighwayHash           PACKAGE = Digest::HighwayHash
 PROTOTYPES: DISABLE
 BOOT:
      PERL_MATH_INT64_LOAD_OR_CROAK;
 
-uint64_t highway_hash64(AV *key_av, unsigned char *bytes, uint64_t length(bytes))
+uint64_t highway_hash64(AV *key_av, unsigned char *bytes, size_t length(bytes))
+
+AV* highway_hash128(AV *key_av, unsigned char *bytes, size_t length(bytes))
+
+AV* highway_hash256(AV *key_av, unsigned char *bytes, size_t length(bytes))
+
+Digest::HighwayHash new(SV *class, AV *key_av)
+C_ARGS: key_av
+
+void append(Digest::HighwayHash state, unsigned char *bytes, size_t length(bytes))
+
+uint64_t finish64(Digest::HighwayHash state)
 
-AV* highway_hash128(AV *key_av, unsigned char *bytes, uint64_t length(bytes))
+AV* finish128(Digest::HighwayHash state)
 
-AV* highway_hash256(AV *key_av, unsigned char *bytes, uint64_t length(bytes))
+AV* finish256(Digest::HighwayHash state)
This page took 0.010517 seconds and 4 git commands to generate.