/** * xmlDictCreate: * * Create a new dictionary * * Returns the newly created dictionnary, or NULL if an error occured. */ xmlDictPtr xmlDictCreate(void) { xmlDictPtr dict; if (!xmlDictInitialized) if (!xmlInitializeDict()) return(NULL); #ifdef DICT_DEBUG_PATTERNS fprintf(stderr, "C"); #endif dict = xmlMalloc(sizeof(xmlDict)); if (dict) { dict->ref_counter = 1; dict->size = MIN_DICT_SIZE; dict->nbElems = 0; dict->dict = xmlMalloc(MIN_DICT_SIZE * sizeof(xmlDictEntry)); dict->strings = NULL; dict->subdict = NULL; if (dict->dict) { memset(dict->dict, 0, MIN_DICT_SIZE * sizeof(xmlDictEntry)); #ifdef DICT_RANDOMIZATION dict->seed = __xmlRandom(); #else dict->seed = 0; #endif return(dict); } xmlFree(dict); } return(NULL); }
/** * xmlDictCreate: * * Create a new dictionary * * Returns the newly created dictionnary, or NULL if an error occured. */ xmlDictPtr xmlDictCreate(void) { xmlDictPtr dict; if (!xmlDictInitialized) if (!xmlInitializeDict()) return(NULL); dict = (xmlDict*) xmlMalloc(sizeof(xmlDict)); if (dict) { dict->ref_counter = 1; dict->size = MIN_DICT_SIZE; dict->nbElems = 0; dict->dict = (xmlDictEntry*) xmlMalloc(MIN_DICT_SIZE * sizeof(xmlDictEntry)); dict->strings = NULL; dict->subdict = NULL; if (dict->dict) { if ((dict->mutex = xmlNewRMutex()) != NULL) { memset(dict->dict, 0, MIN_DICT_SIZE * sizeof(xmlDictEntry)); return(dict); } xmlFree(dict->dict); } xmlFree(dict); } return(NULL); }
/** * xmlDictFree: * @dict: the dictionnary * * Free the hash @dict and its contents. The userdata is * deallocated with @f if provided. */ void xmlDictFree(xmlDictPtr dict) { int i; xmlDictEntryPtr iter; xmlDictEntryPtr next; int inside_dict = 0; xmlDictStringsPtr pool, nextp; if (dict == NULL) return; if (!xmlDictInitialized) if (!xmlInitializeDict()) return; /* decrement the counter, it may be shared by a parser and docs */ xmlRMutexLock(xmlDictMutex); dict->ref_counter--; if (dict->ref_counter > 0) { xmlRMutexUnlock(xmlDictMutex); return; } xmlRMutexUnlock(xmlDictMutex); if (dict->subdict != NULL) { xmlDictFree(dict->subdict); } if (dict->dict) { for (i = 0; ((i < dict->size) && (dict->nbElems > 0)); i++) { iter = &(dict->dict[i]); if (iter->valid == 0) continue; inside_dict = 1; while (iter) { next = iter->next; if (!inside_dict) xmlFree(iter); dict->nbElems--; inside_dict = 0; iter = next; } inside_dict = 0; } xmlFree(dict->dict); } pool = dict->strings; while (pool != NULL) { nextp = pool->next; xmlFree(pool); pool = nextp; } xmlFreeRMutex(dict->mutex); xmlFree(dict); }
/** * xmlDictReference: * @dict: the dictionnary * * Increment the reference counter of a dictionary * * Returns 0 in case of success and -1 in case of error */ int xmlDictReference(xmlDictPtr dict) { if (!xmlDictInitialized) if (!xmlInitializeDict()) return(-1); if (dict == NULL) return -1; dict->ref_counter++; return(0); }
/** * xmlDictReference: * @dict: the dictionnary * * Increment the reference counter of a dictionary * * Returns 0 in case of success and -1 in case of error */ int xmlDictReference(xmlDictPtr dict) { if (!xmlDictInitialized) if (!xmlInitializeDict()) return(-1); if (dict == NULL) return -1; xmlRMutexLock(xmlDictMutex); dict->ref_counter++; xmlRMutexUnlock(xmlDictMutex); return(0); }
int __xmlRandom(void) { int ret; if (xmlDictInitialized == 0) xmlInitializeDict(); xmlRMutexLock(xmlDictMutex); #ifdef HAVE_RAND_R ret = rand_r(& rand_seed); #else ret = rand(); #endif xmlRMutexUnlock(xmlDictMutex); return(ret); }