The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#define NEED_sv_2pv_flags
#include "ppport.h"

#include "lcss.h"

MODULE = String::LCSS_XS		PACKAGE = String::LCSS_XS		

void
_compute_all_lcss(s, t, min = 1)
    SV* s
    SV* t
    int min
PROTOTYPE: $$;$
ALIAS:
    lcss     = 1
    lcss_all = 2
PREINIT:
    int list_cx;
    int wide;
    SV* rv;
PPCODE:
    if (!SvOK(s) || !SvOK(t))
        XSRETURN_UNDEF;

    list_cx = GIMME_V == G_ARRAY;

    SvPV_nolen(s);  /* Process magic and stringify */
    SvPV_nolen(t);

    wide = SvUTF8(s) || SvUTF8(t);
    if (wide) {
        sv_utf8_upgrade_nomg(s);
        sv_utf8_upgrade_nomg(t);
    }

    rv = lcss(
        wide,
        SvPVX(s), SvCUR(s),
        SvPVX(t), SvCUR(t),
        min,
        list_cx,
        list_cx && ix == 2
    );

    if (rv == &PL_sv_undef) {
        XSRETURN_UNDEF;
    }
    else if (SvTYPE(rv) != SVt_PVAV) {
        XPUSHs(sv_2mortal(rv));
        XSRETURN(1);
    }
    else {
        I32 num_items = av_len((AV*)rv) + 1;
        I32 i;
        EXTEND(sp, num_items);
        for (i=num_items; i--; )
            ST(i) = sv_2mortal(av_pop((AV*)rv));
        sv_2mortal(rv);
        XSRETURN(num_items);
    }