static void put_new_attvar(Word p, atom_t name, Word value ARG_LD) { Word gp, at; assert(gTop+6 <= gMax && tTop+1 <= tMax); gp = gTop; if ( p >= (Word)lBase ) { gTop += 6; at = &gp[1]; setVar(*at); gp[0] = consPtr(&gp[1], TAG_ATTVAR|STG_GLOBAL); *p = makeRefG(&gp[0]); LTrail(p); } else { gTop += 5; at = &gp[0]; setVar(*at); *p = consPtr(&gp[0], TAG_ATTVAR|STG_GLOBAL); GTrail(p); } at[1] = FUNCTOR_att3; at[2] = name; at[3] = linkVal(value); at[4] = ATOM_nil; at[0] = consPtr(&at[1], TAG_COMPOUND|STG_GLOBAL); }
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; }
static void put_new_attvar(Word p, atom_t name, Word value ARG_LD) { Word gp, at; assert(gTop+7 <= gMax && tTop+1 <= tMax); gp = link_attvar(PASS_LD1); gTop += 6; at = &gp[1]; setVar(*at); gp[0] = consPtr(&gp[1], TAG_ATTVAR|STG_GLOBAL); at[1] = FUNCTOR_att3; at[2] = name; at[3] = linkVal(value); at[4] = ATOM_nil; at[0] = consPtr(&at[1], TAG_COMPOUND|STG_GLOBAL); trail_new_attvar(gp PASS_LD); Trail(p, makeRefG(gp)); }