#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core
PROTOTYPES: ENABLE
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::intp
int
invoke(arg)
SV * arg
CODE:
RETVAL = SvIOKp(arg); /* Not necessarily the best way? */
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::floatp
int
invoke(arg)
SV * arg
CODE:
RETVAL = SvNOKp(arg);
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::stringp
int
invoke(arg)
SV * arg
CODE:
RETVAL = SvPOKp(arg);
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::replace_string
SV *
invoke(big, find, replace)
char * big
char * find
char * replace
CODE:
{
/* This is horribly slow but will do for now. */
char *op;
char *cp;
int flen;
int rlen;
flen = strlen(find);
rlen = strlen(replace);
RETVAL = sv_2mortal(newSVpvn("", 0));
op = big;
cp = strstr(big, find);
while (cp) {
sv_catpvn(RETVAL, op, (cp - op));
sv_catpvn(RETVAL, replace, rlen);
op = cp + flen;
cp = strstr(op, find);
}
sv_catpv(RETVAL, op);
}
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::explode
SV *
invoke(str, sep)
char * str
char * sep
CODE:
{
/* Also really inefficient but will do for now. */
AV *av;
SV *sv;
char *cp;
char *ep;
int slen;
int i;
av = newAV();
slen = strlen(sep);
if (!slen) {
slen = strlen(str);
for (i = 0; i < slen; i++) {
sv = newSVpvn(str + i, 1);
av_push(av, sv);
}
}
else {
cp = str;
while (*cp) {
ep = strstr(cp, sep);
if (ep) {
sv = newSVpvn(cp, (ep - cp));
av_push(av, sv);
cp = ep + slen;
}
else {
sv = newSVpv(cp, 0);
av_push(av, sv);
break;
}
}
}
RETVAL = sv_2mortal(newRV_noinc((SV *)av));
}
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::substr
SV *
invoke(input, start, end, sep, eep)
SV * input;
int start
int end
int sep
int eep
CODE:
{
char *str;
STRLEN length;
str = SvPV(input, length);
if (sep)
start = length - start + 1;
if (eep)
end = length - end + 1;
if (start < 0)
start = 0;
if (end < 0)
end = 0;
if (start > length)
start = length;
if (end > length)
end = length;
RETVAL = newSVpvn(str + start, (end - start));
}
OUTPUT:
RETVAL
MODULE = Anarres::Mud::Driver::Efun::Core PACKAGE = Anarres::Mud::Driver::Efun::Core::subchar
SV *
invoke(input, idx, ep)
SV * input;
int idx
int ep
CODE:
{
char *str;
STRLEN length;
str = SvPV(input, length);
if (ep)
idx = length - idx + 1;
if (idx < 0)
idx = 0;
if (idx > length)
idx = length;
RETVAL = newSViv((IV)str[idx]);
}
OUTPUT:
RETVAL