#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
#define PERL_DECIMAL_VERSION \
PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
#define PERL_VERSION_GE(r,v,s) \
(PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))
#if PERL_VERSION_GE(5,25,9)
#define foldit(p,e,s,l) toFOLD_utf8_safe(p,e,s,l)
#else
// toFOLD_utf8 only became a valid synonym during 5.15, but to_utf8_fold
// works from 5.8 through 5.24.
#define foldit(p,e,s,l) to_utf8_fold(p,s,l)
#endif
MODULE = Unicode::CaseFold PACKAGE = Unicode::CaseFold
PROTOTYPES: DISABLE
SV *
case_fold(str)
SV *str
CODE:
STRLEN input_len, folded_len;
U8 *in = SvPVutf8(str, input_len),
*ptr,
folded[UTF8_MAXBYTES + 1];
RETVAL = newSV(input_len); /* We may need more, but we won't need less. */
SvPOK_only(RETVAL);
SvUTF8_on(RETVAL);
for ( ptr = in ; ptr < in + input_len ; ptr += UTF8SKIP(ptr) ) {
foldit(ptr, in + input_len, folded, &folded_len);
sv_catpvn(RETVAL, folded, folded_len);
}
OUTPUT:
RETVAL