/* term must have been dereferenced */ Integer intern_term_size(CTXTdeclc Cell term) { Integer size = 0 ; recur: switch(cell_tag(term)) { case XSB_FREE: case XSB_REF1: case XSB_INT: case XSB_STRING: case XSB_FLOAT: return size ; case XSB_LIST: { if (isinternstr(term)) {return size;} else { CPtr pfirstel ; pfirstel = clref_val(term) ; term = *pfirstel ; XSB_Deref(term) ; size += 2 + intern_term_size(CTXTc term) ; term = *(pfirstel+1) ; XSB_Deref(term) ; goto recur; } } case XSB_STRUCT: { if (isinternstr(term)) return size; else { int a ; CPtr pfirstel ; pfirstel = (CPtr)cs_val(term) ; a = get_arity((Psc)(*pfirstel)) ; size += a + 1 ; if (a) { while( --a ) { term = *++pfirstel ; XSB_Deref(term) ; size += intern_term_size( CTXTc term ) ; } } term = *++pfirstel ; XSB_Deref(term) ; goto recur; } } case XSB_ATTV: return size; } return FALSE; }
/* must be called with interned term (isinternstr(term)is true) */ int is_interned_rec(Cell term) { int areaindex, reclen; struct intterm_rec *recptr; CPtr term_rec; UInteger hashindex; if (islist(term)) {areaindex = LIST_INDEX; reclen = 2; } else {areaindex = get_arity(get_str_psc(term)); reclen = areaindex + 1; } if (!hc_block[areaindex].base) return FALSE; term_rec = (CPtr)cs_val(term); hashindex = it_hash(hc_block[areaindex].hashtab_size,reclen,term_rec); recptr = hc_block[areaindex].hashtab[hashindex]; while (recptr) { if (term_rec == &(recptr->intterm_psc)) {return TRUE;} recptr = recptr->next; } return FALSE; }
xsbBool answer_is_junk(CPtr dlist) /* assumes that dlist != NULL */ { CPtr cptr; VariantSF subgoal; NODEptr ans_subst; Cell tmp_cell; while (islist(dlist)) { dlist = clref_val(dlist); cptr = (CPtr) cs_val(cell(dlist)); tmp_cell = cell(cptr + 1); subgoal = (VariantSF) addr_val(tmp_cell); tmp_cell = cell(cptr + 2); ans_subst = (NODEptr) addr_val(tmp_cell); if (is_failing_delay_element(subgoal,ans_subst)) { return TRUE; } dlist = (CPtr) cell(dlist+1); } return FALSE; }
static DE intern_delay_element(Cell delay_elem) { DE de; CPtr cptr = (CPtr) cs_val(delay_elem); /* * All the following information about delay_elem is set in * delay_negatively() or delay_positively(). Note that cell(cptr) is * the delay_psc ('DL'). */ VariantSF subgoal; NODEptr ans_subst; CPtr ret_n = 0; int arity; Cell tmp_cell; tmp_cell = cell(cptr + 1); subgoal = (VariantSF) addr_val(tmp_cell); tmp_cell = cell(cptr + 2); ans_subst = (NODEptr) addr_val(tmp_cell); tmp_cell = cell(cptr + 3); /* * cell(cptr + 3) can be one of the following: * 1. integer 0 (NEG_DELAY), for a negative DE; * 2. string "ret", for a positive DE with arity 0; * 3. constr ret/n, for a positive DE with arity >=1. */ if (isinteger(tmp_cell) || isstring(tmp_cell)) arity = 0; else { ret_n = (CPtr) cs_val(tmp_cell); arity = get_arity((Psc) get_str_psc(cell(cptr + 3))); } #ifdef DEBUG_DELAYVAR xsb_dbgmsg((LOG_DEBUG,">>>> ")); dbg_print_delay_list(LOG_DEBUG,stddbg, delayreg); xsb_dbgmsg((LOG_DEBUG, "\n")); xsb_dbgmsg((LOG_DEBUG, ">>>> (Intern ONE de) arity of answer subsf = %d\n", arity)); #endif if (!was_simplifiable(subgoal, ans_subst)) { new_entry(de, released_des, next_free_de, current_de_block, current_de_block_top, de_next, DE, de_block_size, "Not enough memory to expand DE space"); de_subgoal(de) = subgoal; de_ans_subst(de) = ans_subst; /* Leaf of the answer (substitution) trie */ #ifdef DEBUG_DELAYVAR de_subs_fact(de) = NULL; #ifndef IGNORE_DELAYVAR if (arity != 0) { de_subs_fact_leaf(de) = delay_chk_insert(arity, ret_n + 1, (CPtr *) &de_subs_fact(de)); } #endif /* IGNORE_DELAYVAR */ #else #ifndef IGNORE_DELAYVAR if (arity != 0) { CPtr hook = NULL; de_subs_fact_leaf(de) = delay_chk_insert(arity, ret_n + 1, &hook); } #endif /* IGNORE_DELAYVAR */ #endif return de; } else return NULL; }