void TY_(FreeTags)( TidyDocImpl* doc ) { TidyTagImpl* tags = &doc->tags; #if ELEMENT_HASH_LOOKUP emptyHash( doc, tags ); #endif TY_(FreeDeclaredTags)( doc, tagtype_null ); FreeDict( doc, tags->xml_tags ); /* get rid of dangling tag references */ TidyClearMemory( tags, sizeof(TidyTagImpl) ); }
/* By default, zap all of them. But allow ** an single type to be specified. */ void TY_(FreeDeclaredTags)( TidyDocImpl* doc, UserTagType tagType ) { TidyTagImpl* tags = &doc->tags; Dict *curr, *next = NULL, *prev = NULL; for ( curr=tags->declared_tag_list; curr; curr = next ) { Bool deleteIt = yes; next = curr->next; switch ( tagType ) { case tagtype_empty: deleteIt = ( curr->model & CM_EMPTY ) != 0; break; case tagtype_inline: deleteIt = ( curr->model & CM_INLINE ) != 0; break; case tagtype_block: deleteIt = ( (curr->model & CM_BLOCK) != 0 && curr->parser == TY_(ParseBlock) ); break; case tagtype_pre: deleteIt = ( (curr->model & CM_BLOCK) != 0 && curr->parser == TY_(ParsePre) ); break; case tagtype_null: break; } if ( deleteIt ) { #if ELEMENT_HASH_LOOKUP removeFromHash( doc, &doc->tags, curr->name ); #endif FreeDict( doc, curr ); if ( prev ) prev->next = next; else tags->declared_tag_list = next; } else prev = curr; } }
void DeleteObject(Object* obj) { if(obj->type == OBJ_STRING) free(obj->string.raw); if(obj->type == OBJ_NATIVE) { if(obj->native.onFree) obj->native.onFree(obj->native.value); } if(obj->type == OBJ_ARRAY) { free(obj->array.members); obj->array.capacity = 0; obj->array.length = 0; } if(obj->type == OBJ_DICT) FreeDict(&obj->dict); }
void DictResize(Dict* dict, int newCapacity) { Dict newDict; InternalInitDict(&newDict, dict->capacity * 2); for(int i = 0; i < dict->capacity; ++i) { DictNode* node = dict->buckets[i]; while(node) { DictPut(&newDict, node->key, node->value); node = node->next; } } Dict swap = *dict; *dict = newDict; newDict = swap; FreeDict(&newDict); }