Algorithm-CP-IZ
view release on metacpan or search on metacpan
ENTER;
SAVETMPS;
PUSHMARK(sp);
PUTBACK;
call_sv(foundPerlFunc, G_VOID);
SPAGAIN;
FREETMPS;
LEAVE;
}
/*
* Helper functinos for cs_backtrack
*/
typedef void backtrackCallback(CSint *vint, int index);
static SV* backtrackPerlFunc;
static void backtrackPerlWrapper(CSint *vint, int index)
{
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(sp);
/* index is pointing to context in perl code */
XPUSHs(sv_2mortal(newSViv(index)));
PUTBACK;
call_sv(backtrackPerlFunc, G_VOID);
SPAGAIN;
FREETMPS;
LEAVE;
}
/*
* Helper functinos for demon funcrions
*/
static IZBOOL eventAllKnownPerlWrapper(CSint **tint, int size, void *ext)
{
int count, ret;
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(sp);
PUTBACK;
count = call_sv((SV*)ext, G_SCALAR);
SPAGAIN;
ret = -1;
if (count == 0) {
croak("eventAllKnownPerlWrapper: error");
}
ret = sv_true(POPs);
FREETMPS;
LEAVE;
return (IZBOOL)ret;
}
static IZBOOL eventKnownPerlWrapper(int val, int index, CSint **tint, int size, void *ext)
{
int count, ret;
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(sp);
XPUSHs(sv_2mortal(newSViv(val)));
XPUSHs(sv_2mortal(newSViv(index)));
PUTBACK;
count = call_sv((SV*)ext, G_SCALAR);
SPAGAIN;
ret = -1;
if (count == 0) {
croak("eventKnownPerlWrapper: error");
}
ret = sv_true(POPs);
FREETMPS;
LEAVE;
return (IZBOOL)ret;
}
static IZBOOL eventNewMinMaxNeqPerlWrapper(CSint* vint, int index, int oldValue, CSint **tint, int size, void *ext)
{
int count, ret;
dTHX;
dSP;
ENTER;
SAVETMPS;
PUSHMARK(sp);
XPUSHs(sv_2mortal(newSViv(index)));
XPUSHs(sv_2mortal(newSViv(oldValue)));
PUTBACK;
count = call_sv((SV*)ext, G_SCALAR);
SPAGAIN;
ret = -1;
if (count == 0) {
croak("eventNewMinMaxNeqPerlWrapper: error");
}
ret = sv_true(POPs);
FREETMPS;
LEAVE;
return (IZBOOL)ret;
}
#if (IZ_VERSION_MAJOR == 3 && IZ_VERSION_MINOR >= 6)
/* Helper functions for Algorithm::CP::IZ::ValueSelector::Simple */
/*
* Callback functions don't take class parameter therefore useer defined
* value selectors distincted by its index (when search function is called).
*/
typedef struct {
SV* init;
SV* next;
SV* end;
} vsSimple;
static vsSimple* vsSimpleArray = NULL;
static size_t vsSimpleArraySize = 0;
static int vsSimpleObjRef = 0;
static CSvalueSelector* vsSimpleObj = NULL;
static IZBOOL prepareSimpleVS(int index) {
if (!vsSimpleArray) {
size_t size = (size_t)index * 2;
size_t i;
if (size < 1000)
size = 1000;
Newx(vsSimpleArray, size, vsSimple);
if (!vsSimpleArray)
return FALSE;
vsSimpleArraySize = size;
for (i = 0; i < size; i++) {
vsSimpleArray[i].init = NULL;
vsSimpleArray[i].next = NULL;
vsSimpleArray[i].end = NULL;
}
}
else if (index >= vsSimpleArraySize) {
size_t newSize = index + 1000;
size_t i;
vsSimple* newArray;
Newx(newArray, newSize, vsSimple);
if (!newArray)
return FALSE;
( run in 1.053 second using v1.01-cache-2.11-cpan-2398b32b56e )