static int dict_ordered(Word data, int count, int ex ARG_LD) { int ordered = TRUE; Word n1, n2; if ( count > 0 ) { data++; /* skip to key */ deRef2(data, n1); if ( !is_key(*n1) ) return -1; } for(; count > 1; count--, data += 2, n1=n2) { deRef2(data+2, n2); if ( !is_key(*n2) ) return -1; if ( *n1 < *n2 ) continue; if ( *n1 > *n2 ) ordered = FALSE; if ( *n1 == *n2 ) { if ( ex ) { term_t t = PL_new_term_ref(); *valTermRef(t) = linkVal(n1); PL_error(NULL, 0, NULL, ERR_DUPLICATE_KEY, t); } return -2; } } return ordered; }
Word dict_lookup_ptr(word dict, word name ARG_LD) { Functor data = valueTerm(dict); int arity = arityFunctor(data->definition); int l = 1, h = arity/2; if ( arity == 1 ) return NULL; /* empty */ assert(arity%2 == 1); for(;;) { int m = (l+h)/2; Word p; deRef2(&data->arguments[m*2], p); if ( *p == name ) return p-1; if ( l == h ) return NULL; if ( *p < name ) l=m+1; else if ( m == l ) h=m; else h=m-1; } }
static void registerWakeup(Word name, Word value ARG_LD) { Word wake; Word tail = valTermRef(LD->attvar.tail); assert(gTop+6 <= gMax && tTop+4 <= tMax); wake = gTop; gTop += 4; wake[0] = FUNCTOR_wakeup3; wake[1] = needsRef(*name) ? makeRef(name) : *name; wake[2] = needsRef(*value) ? makeRef(value) : *value; wake[3] = ATOM_nil; if ( *tail ) { Word t; /* Non-empty list */ deRef2(tail, t); TrailAssignment(t); *t = consPtr(wake, TAG_COMPOUND|STG_GLOBAL); TrailAssignment(tail); /* on local stack! */ *tail = makeRef(wake+3); DEBUG(1, Sdprintf("appended to wakeup\n")); } else /* empty list */ { Word head = valTermRef(LD->attvar.head); assert(isVar(*head)); TrailAssignment(head); /* See (*) */ *head = consPtr(wake, TAG_COMPOUND|STG_GLOBAL); TrailAssignment(tail); *tail = makeRef(wake+3); LD->alerted |= ALERT_WAKEUP; DEBUG(1, Sdprintf("new wakeup\n")); } }