6#include "udi_private.h"
18 utarray_push_back(indexing_structures, &cb);
26p_new_udi( USES_REGS1 )
28 Term spec = Deref(ARG1);
35 if (IsVarTerm(spec)) {
36 Yap_Error(INSTANTIATION_ERROR,spec,
"new user index/1");
38 }
else if (!IsApplTerm(spec)) {
39 Yap_Error(TYPE_ERROR_COMPOUND,spec,
"new user index/1");
42 Functor fun = FunctorOfTerm(spec);
43 Term tmod = CurrentModule;
45 while (fun == FunctorModule) {
46 tmod = ArgOfTerm(1,spec);
47 if (IsVarTerm(tmod) ) {
48 Yap_Error(INSTANTIATION_ERROR, spec,
"new user index/1");
51 if (!IsAtomTerm(tmod) ) {
52 Yap_Error(TYPE_ERROR_ATOM, spec,
"new user index/1");
55 spec = ArgOfTerm(2, spec);
56 fun = FunctorOfTerm(spec);
58 p = RepPredProp(PredPropByFunc(fun, tmod));
64 & (DynamicPredFlag|LogUpdatePredFlag|UserCPredFlag|CArgsPredFlag|NumberDBPredFlag|AtomDBPredFlag|TestPredFlag|AsmPredFlag|CPredFlag|BinaryPredFlag))
65 || (p->ModuleOfPred == PROLOG_MODULE)) {
66 Yap_Error(PERMISSION_ERROR_MODIFY_STATIC_PROCEDURE, spec,
"udi/2");
69 if (p->PredFlags & (DynamicPredFlag|LogUpdatePredFlag|TabledPredFlag)) {
70 Yap_Error(PERMISSION_ERROR_ACCESS_PRIVATE_PROCEDURE, spec,
"udi/2");
77 memset((
void *) blk,0,
sizeof(
struct udi_info));
79 Yap_Error(RESOURCE_ERROR_HEAP, spec,
"new user index/1");
84 utarray_new(blk->args, &arg_icd);
85 utarray_new(blk->clauselist, &cl_icd);
89 info = p_udi_args_init(spec, p->ArityOfPE, blk);
92 utarray_free(blk->args);
93 utarray_free(blk->clauselist);
94 Yap_FreeCodeSpace((
char *) blk);
99 HASH_ADD_UdiInfo(UdiControlBlocks, p, blk);
101 p->PredFlags |= UDIPredFlag;
110p_udi_args_init(Term spec,
int arity,
UdiInfo blk)
118 for (i = 1; i <= arity; i++) {
119 arg = ArgOfTerm(i,spec);
120 if (IsAtomTerm(arg)) {
121 idxtype = AtomOfTerm(arg);
122 if (idxtype == AtomMinus)
124 p_arg.control = NULL;
126 while ((cb = (
UdiControlBlock *) utarray_next(indexing_structures, cb))) {
127 if (idxtype == (*cb)->decl){
130 p_arg.idxstr = (*cb)->init(spec, i, arity);
131 utarray_push_back(blk->args, &p_arg);
134 if (p_arg.control == NULL){
135 fprintf(stderr,
"Invalid Spec (%s)\n", AtomName(idxtype));
155 UdiControlBlocks = NULL;
158 utarray_new(indexing_structures, &udicb_icd);
160 Yap_InitCPred(
"$udi_init", 1, p_new_udi, 0);
178 HASH_FIND_UdiInfo(UdiControlBlocks,p,info);
183 utarray_push_back(info->clauselist, &cl);
185 for (i = 0; i < utarray_len(info->args) ; i++) {
186 parg = (
UdiPArg) utarray_eltptr(info->args,i);
187 index = (YAP_Int) utarray_len(info->clauselist);
188 parg->idxstr = parg->control->insert(parg->idxstr, t,
213 HASH_FIND_UdiInfo(UdiControlBlocks,p,info);
214 if (!info || utarray_len(info->args) == 0)
217 if (utarray_len(info->args) == 1){
220 c.cl = Yap_ClauseListInit(&clauselist);
221 c.clauselist = info->clauselist;
226 parg = (
UdiPArg) utarray_eltptr(info->args,0);
227 r = parg->control->search(parg->idxstr, parg->arg, si_callback, (
void *) &c);
228 Yap_ClauseListClose(c.cl);
231 Yap_ClauseListDestroy(c.cl);
235 if (Yap_ClauseListCount(c.cl) == 0) {
236 Yap_ClauseListDestroy(c.cl);
237 return Yap_FAILCODE();
241 Yap_udi_join( &clauselist, parg, info );
245 if (Yap_ClauseListCount(&clauselist) == 1)
246 return Yap_ClauseListToClause(&clauselist);
247 return Yap_ClauseListCode(&clauselist);