#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#define SI_NOT 0x01
#define SI_REV 0x02
MODULE = String::Index PACKAGE = String::Index
int
cindex(SV *str, SV *cc, ...)
PROTOTYPE: $$;$
ALIAS:
ncindex = 1
crindex = 2
ncrindex = 3
CODE:
{
STRLEN s_len;
STRLEN c_len;
char *s = SvPV(str,s_len);
char *c = SvPV(cc,c_len);
int seen_null = 0;
int p = (items == 3 ? (int)SvIV(ST(2)) : 0);
int i;
/* see if there is an INTERNAL null in the char str */
for (i = 0; i < c_len; ) {
if (c[i] == '\0' && (seen_null = 1)) c[i] = c[--c_len];
else ++i;
}
c[c_len] = '\0';
if (ix & SI_REV) {
s += (p ? p : s_len - 1);
for (i = p ? p : (s_len - 1); i >= 0; --i, --s)
if ((*s ? strchr(c, *s) > 0 : seen_null) != (ix & SI_NOT)) break;
}
else {
s += p;
for (i = p; i < s_len; ++i, ++s)
if ((*s ? strchr(c, *s) > 0 : seen_null) != (ix & SI_NOT)) break;
}
RETVAL = (i == ((ix & SI_REV) ? -1 : s_len) ? -1 : i);
}
OUTPUT:
RETVAL