/*
 * $Id: SipHash.xs,v 0.7 2020/12/11 18:06:57 dankogai Exp dankogai $
 */
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "csiphash.c"

uint64_t siphash24_sv(SV *src, SV *seed) {
    STRLEN src_len;
    char * src_pv= SvPV(src,src_len);
    STRLEN seed_len;
    char *seed_pv= SvPV(seed,seed_len);
    assert(seed_len>=16);
    return siphash24(src_pv, src_len, seed_pv);
}

static SV *
siphash_as_av(SV *src, SV *seed) {
    uint64_t hash = siphash24_sv(src,seed);

    AV *av = newAV();
    av_extend(av, 1);
    av_store(av, 0, newSVuv(hash & 0xffffffff));
    av_store(av, 1, newSVuv(hash >> 32));
    return newRV_noinc((SV *)av);
}

MODULE = Digest::SipHash  PACKAGE = Digest::SipHash

UV
_xs_siphash64(src, seed)
SV *src;
SV *seed;
CODE:
    RETVAL = (UV)siphash24_sv(src, seed);
OUTPUT:
    RETVAL

SV *
_xs_siphash_av(src, seed)
SV *src;
SV *seed;
CODE:
    RETVAL = siphash_as_av(src, seed);
OUTPUT:
    RETVAL