Crypt-Sodium-XS
view release on metacpan or search on metacpan
inc/memvault.xs view on Meta::CPAN
sodium_increment(self_pm->pm_ptr, self_pm->size);
if (protmem_release(aTHX_ self_pm, PROTMEM_FLAG_MPROTECT_RW) != 0)
croak("increment: Failed to release self protmem RW");
XSRETURN(1);
SV * index(SV * self, SV * str, STRLEN offset = 0)
PREINIT:
protmem *self_pm;
char *str_buf;
unsigned char *self_start, *self_p, *self_stop;
STRLEN str_len;
CODE:
self_pm = protmem_get(aTHX_ self, MEMVAULT_CLASS);
if (!(self_pm->flags & PROTMEM_FLAG_LOCK_UNLOCKED))
croak("index: Unlock MemVault object before using index");
if (offset > self_pm->size - 1)
XSRETURN_IV(-1);
str_buf = SvPVbyte(str, str_len);
if (str_len < 1)
XSRETURN_IV(0);
self_start = (unsigned char *)self_pm->pm_ptr;
self_p = self_start + offset;
self_stop = self_start + self_pm->size - str_len; /* + 1 - 1 */
if (self_p >= self_stop)
XSRETURN_IV(-1);
if (protmem_grant(aTHX_ self_pm, PROTMEM_FLAG_MPROTECT_RO) != 0)
croak("index: Failed to grant self protmem RO");
RETVAL = &PL_sv_undef;
/* naive implementation, good nuff for "unsafe" */
while (self_p <= self_stop) {
if (*self_p == str_buf[0]) {
if (str_len == 1) {
RETVAL=newSVuv(self_p - self_start);
break;
}
else {
if (memcmp(self_p, str_buf, str_len) == 0) {
RETVAL = newSVuv(self_p - self_start);
break;
}
}
}
++self_p;
}
if (protmem_release(aTHX_ self_pm, PROTMEM_FLAG_MPROTECT_RO) != 0)
croak("index: Failed to release self protmem RO");
OUTPUT:
RETVAL
void is_locked(SV * self)
PREINIT:
protmem *self_pm;
PPCODE:
self_pm = protmem_get(aTHX_ self, MEMVAULT_CLASS);
if (self_pm->flags & PROTMEM_FLAG_LOCK_UNLOCKED)
XSRETURN_NO;
XSRETURN_YES;
void is_zero(SV * self)
PREINIT:
protmem *self_pm;
int ret;
PPCODE:
self_pm = protmem_get(aTHX_ self, MEMVAULT_CLASS);
if (protmem_grant(aTHX_ self_pm, PROTMEM_FLAG_MPROTECT_RO) != 0)
croak("is_zero: Failed to grant self protmem RO");
ret = sodium_is_zero(self_pm->pm_ptr, self_pm->size);
if (protmem_release(aTHX_ self_pm, PROTMEM_FLAG_MPROTECT_RO) != 0)
croak("is_zero: Failed to release self protmem RO");
if (ret)
XSRETURN_YES;
XSRETURN_NO;
SV * length(SV * self)
ALIAS:
size = 1
PREINIT:
protmem *self_pm;
CODE:
PERL_UNUSED_VAR(ix);
self_pm = protmem_get(aTHX_ self, MEMVAULT_CLASS);
RETVAL = newSVuv((UV)self_pm->size);
OUTPUT:
RETVAL
void lock(SV * self)
PREINIT:
protmem *self_pm;
PPCODE:
self_pm = protmem_get(aTHX_ self, MEMVAULT_CLASS);
self_pm->flags &= ~PROTMEM_FLAG_LOCK_UNLOCKED;
XSRETURN(1);
SV * pad(SV * self, STRLEN blocksize)
( run in 2.015 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )