The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#define PERL_NO_GET_CONTEXT
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "xsutil.h"
#ifdef __cplusplus
}
#endif
 
#include "SpookyV2.h"
 
MODULE = Digest::SpookyHash PACKAGE = Digest::SpookyHash
 
PROTOTYPES: DISABLE
 
U32
spooky32(const char * key, UV seed = 0, IV length(key))
CODE:
{
    RETVAL = SpookyHash::Hash32(key, STRLEN_length_of_key, seed);
}
OUTPUT:
    RETVAL

void
spooky64(const char * key, UV seed_ = 0, IV length(key))
PREINIT:
    uint64_t hash;
    uint64_t seed;
PPCODE:
{
    seed = seed_;
    hash = SpookyHash::Hash64(key, STRLEN_length_of_key,seed);
    EXTEND(SP, 1);
    mXPUSHu( hash );
}

void
spooky128(const char * key, UV seed1 = 0, UV seed2 = 0, IV length(key))
PREINIT:
    uint64_t hash1;
    uint64_t hash2;
PPCODE:
{
    hash1 = seed1;
    hash2 = seed2;
    SpookyHash::Hash128(key, STRLEN_length_of_key, &hash1, &hash2);
    EXTEND(SP, 2);
    mXPUSHu( hash1 );
    mXPUSHu( hash2 );
}