conflag_ref conflag_dict_get(conflag_dict *dict, conflag_string *key) { for (long j = key->hash, p = key->hash; ; HASH_NEXT(j, p)) { conflag_dict_entry *entry = dict->table + (j & dict->mask); if (entry->ref.type == CONFLAG_DICT_EMPTY) { //printf("Key error: %s\n", key->string); return (conflag_ref) {CONFLAG_ERROR, {.error = CONFLAG_KEY_ERROR}}; } else if (key->length == entry->key->length &&
no hget(register no pred, register no fun) { register no last,i=HKEY(pred,fun); if(HFOUND()) return htable[i].val; HLIMIT(last); do { HASH_NEXT(); if(HFOUND()) return htable[i].val; } while(HNOTFULL() && HUSED()); return (no)NULL; }
no hdef(register no pred, register no fun, register no val, byte stamp) { register no i=HKEY(pred,fun),last; HLIMIT(last); while(HNOTFULL() && HUSED() && !(HFOUND())) HASH_NEXT(); if(!HUSED() || (HDELETED() && HFOUND()) ) { HPUT(i,pred,fun,val,stamp); return 1; } return 0; }
bp_long hindex(register no pred, register no fun, bp_long *index) { register no last,i=HKEY(pred,fun); if(HFOUND()) {*index=i; return FOUND;} if(!HUSED()) {*index=i; return FREE;} HLIMIT(last); do { HASH_NEXT(); if(HFOUND()) {*index=i; return FOUND;} } while(HNOTFULL() && HUSED()); if(!HNOTFULL()) {hfull("culprit->hindex"); return FULL;} else {*index=i; return FREE;} }
void conlfag_dict_insert( conflag_dict *dict, conflag_string *key, conflag_ref value) { for (long j = key->hash, p = key->hash; ; HASH_NEXT(j, p)) { conflag_dict_entry *entry = dict->table + (j & dict->mask); //TODO: Can just use null key instead of CONFLAG_DICT_EMPTY!!! if (entry->ref.type == CONFLAG_DICT_EMPTY) { *entry = (conflag_dict_entry) {key, value}; dict->used++; break; } else if (key->length == entry->key->length && !strncmp(key->string, entry->key->string, key->length)) { entry->ref = value; break; } } }
no hset(register no pred, register no fun, register no val) { register no i=HKEY(pred,fun),last; HLIMIT(last); while(HNOTFULL() && HUSED() && !(HFOUND())) HASH_NEXT(); if(HFOUND()) { htable[i].val=val; return 1; } warnmes("hdef/3 required before using hset/3"); #if 0 fprintf(STD_err,"%s/%ld+...->%s/%ld\n", NAME(pred),GETARITY(pred), NAME(val),GETARITY(val) ); #endif return 0; }
int pkg_repos(struct pkg_repo **r) { HASH_NEXT(repos, (*r)); }