word pl_dwim_match(term_t a1, term_t a2, term_t mm) { char *s1, *s2; atom_t type; if ( PL_get_chars(a1, &s1, CVT_ALL|BUF_RING) && PL_get_chars(a2, &s2, CVT_ALL|BUF_RING) && (type = dwimMatch(s1, s2)) && PL_unify_atom(mm, type) ) succeed; fail; }
word pl_dwim_predicate(term_t pred, term_t dwim, control_t h) { GET_LD functor_t fdef; Module module = (Module) NULL; Procedure proc; Symbol symb; term_t head = PL_new_term_ref(); TableEnum e; if ( ForeignControl(h) == FRG_CUTTED ) { e = ForeignContextPtr(h); freeTableEnum(e); succeed; } if ( !PL_strip_module(pred, &module, head) ) fail; if ( !PL_get_functor(head, &fdef) ) fail; /* silent: leave errors for later */ if ( ForeignControl(h) == FRG_FIRST_CALL ) e = newTableEnum(module->procedures); else e = ForeignContextPtr(h); while( (symb = advanceTableEnum(e)) ) { Definition def; char *name; proc = symb->value; def = proc->definition; name = stringAtom(def->functor->name); if ( dwimMatch(stringAtom(nameFunctor(fdef)), name) && isDefinedProcedure(proc) && (name[0] != '$' || SYSTEM_MODE) ) { if ( !PL_unify_functor(dwim, def->functor->functor) ) continue; ForeignRedoPtr(e); } } freeTableEnum(e); fail; }