void naHash_set(naRef hash, naRef key, naRef val) { HashRec* hr = REC(hash); if(!hr || hr->next >= POW2(hr->lgsz)) hr = resize(PTR(hash).hash); hashset(hr, key, val); }
void naHash_keys(naRef dst, naRef hash) { int i; HashRec* hr = REC(hash); for(i=0; hr && i < NCELLS(hr); i++) if(TAB(hr)[i] >= 0) naVec_append(dst, ENTS(hr)[TAB(hr)[i]].key); }
int naiHash_tryset(naRef hash, naRef key, naRef val) { HashRec* hr = REC(hash); if(hr) { int ent, cell = findcell(hr, key, refhash(key)); if((ent = TAB(hr)[cell]) >= 0) { ENTS(hr)[ent].val = val; return 1; } } return 0; }
char* SMTP_PASS(){ const char encrypted[32] = ENCRYPT(ICC_PASSWORD); unsigned r = SEED; for (int i = 0; i < 32; i++){ r = REC(r); int xorbase = r&0xFFUL; decrypted[i] = encrypted[i] ^ xorbase; } return decrypted; }
void naiGCMarkHash(naRef hash) { int i; HashRec* hr = REC(hash); for(i=0; hr && i < NCELLS(hr); i++) if(TAB(hr)[i] >= 0) { naiGCMark(ENTS(hr)[TAB(hr)[i]].key); naiGCMark(ENTS(hr)[TAB(hr)[i]].val); } }
int naHash_get(naRef hash, naRef key, naRef* out) { HashRec* hr = REC(hash); if(hr) { int ent, cell = findcell(hr, key, refhash(key)); if((ent = TAB(hr)[cell]) < 0) return 0; *out = ENTS(hr)[ent].val; return 1; } return 0; }
void naHash_delete(naRef hash, naRef key) { HashRec* hr = REC(hash); if(hr) { int cell = findcell(hr, key, refhash(key)); if(TAB(hr)[cell] >= 0) { TAB(hr)[cell] = ENT_DELETED; if(--hr->size < POW2(hr->lgsz-1)) resize(PTR(hash).hash); } } }
int naHash_size(naRef h) { return REC(h) ? REC(h)->size : 0; }