diff options
Diffstat (limited to 'dict.c')
-rw-r--r-- | dict.c | 222 |
1 files changed, 67 insertions, 155 deletions
@@ -19,7 +19,6 @@ #define IN_LIBXML #include "libxml.h" -#include <limits.h> #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif @@ -94,7 +93,7 @@ typedef xmlDictEntry *xmlDictEntryPtr; struct _xmlDictEntry { struct _xmlDictEntry *next; const xmlChar *name; - unsigned int len; + int len; int valid; unsigned long okey; }; @@ -105,8 +104,8 @@ struct _xmlDictStrings { xmlDictStringsPtr next; xmlChar *free; xmlChar *end; - size_t size; - size_t nbStrings; + int size; + int nbStrings; xmlChar array[1]; }; /* @@ -116,15 +115,13 @@ struct _xmlDict { int ref_counter; struct _xmlDictEntry *dict; - size_t size; - unsigned int nbElems; + int size; + int nbElems; xmlDictStringsPtr strings; struct _xmlDict *subdict; /* used for randomization */ int seed; - /* used to impose a limit on size */ - size_t limit; }; /* @@ -143,7 +140,7 @@ static int xmlDictInitialized = 0; /* * Internal data for random function, protected by xmlDictMutex */ -static unsigned int rand_seed = 0; +unsigned int rand_seed = 0; #endif #endif @@ -151,28 +148,13 @@ static unsigned int rand_seed = 0; * xmlInitializeDict: * * Do the dictionary mutex initialization. - * this function is deprecated - * - * Returns 0 if initialization was already done, and 1 if that - * call led to the initialization - */ -int xmlInitializeDict(void) { - return(0); -} - -/** - * __xmlInitializeDict: - * - * This function is not public - * Do the dictionary mutex initialization. * this function is not thread safe, initialization should - * normally be done once at setup when called from xmlOnceInit() - * we may also land in this code if thread support is not compiled in + * preferably be done once at startup * * Returns 0 if initialization was already done, and 1 if that * call led to the initialization */ -int __xmlInitializeDict(void) { +int xmlInitializeDict(void) { if (xmlDictInitialized) return(1); @@ -198,7 +180,7 @@ int __xmlRandom(void) { int ret; if (xmlDictInitialized == 0) - __xmlInitializeDict(); + xmlInitializeDict(); xmlRMutexLock(xmlDictMutex); #ifdef HAVE_RAND_R @@ -231,18 +213,17 @@ xmlDictCleanup(void) { * xmlDictAddString: * @dict: the dictionnary * @name: the name of the userdata - * @len: the length of the name + * @len: the length of the name, if -1 it is recomputed * * Add the string to the array[s] * * Returns the pointer of the local string, or NULL in case of error. */ static const xmlChar * -xmlDictAddString(xmlDictPtr dict, const xmlChar *name, unsigned int namelen) { +xmlDictAddString(xmlDictPtr dict, const xmlChar *name, int namelen) { xmlDictStringsPtr pool; const xmlChar *ret; - size_t size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ - size_t limit = 0; + int size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ #ifdef DICT_DEBUG_PATTERNS fprintf(stderr, "-"); @@ -252,20 +233,15 @@ xmlDictAddString(xmlDictPtr dict, const xmlChar *name, unsigned int namelen) { if (pool->end - pool->free > namelen) goto found_pool; if (pool->size > size) size = pool->size; - limit += pool->size; pool = pool->next; } /* * Not found, need to allocate */ if (pool == NULL) { - if ((dict->limit > 0) && (limit > dict->limit)) { - return(NULL); - } - if (size == 0) size = 1000; else size *= 4; /* exponential growth */ - if (size < 4 * namelen) + if (size < 4 * namelen) size = 4 * namelen; /* just in case ! */ pool = (xmlDictStringsPtr) xmlMalloc(sizeof(xmlDictStrings) + size); if (pool == NULL) @@ -295,20 +271,19 @@ found_pool: * @prefix: the prefix of the userdata * @plen: the prefix length * @name: the name of the userdata - * @len: the length of the name + * @len: the length of the name, if -1 it is recomputed * * Add the QName to the array[s] * * Returns the pointer of the local string, or NULL in case of error. */ static const xmlChar * -xmlDictAddQString(xmlDictPtr dict, const xmlChar *prefix, unsigned int plen, - const xmlChar *name, unsigned int namelen) +xmlDictAddQString(xmlDictPtr dict, const xmlChar *prefix, int plen, + const xmlChar *name, int namelen) { xmlDictStringsPtr pool; const xmlChar *ret; - size_t size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ - size_t limit = 0; + int size = 0; /* + sizeof(_xmlDictStrings) == 1024 */ if (prefix == NULL) return(xmlDictAddString(dict, name, namelen)); @@ -320,17 +295,12 @@ xmlDictAddQString(xmlDictPtr dict, const xmlChar *prefix, unsigned int plen, if (pool->end - pool->free > namelen + plen + 1) goto found_pool; if (pool->size > size) size = pool->size; - limit += pool->size; pool = pool->next; } /* * Not found, need to allocate */ if (pool == NULL) { - if ((dict->limit > 0) && (limit > dict->limit)) { - return(NULL); - } - if (size == 0) size = 1000; else size *= 4; /* exponential growth */ if (size < 4 * (namelen + plen + 1)) @@ -537,7 +507,7 @@ xmlDictCreate(void) { xmlDictPtr dict; if (!xmlDictInitialized) - if (!__xmlInitializeDict()) + if (!xmlInitializeDict()) return(NULL); #ifdef DICT_DEBUG_PATTERNS @@ -547,7 +517,6 @@ xmlDictCreate(void) { dict = xmlMalloc(sizeof(xmlDict)); if (dict) { dict->ref_counter = 1; - dict->limit = 0; dict->size = MIN_DICT_SIZE; dict->nbElems = 0; @@ -605,7 +574,7 @@ xmlDictCreateSub(xmlDictPtr sub) { int xmlDictReference(xmlDictPtr dict) { if (!xmlDictInitialized) - if (!__xmlInitializeDict()) + if (!xmlInitializeDict()) return(-1); if (dict == NULL) return -1; @@ -625,9 +594,9 @@ xmlDictReference(xmlDictPtr dict) { * Returns 0 in case of success, -1 in case of failure */ static int -xmlDictGrow(xmlDictPtr dict, size_t size) { +xmlDictGrow(xmlDictPtr dict, int size) { unsigned long key, okey; - size_t oldsize, i; + int oldsize, i; xmlDictEntryPtr iter, next; struct _xmlDictEntry *olddict; #ifdef DEBUG_GROW @@ -744,7 +713,7 @@ xmlDictGrow(xmlDictPtr dict, size_t size) { #ifdef DEBUG_GROW xmlGenericError(xmlGenericErrorContext, - "xmlDictGrow : from %lu to %lu, %u elems\n", oldsize, size, nbElem); + "xmlDictGrow : from %d to %d, %d elems\n", oldsize, size, nbElem); #endif return(ret); @@ -759,7 +728,7 @@ xmlDictGrow(xmlDictPtr dict, size_t size) { */ void xmlDictFree(xmlDictPtr dict) { - size_t i; + int i; xmlDictEntryPtr iter; xmlDictEntryPtr next; int inside_dict = 0; @@ -769,7 +738,7 @@ xmlDictFree(xmlDictPtr dict) { return; if (!xmlDictInitialized) - if (!__xmlInitializeDict()) + if (!xmlInitializeDict()) return; /* decrement the counter, it may be shared by a parser and docs */ @@ -828,24 +797,17 @@ xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) { xmlDictEntryPtr entry; xmlDictEntryPtr insert; const xmlChar *ret; - unsigned int l; if ((dict == NULL) || (name == NULL)) return(NULL); if (len < 0) - l = strlen((const char *) name); - else - l = len; - - if (((dict->limit > 0) && (l >= dict->limit)) || - (l > INT_MAX / 2)) - return(NULL); + len = strlen((const char *) name); /* * Check for duplicate and insertion location. */ - okey = xmlDictComputeKey(dict, name, l); + okey = xmlDictComputeKey(dict, name, len); key = okey % dict->size; if (dict->dict[key].valid == 0) { insert = NULL; @@ -853,25 +815,25 @@ xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) { for (insert = &(dict->dict[key]); insert->next != NULL; insert = insert->next) { #ifdef __GNUC__ - if ((insert->okey == okey) && (insert->len == l)) { - if (!memcmp(insert->name, name, l)) + if ((insert->okey == okey) && (insert->len == len)) { + if (!memcmp(insert->name, name, len)) return(insert->name); } #else - if ((insert->okey == okey) && (insert->len == l) && - (!xmlStrncmp(insert->name, name, l))) + if ((insert->okey == okey) && (insert->len == len) && + (!xmlStrncmp(insert->name, name, len))) return(insert->name); #endif nbi++; } #ifdef __GNUC__ - if ((insert->okey == okey) && (insert->len == l)) { - if (!memcmp(insert->name, name, l)) + if ((insert->okey == okey) && (insert->len == len)) { + if (!memcmp(insert->name, name, len)) return(insert->name); } #else - if ((insert->okey == okey) && (insert->len == l) && - (!xmlStrncmp(insert->name, name, l))) + if ((insert->okey == okey) && (insert->len == len) && + (!xmlStrncmp(insert->name, name, len))) return(insert->name); #endif } @@ -884,7 +846,7 @@ xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) { (dict->subdict->size != MIN_DICT_SIZE)) || ((dict->size != MIN_DICT_SIZE) && (dict->subdict->size == MIN_DICT_SIZE))) - skey = xmlDictComputeKey(dict->subdict, name, l); + skey = xmlDictComputeKey(dict->subdict, name, len); else skey = okey; @@ -895,32 +857,32 @@ xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) { for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; tmp = tmp->next) { #ifdef __GNUC__ - if ((tmp->okey == skey) && (tmp->len == l)) { - if (!memcmp(tmp->name, name, l)) + if ((tmp->okey == skey) && (tmp->len == len)) { + if (!memcmp(tmp->name, name, len)) return(tmp->name); } #else - if ((tmp->okey == skey) && (tmp->len == l) && - (!xmlStrncmp(tmp->name, name, l))) + if ((tmp->okey == skey) && (tmp->len == len) && + (!xmlStrncmp(tmp->name, name, len))) return(tmp->name); #endif nbi++; } #ifdef __GNUC__ - if ((tmp->okey == skey) && (tmp->len == l)) { - if (!memcmp(tmp->name, name, l)) + if ((tmp->okey == skey) && (tmp->len == len)) { + if (!memcmp(tmp->name, name, len)) return(tmp->name); } #else - if ((tmp->okey == skey) && (tmp->len == l) && - (!xmlStrncmp(tmp->name, name, l))) + if ((tmp->okey == skey) && (tmp->len == len) && + (!xmlStrncmp(tmp->name, name, len))) return(tmp->name); #endif } key = okey % dict->size; } - ret = xmlDictAddString(dict, name, l); + ret = xmlDictAddString(dict, name, len); if (ret == NULL) return(NULL); if (insert == NULL) { @@ -931,13 +893,13 @@ xmlDictLookup(xmlDictPtr dict, const xmlChar *name, int len) { return(NULL); } entry->name = ret; - entry->len = l; + entry->len = len; entry->next = NULL; entry->valid = 1; entry->okey = okey; - if (insert != NULL) + if (insert != NULL) insert->next = entry; dict->nbElems++; @@ -966,23 +928,17 @@ const xmlChar * xmlDictExists(xmlDictPtr dict, const xmlChar *name, int len) { unsigned long key, okey, nbi = 0; xmlDictEntryPtr insert; - unsigned int l; if ((dict == NULL) || (name == NULL)) return(NULL); if (len < 0) - l = strlen((const char *) name); - else - l = len; - if (((dict->limit > 0) && (l >= dict->limit)) || - (l > INT_MAX / 2)) - return(NULL); + len = strlen((const char *) name); /* * Check for duplicate and insertion location. */ - okey = xmlDictComputeKey(dict, name, l); + okey = xmlDictComputeKey(dict, name, len); key = okey % dict->size; if (dict->dict[key].valid == 0) { insert = NULL; @@ -990,25 +946,25 @@ xmlDictExists(xmlDictPtr dict, const xmlChar *name, int len) { for (insert = &(dict->dict[key]); insert->next != NULL; insert = insert->next) { #ifdef __GNUC__ - if ((insert->okey == okey) && (insert->len == l)) { - if (!memcmp(insert->name, name, l)) + if ((insert->okey == okey) && (insert->len == len)) { + if (!memcmp(insert->name, name, len)) return(insert->name); } #else - if ((insert->okey == okey) && (insert->len == l) && - (!xmlStrncmp(insert->name, name, l))) + if ((insert->okey == okey) && (insert->len == len) && + (!xmlStrncmp(insert->name, name, len))) return(insert->name); #endif nbi++; } #ifdef __GNUC__ - if ((insert->okey == okey) && (insert->len == l)) { - if (!memcmp(insert->name, name, l)) + if ((insert->okey == okey) && (insert->len == len)) { + if (!memcmp(insert->name, name, len)) return(insert->name); } #else - if ((insert->okey == okey) && (insert->len == l) && - (!xmlStrncmp(insert->name, name, l))) + if ((insert->okey == okey) && (insert->len == len) && + (!xmlStrncmp(insert->name, name, len))) return(insert->name); #endif } @@ -1021,7 +977,7 @@ xmlDictExists(xmlDictPtr dict, const xmlChar *name, int len) { (dict->subdict->size != MIN_DICT_SIZE)) || ((dict->size != MIN_DICT_SIZE) && (dict->subdict->size == MIN_DICT_SIZE))) - skey = xmlDictComputeKey(dict->subdict, name, l); + skey = xmlDictComputeKey(dict->subdict, name, len); else skey = okey; @@ -1032,25 +988,25 @@ xmlDictExists(xmlDictPtr dict, const xmlChar *name, int len) { for (tmp = &(dict->subdict->dict[key]); tmp->next != NULL; tmp = tmp->next) { #ifdef __GNUC__ - if ((tmp->okey == skey) && (tmp->len == l)) { - if (!memcmp(tmp->name, name, l)) + if ((tmp->okey == skey) && (tmp->len == len)) { + if (!memcmp(tmp->name, name, len)) return(tmp->name); } #else - if ((tmp->okey == skey) && (tmp->len == l) && - (!xmlStrncmp(tmp->name, name, l))) + if ((tmp->okey == skey) && (tmp->len == len) && + (!xmlStrncmp(tmp->name, name, len))) return(tmp->name); #endif nbi++; } #ifdef __GNUC__ - if ((tmp->okey == skey) && (tmp->len == l)) { - if (!memcmp(tmp->name, name, l)) + if ((tmp->okey == skey) && (tmp->len == len)) { + if (!memcmp(tmp->name, name, len)) return(tmp->name); } #else - if ((tmp->okey == skey) && (tmp->len == l) && - (!xmlStrncmp(tmp->name, name, l))) + if ((tmp->okey == skey) && (tmp->len == len) && + (!xmlStrncmp(tmp->name, name, len))) return(tmp->name); #endif } @@ -1076,7 +1032,7 @@ xmlDictQLookup(xmlDictPtr dict, const xmlChar *prefix, const xmlChar *name) { xmlDictEntryPtr entry; xmlDictEntryPtr insert; const xmlChar *ret; - unsigned int len, plen, l; + int len, plen, l; if ((dict == NULL) || (name == NULL)) return(NULL); @@ -1152,7 +1108,7 @@ xmlDictQLookup(xmlDictPtr dict, const xmlChar *prefix, const xmlChar *name) { entry->valid = 1; entry->okey = okey; - if (insert != NULL) + if (insert != NULL) insert->next = entry; dict->nbElems++; @@ -1210,50 +1166,6 @@ xmlDictSize(xmlDictPtr dict) { return(dict->nbElems); } -/** - * xmlDictSetLimit: - * @dict: the dictionnary - * @limit: the limit in bytes - * - * Set a size limit for the dictionary - * Added in 2.9.0 - * - * Returns the previous limit of the dictionary or 0 - */ -size_t -xmlDictSetLimit(xmlDictPtr dict, size_t limit) { - size_t ret; - - if (dict == NULL) - return(0); - ret = dict->limit; - dict->limit = limit; - return(ret); -} - -/** - * xmlDictGetUsage: - * @dict: the dictionnary - * - * Get how much memory is used by a dictionary for strings - * Added in 2.9.0 - * - * Returns the amount of strings allocated - */ -size_t -xmlDictGetUsage(xmlDictPtr dict) { - xmlDictStringsPtr pool; - size_t limit = 0; - - if (dict == NULL) - return(0); - pool = dict->strings; - while (pool != NULL) { - limit += pool->size; - pool = pool->next; - } - return(limit); -} #define bottom_dict #include "elfgcchack.h" |