summaryrefslogtreecommitdiff
path: root/dict.c
diff options
context:
space:
mode:
Diffstat (limited to 'dict.c')
-rw-r--r--dict.c222
1 files changed, 67 insertions, 155 deletions
diff --git a/dict.c b/dict.c
index 5f71d55..6de2f03 100644
--- a/dict.c
+++ b/dict.c
@@ -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"