Algorithm-ConstructDFA-XS
view release on metacpan or search on metacpan
ConstructDFA.xs view on Meta::CPAN
SV* combines_rv = newRV_noinc((SV*)combines_av);
HV* next_over_hv = newHV();
SV* next_over_rv = newRV_noinc((SV*)next_over_hv);
auto he1 = hv_store(state_hv, "Accepts", 7, newSVuv(accepting[s->second]), 0);
auto he2 = hv_store(state_hv, "Combines", 8, combines_rv, 0);
auto he3 = hv_store(state_hv, "NextOver", 8, next_over_rv, 0);
vector<State> x = m.id_to_states(s->second);
for (auto k = x.begin(); k != x.end(); ++k) {
av_push(combines_av, newSVuv(*k));
}
dfa[s->first] = state_hv;
id_to_hvs.insert(make_pair(s->second, state_hv));
}
for (auto s = automaton.begin(); s != automaton.end(); ++s) {
StatesId srcId = s->first.first;
Label label = s->first.second;
StatesId dstId = s->second;
if (dfa.find(state_map[srcId]) == dfa.end()) {
croak("...");
}
for (auto p = id_to_hvs.find(srcId); p != id_to_hvs.end(); ++p) {
if (p->first != srcId)
break;
SV** next_over_svp = hv_fetch(p->second, "NextOver", 8, 0);
if (!next_over_svp)
croak("...");
SV* label_sv = newSVuv(label);
HE* he = hv_store_ent((HV*)SvRV(*next_over_svp),
label_sv, newSVuv(state_map[dstId]), 0);
if (he == NULL) {
warn("hv_store_ent failed");
SvREFCNT_dec(label_sv);
}
}
}
return dfa;
}
MODULE = Algorithm::ConstructDFA::XS PACKAGE = Algorithm::ConstructDFA::XS
void
_internal_construct_dfa_xs(accepts_sv, args_sv)
SV* accepts_sv
SV* args_sv
PREINIT:
AV* args;
PPCODE:
args = (AV*)SvRV(args_sv);
PUTBACK;
auto dfa = build_dfa(accepts_sv, args);
SPAGAIN;
for (auto i = dfa.begin(); i != dfa.end(); ++i) {
mXPUSHs(newSVuv(i->first));
mXPUSHs(newRV_noinc((SV*)(i->second)));
}
( run in 1.916 second using v1.01-cache-2.11-cpan-71847e10f99 )