#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "_rabbit.c" typedef struct rabbit { t_instance state; }* Crypt__Rabbit; MODULE = Crypt::Rabbit PACKAGE = Crypt::Rabbit PROTOTYPES: DISABLE Crypt::Rabbit new(class, rawkey) SV* rawkey CODE: { STRLEN keyLength; if (! SvPOK(rawkey)) croak("Key setup error: Key must be a string scalar!"); keyLength = SvCUR(rawkey); if (keyLength != 16) croak("Key setup error: Key must be 16 bytes long!"); Newz(0, RETVAL, 1, struct rabbit); key_setup(&RETVAL->state, SvPV_nolen(rawkey)); } OUTPUT: RETVAL SV* rabbit_enc(self, input) Crypt::Rabbit self SV* input CODE: { STRLEN bufsize; unsigned char* intext = SvPV(input, bufsize); RETVAL = newSVpv("", bufsize); cipher(&self->state, intext, SvPV_nolen(RETVAL), bufsize); } OUTPUT: RETVAL void DESTROY(self) Crypt::Rabbit self CODE: Safefree(self);