The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "_haval.c"

typedef struct haval {
    haval_state state;
}* Digest__Haval256;

MODULE = Digest::Haval256		PACKAGE = Digest::Haval256
PROTOTYPES: DISABLE

Digest::Haval256
new(...)
    CODE:
    {
        Newz(0, RETVAL, 1, struct haval);
        haval_start(&RETVAL->state);
    }

    OUTPUT:
        RETVAL

int
hashsize(...)
    CODE:
        RETVAL = 256;
    OUTPUT:
        RETVAL

int
rounds(...)
    CODE:
        RETVAL = 5;
    OUTPUT:
        RETVAL

void
reset(self)
    Digest::Haval256 self
    CODE:
        haval_start(&self->state);
        
void
add(self, ...)
    Digest::Haval256 self
    CODE:
    {
        STRLEN len;
        unsigned char* data;
        unsigned int i;

        for (i = 1; i < items; i++) {
            data = (unsigned char*)(SvPV(ST(i), len));
            haval_hash(&self->state, data, len);
        }
    }

SV*
digest(self)
    Digest::Haval256 self
    CODE:
    {
        RETVAL = newSVpv("", 32);
        haval_end(&self->state, SvPV_nolen(RETVAL));
    }

    OUTPUT:
        RETVAL

void
DESTROY(self)
    Digest::Haval256 self
    CODE:
        Safefree(self);