Algorithm-CP-IZ

 view release on metacpan or  search on metacpan

IZ.xs  view on Meta::CPAN

  PUSHMARK(sp);

  PUTBACK;
  count = call_sv(maxFailPerlFunc, G_SCALAR);
  SPAGAIN;
  ret = -1;

  if (count <= 0) {
    croak("search: MaxFailFunc returns nothing");
  }
  {
    SV* v = POPs;
    if (!SvIOK(v)) {
      croak("search: MaxFailFunc returns bad value");
    }
    ret = (int)SvIV(v);
  }

  FREETMPS;
  LEAVE;

  return ret;
}

static IZBOOL noGoodSetFilterMethod(const char* meth,
       CSnoGoodSet* ngs, CSnoGood* ng, CSint** vars, int size, void* ext)
{
  SV* ngsObj = (SV*)ext;
  IZBOOL ret = FALSE;

  {
    int i, n;
    AV* elements;
    SV* r;
    HV* ngeh;

    dTHX;
    dSP;

    ENTER;
    SAVETMPS;
    PUSHMARK(SP);

    XPUSHs(ngsObj);

    elements = newAV();
    n = cs_getNbNoGoodElements(ng);
    ngeh = gv_stashpv("Algorithm::CP::IZ::NoGoodElement", 0);

    for (i = 0; i < n; i++) {
      AV* elem = newAV();
      int idx;
      CSvalueSelection vs;

      cs_getNoGoodElementAt(&idx, &vs, ng, i);
      av_push(elem, newSViv(idx));
      av_push(elem, newSViv(vs.method));
      av_push(elem, newSViv(vs.value));

      r = (SV*)newRV_noinc((SV*)elem);
      r = sv_bless(r, ngeh);
      av_push(elements, r);
    }

    r = newRV_noinc((SV*)elements);
    XPUSHs(sv_2mortal((SV*)r));

    PUTBACK;
    {
      int count = call_method(meth, G_ARRAY);
      SPAGAIN;
      if (count > 0) {
	ret = sv_true(POPs);
      }
    }

    FREETMPS;
    LEAVE;
  }

  return ret;
}

static IZBOOL noGoodSetPrefilterPerlWrapper(CSnoGoodSet* ngs, CSnoGood* ng, CSint** vars, int size, void* ext)
{
  return noGoodSetFilterMethod("_prefilter", ngs, ng, vars, size, ext);
}

static IZBOOL noGoodSetFilterPerlWrapper(CSnoGoodSet* ngs, CSnoGood* ng, CSint** vars, int size, void* ext)
{
  return noGoodSetFilterMethod("_filter", ngs, ng, vars, size, ext);
}

static void noGoodSetDestoryPerlWrapper(CSnoGoodSet* ngs, void* ext)
{
  SV* ngsObj = (SV*)ext;

  {
    dTHX;
    SvREFCNT_dec(ngsObj);
  }
}

static void searchNotify_searchStart(int maxFails, CSint** allvars, int nbVars, void* ext) {
  dTHX;
  dSP;

  ENTER;
  SAVETMPS;
  PUSHMARK(SP);

  XPUSHs(sv_2mortal((SV*)newRV(ext)));
  XPUSHs(sv_2mortal((SV*)newSViv(maxFails)));

  PUTBACK;
  call_method("search_start", G_DISCARD);

  FREETMPS;
  LEAVE;
}



( run in 0.683 second using v1.01-cache-2.11-cpan-e1769b4cff6 )