package Data::QRCode::XS; use strict; use warnings; # ABSTRACT: qrcodes in C # VERSION use Alien::QREncode; use Data::QRCode::XS::Inline C => ( ); 1; __DATA__ __C__ #include "qrencode.h" int ECLEVEL_L() { return QR_ECLEVEL_L; } int ECLEVEL_M() { return QR_ECLEVEL_M; } int ECLEVEL_Q() { return QR_ECLEVEL_Q; } int ECLEVEL_H() { return QR_ECLEVEL_H; } SV* _build(const char* class, SV* data, int level, int version ) { unsigned char * str; STRLEN len; SV * qrsv; SV* self; QRcode* qr_code; str = SvPVutf8(data,len); qr_code = QRcode_encodeData(len,str,version,(QRecLevel)level); qrsv = newSViv((IV)qr_code); self = newRV_noinc(qrsv); sv_bless(self, gv_stashpv(class, GV_ADD)); SvREADONLY_on(qrsv); return self; } int version(SV* self) { return ((QRcode*)SvIV(SvRV(self)))->version; } int width(SV* self) { return ((QRcode*)SvIV(SvRV(self)))->width; } void DESTROY(SV* self) { QRcode* qr_code = (QRcode*)SvIV(SvRV(self)); QRcode_free(qr_code); } int _data_at(SV* self, int x, int y) { QRcode* qr_code = (QRcode*)SvIV(SvRV(self)); return qr_code->data[x+y*qr_code->width]; }