Home | History | Annotate | Download | only in optim
      1 Index: hash.c
      2 ===================================================================
      3 RCS file: /cvs/gnome/gnome-xml/hash.c,v
      4 retrieving revision 1.30
      5 diff -u -r1.30 hash.c
      6 --- hash.c	29 Oct 2003 11:18:37 -0000	1.30
      7 +++ hash.c	24 Feb 2004 17:18:42 -0000
      8 @@ -26,6 +26,7 @@
      9  #include <libxml/xmlmemory.h>
     10  #include <libxml/xmlerror.h>
     11  #include <libxml/globals.h>
     12 +#include <libxml/dict.h>
     13  
     14  #define MAX_HASH_LEN 8
     15  
     16 @@ -38,9 +39,9 @@
     17  typedef xmlHashEntry *xmlHashEntryPtr;
     18  struct _xmlHashEntry {
     19      struct _xmlHashEntry *next;
     20 -    xmlChar *name;
     21 -    xmlChar *name2;
     22 -    xmlChar *name3;
     23 +    const xmlChar *name;
     24 +    const xmlChar *name2;
     25 +    const xmlChar *name3;
     26      void *payload;
     27      int valid;
     28  };
     29 @@ -52,6 +53,7 @@
     30      struct _xmlHashEntry *table;
     31      int size;
     32      int nbElems;
     33 +    xmlDictPtr dict;
     34  };
     35  
     36  /*
     37 @@ -143,12 +145,16 @@
     38  xmlHashTablePtr
     39  xmlHashCreate(int size) {
     40      xmlHashTablePtr table;
     41 +    xmlDictPtr dict;
     42    
     43      if (size <= 0)
     44          size = 256;
     45    
     46 +    dict = xmlDictCreate();
     47 +    if (dict == NULL) return(NULL);
     48      table = xmlMalloc(sizeof(xmlHashTable));
     49      if (table) {
     50 +        table->dict = dict;
     51          table->size = size;
     52  	table->nbElems = 0;
     53          table->table = xmlMalloc(size * sizeof(xmlHashEntry));
     54 @@ -158,6 +164,7 @@
     55          }
     56          xmlFree(table);
     57      }
     58 +    xmlDictFree(dict);
     59      return(NULL);
     60  }
     61  
     62 @@ -282,12 +289,6 @@
     63  		next = iter->next;
     64  		if ((f != NULL) && (iter->payload != NULL))
     65  		    f(iter->payload, iter->name);
     66 -		if (iter->name)
     67 -		    xmlFree(iter->name);
     68 -		if (iter->name2)
     69 -		    xmlFree(iter->name2);
     70 -		if (iter->name3)
     71 -		    xmlFree(iter->name3);
     72  		iter->payload = NULL;
     73  		if (!inside_table)
     74  		    xmlFree(iter);
     75 @@ -299,6 +300,7 @@
     76  	}
     77  	xmlFree(table->table);
     78      }
     79 +    xmlDictFree(table->dict);
     80      xmlFree(table);
     81  }
     82  
     83 @@ -465,6 +467,9 @@
     84  
     85      if ((table == NULL) || name == NULL)
     86  	return(-1);
     87 +    if (name) name = xmlDictLookup(table->dict, name, -1);
     88 +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
     89 +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
     90  
     91      /*
     92       * Check for duplicate and insertion location.
     93 @@ -475,15 +480,15 @@
     94      } else {
     95  	for (insert = &(table->table[key]); insert->next != NULL;
     96  	     insert = insert->next) {
     97 -	    if ((xmlStrEqual(insert->name, name)) &&
     98 -		(xmlStrEqual(insert->name2, name2)) &&
     99 -		(xmlStrEqual(insert->name3, name3)))
    100 +	    if ((insert->name == name) &&
    101 +		(insert->name2 == name2) &&
    102 +		(insert->name3 == name3))
    103  		return(-1);
    104  	    len++;
    105  	}
    106 -	if ((xmlStrEqual(insert->name, name)) &&
    107 -	    (xmlStrEqual(insert->name2, name2)) &&
    108 -	    (xmlStrEqual(insert->name3, name3)))
    109 +	if ((insert->name == name) &&
    110 +	    (insert->name2 == name2) &&
    111 +	    (insert->name3 == name3))
    112  	    return(-1);
    113      }
    114  
    115 @@ -495,9 +500,9 @@
    116  	     return(-1);
    117      }
    118  
    119 -    entry->name = xmlStrdup(name);
    120 -    entry->name2 = xmlStrdup(name2);
    121 -    entry->name3 = xmlStrdup(name3);
    122 +    entry->name = name;
    123 +    entry->name2 = name2;
    124 +    entry->name3 = name3;
    125      entry->payload = userdata;
    126      entry->next = NULL;
    127      entry->valid = 1;
    128 @@ -539,6 +544,9 @@
    129  
    130      if ((table == NULL) || name == NULL)
    131  	return(-1);
    132 +    if (name) name = xmlDictLookup(table->dict, name, -1);
    133 +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    134 +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    135  
    136      /*
    137       * Check for duplicate and insertion location.
    138 @@ -549,18 +557,18 @@
    139      } else {
    140  	for (insert = &(table->table[key]); insert->next != NULL;
    141  	     insert = insert->next) {
    142 -	    if ((xmlStrEqual(insert->name, name)) &&
    143 -		(xmlStrEqual(insert->name2, name2)) &&
    144 -		(xmlStrEqual(insert->name3, name3))) {
    145 +	    if ((insert->name == name) &&
    146 +		(insert->name2 == name2) &&
    147 +		(insert->name3 == name3)) {
    148  		if (f)
    149  		    f(insert->payload, insert->name);
    150  		insert->payload = userdata;
    151  		return(0);
    152  	    }
    153  	}
    154 -	if ((xmlStrEqual(insert->name, name)) &&
    155 -	    (xmlStrEqual(insert->name2, name2)) &&
    156 -	    (xmlStrEqual(insert->name3, name3))) {
    157 +	if ((insert->name == name) &&
    158 +	    (insert->name2 == name2) &&
    159 +	    (insert->name3 == name3)) {
    160  	    if (f)
    161  		f(insert->payload, insert->name);
    162  	    insert->payload = userdata;
    163 @@ -576,9 +584,9 @@
    164  	     return(-1);
    165      }
    166  
    167 -    entry->name = xmlStrdup(name);
    168 -    entry->name2 = xmlStrdup(name2);
    169 -    entry->name3 = xmlStrdup(name3);
    170 +    entry->name = name;
    171 +    entry->name2 = name2;
    172 +    entry->name3 = name3;
    173      entry->payload = userdata;
    174      entry->next = NULL;
    175      entry->valid = 1;
    176 @@ -615,10 +623,13 @@
    177      key = xmlHashComputeKey(table, name, name2, name3);
    178      if (table->table[key].valid == 0)
    179  	return(NULL);
    180 +    if (name) name = xmlDictLookup(table->dict, name, -1);
    181 +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    182 +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    183      for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
    184 -	if ((xmlStrEqual(entry->name, name)) &&
    185 -	    (xmlStrEqual(entry->name2, name2)) &&
    186 -	    (xmlStrEqual(entry->name3, name3)))
    187 +	if ((entry->name == name) &&
    188 +	    (entry->name2 == name2) &&
    189 +	    (entry->name3 == name3))
    190  	    return(entry->payload);
    191      }
    192      return(NULL);
    193 @@ -774,6 +785,9 @@
    194      if (f == NULL)
    195  	return;
    196  
    197 +    if (name) name = xmlDictLookup(table->dict, name, -1);
    198 +    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    199 +    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    200      if (table->table) {
    201  	for(i = 0; i < table->size; i++) {
    202  	    if (table->table[i].valid == 0)
    203 @@ -781,9 +795,9 @@
    204  	    iter = &(table->table[i]);
    205  	    while (iter) {
    206  		next = iter->next;
    207 -		if (((name == NULL) || (xmlStrEqual(name, iter->name))) &&
    208 -		    ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) &&
    209 -		    ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) &&
    210 +		if (((name == NULL) || (name == iter->name)) &&
    211 +		    ((name2 == NULL) || (name2 == iter->name2)) &&
    212 +		    ((name3 == NULL) || (name3 == iter->name3)) &&
    213  		    (iter->payload != NULL)) {
    214  		    f(iter->payload, data, iter->name,
    215  		      iter->name2, iter->name3);
    216 @@ -913,19 +927,16 @@
    217      if (table->table[key].valid == 0) {
    218          return(-1);
    219      } else {
    220 +	if (name) name = xmlDictLookup(table->dict, name, -1);
    221 +	if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
    222 +	if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    223          for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
    224 -            if (xmlStrEqual(entry->name, name) &&
    225 -                    xmlStrEqual(entry->name2, name2) &&
    226 -                    xmlStrEqual(entry->name3, name3)) {
    227 +            if ((entry->name == name) &&
    228 +		(entry->name2 == name2) &&
    229 +		(entry->name3 == name3)) {
    230                  if ((f != NULL) && (entry->payload != NULL))
    231                      f(entry->payload, entry->name);
    232                  entry->payload = NULL;
    233 -                if(entry->name)
    234 -                    xmlFree(entry->name);
    235 -                if(entry->name2)
    236 -                    xmlFree(entry->name2);
    237 -                if(entry->name3)
    238 -                    xmlFree(entry->name3);
    239                  if(prev) {
    240                      prev->next = entry->next;
    241  		    xmlFree(entry);
    242 Index: include/libxml/hash.h
    243 ===================================================================
    244 RCS file: /cvs/gnome/gnome-xml/include/libxml/hash.h,v
    245 retrieving revision 1.15
    246 diff -u -r1.15 hash.h
    247 --- include/libxml/hash.h	20 Nov 2003 11:59:07 -0000	1.15
    248 +++ include/libxml/hash.h	24 Feb 2004 17:18:42 -0000
    249 @@ -42,7 +42,7 @@
    250   *
    251   * Callback to free data from a hash.
    252   */
    253 -typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
    254 +typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name);
    255  /**
    256   * xmlHashCopier:
    257   * @payload:  the data in the hash
    258