void initReservedSymbols(void) { PL_register_blob_type(&reserved_symbol); atomValue(ATOM_dict)->type = &reserved_symbol; atomValue(ATOM_trienode)->type = &reserved_symbol; if ( !GD->options.traditional ) { const atom_t *ap; for(ap=reserved_symbols; *ap; ap++) { Atom a = atomValue(*ap); a->type = &reserved_symbol; } } }
int PL_unregister_blob_type(PL_blob_t *type) { size_t index; int i, last=FALSE; PL_blob_t **t; int discarded = 0; PL_LOCK(L_MISC); for(t = &GD->atoms.types; *t; t = &(*t)->next) { if ( *t == type ) { *t = type->next; type->next = NULL; } } PL_UNLOCK(L_MISC); PL_register_blob_type(&unregistered_blob_atom); LOCK(); for(index=1, i=0; !last; i++) { size_t upto = (size_t)2<<i; Atom *b = GD->atoms.array.blocks[i]; if ( upto >= GD->atoms.highest ) { upto = GD->atoms.highest; last = TRUE; } for(; index<upto; index++) { Atom atom = b[index]; if ( atom && atom->type == type ) { atom->type = &unregistered_blob_atom; atom->name = "<discarded blob>"; atom->length = strlen(atom->name); discarded++; } } } UNLOCK(); return discarded == 0 ? TRUE : FALSE; }
void initDBRef(void) { PL_register_blob_type(&record_blob); PL_register_blob_type(&clause_blob); }