VirtualBox

source: vbox/trunk/src/libs/libxml2-2.9.14/optim/hash_dict.patch@ 95629

最後變更 在這個檔案從95629是 95312,由 vboxsync 提交於 3 年 前

libs/{curl,libxml2}: OSE export fixes, bugref:8515

  • 屬性 svn:eol-style 設為 native
檔案大小: 7.6 KB
  • hash.c

    RCS file: /cvs/gnome/gnome-xml/hash.c,v
    retrieving revision 1.30
    diff -u -r1.30 hash.c
     
    2626#include <libxml/xmlmemory.h>
    2727#include <libxml/xmlerror.h>
    2828#include <libxml/globals.h>
     29#include <libxml/dict.h>
    2930
    3031#define MAX_HASH_LEN 8
    3132
     
    3839typedef xmlHashEntry *xmlHashEntryPtr;
    3940struct _xmlHashEntry {
    4041    struct _xmlHashEntry *next;
    41     xmlChar *name;
    42     xmlChar *name2;
    43     xmlChar *name3;
     42    const xmlChar *name;
     43    const xmlChar *name2;
     44    const xmlChar *name3;
    4445    void *payload;
    4546    int valid;
    4647};
     
    5253    struct _xmlHashEntry *table;
    5354    int size;
    5455    int nbElems;
     56    xmlDictPtr dict;
    5557};
    5658
    5759/*
     
    143145xmlHashTablePtr
    144146xmlHashCreate(int size) {
    145147    xmlHashTablePtr table;
     148    xmlDictPtr dict;
    146149 
    147150    if (size <= 0)
    148151        size = 256;
    149152 
     153    dict = xmlDictCreate();
     154    if (dict == NULL) return(NULL);
    150155    table = xmlMalloc(sizeof(xmlHashTable));
    151156    if (table) {
     157        table->dict = dict;
    152158        table->size = size;
    153159        table->nbElems = 0;
    154160        table->table = xmlMalloc(size * sizeof(xmlHashEntry));
     
    158164        }
    159165        xmlFree(table);
    160166    }
     167    xmlDictFree(dict);
    161168    return(NULL);
    162169}
    163170
     
    282289                next = iter->next;
    283290                if ((f != NULL) && (iter->payload != NULL))
    284291                    f(iter->payload, iter->name);
    285                 if (iter->name)
    286                     xmlFree(iter->name);
    287                 if (iter->name2)
    288                     xmlFree(iter->name2);
    289                 if (iter->name3)
    290                     xmlFree(iter->name3);
    291292                iter->payload = NULL;
    292293                if (!inside_table)
    293294                    xmlFree(iter);
     
    299300        }
    300301        xmlFree(table->table);
    301302    }
     303    xmlDictFree(table->dict);
    302304    xmlFree(table);
    303305}
    304306
     
    465467
    466468    if ((table == NULL) || name == NULL)
    467469        return(-1);
     470    if (name) name = xmlDictLookup(table->dict, name, -1);
     471    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
     472    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    468473
    469474    /*
    470475     * Check for duplicate and insertion location.
     
    475480    } else {
    476481        for (insert = &(table->table[key]); insert->next != NULL;
    477482             insert = insert->next) {
    478             if ((xmlStrEqual(insert->name, name)) &&
    479                 (xmlStrEqual(insert->name2, name2)) &&
    480                 (xmlStrEqual(insert->name3, name3)))
     483            if ((insert->name == name) &&
     484                (insert->name2 == name2) &&
     485                (insert->name3 == name3))
    481486                return(-1);
    482487            len++;
    483488        }
    484         if ((xmlStrEqual(insert->name, name)) &&
    485             (xmlStrEqual(insert->name2, name2)) &&
    486             (xmlStrEqual(insert->name3, name3)))
     489        if ((insert->name == name) &&
     490            (insert->name2 == name2) &&
     491            (insert->name3 == name3))
    487492            return(-1);
    488493    }
    489494
     
    495500             return(-1);
    496501    }
    497502
    498     entry->name = xmlStrdup(name);
    499     entry->name2 = xmlStrdup(name2);
    500     entry->name3 = xmlStrdup(name3);
     503    entry->name = name;
     504    entry->name2 = name2;
     505    entry->name3 = name3;
    501506    entry->payload = userdata;
    502507    entry->next = NULL;
    503508    entry->valid = 1;
     
    539544
    540545    if ((table == NULL) || name == NULL)
    541546        return(-1);
     547    if (name) name = xmlDictLookup(table->dict, name, -1);
     548    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
     549    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    542550
    543551    /*
    544552     * Check for duplicate and insertion location.
     
    549557    } else {
    550558        for (insert = &(table->table[key]); insert->next != NULL;
    551559             insert = insert->next) {
    552             if ((xmlStrEqual(insert->name, name)) &&
    553                 (xmlStrEqual(insert->name2, name2)) &&
    554                 (xmlStrEqual(insert->name3, name3))) {
     560            if ((insert->name == name) &&
     561                (insert->name2 == name2) &&
     562                (insert->name3 == name3)) {
    555563                if (f)
    556564                    f(insert->payload, insert->name);
    557565                insert->payload = userdata;
    558566                return(0);
    559567            }
    560568        }
    561         if ((xmlStrEqual(insert->name, name)) &&
    562             (xmlStrEqual(insert->name2, name2)) &&
    563             (xmlStrEqual(insert->name3, name3))) {
     569        if ((insert->name == name) &&
     570            (insert->name2 == name2) &&
     571            (insert->name3 == name3)) {
    564572            if (f)
    565573                f(insert->payload, insert->name);
    566574            insert->payload = userdata;
     
    576584             return(-1);
    577585    }
    578586
    579     entry->name = xmlStrdup(name);
    580     entry->name2 = xmlStrdup(name2);
    581     entry->name3 = xmlStrdup(name3);
     587    entry->name = name;
     588    entry->name2 = name2;
     589    entry->name3 = name3;
    582590    entry->payload = userdata;
    583591    entry->next = NULL;
    584592    entry->valid = 1;
     
    615623    key = xmlHashComputeKey(table, name, name2, name3);
    616624    if (table->table[key].valid == 0)
    617625        return(NULL);
     626    if (name) name = xmlDictLookup(table->dict, name, -1);
     627    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
     628    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    618629    for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
    619         if ((xmlStrEqual(entry->name, name)) &&
    620             (xmlStrEqual(entry->name2, name2)) &&
    621             (xmlStrEqual(entry->name3, name3)))
     630        if ((entry->name == name) &&
     631            (entry->name2 == name2) &&
     632            (entry->name3 == name3))
    622633            return(entry->payload);
    623634    }
    624635    return(NULL);
     
    774785    if (f == NULL)
    775786        return;
    776787
     788    if (name) name = xmlDictLookup(table->dict, name, -1);
     789    if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
     790    if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    777791    if (table->table) {
    778792        for(i = 0; i < table->size; i++) {
    779793            if (table->table[i].valid == 0)
     
    781795            iter = &(table->table[i]);
    782796            while (iter) {
    783797                next = iter->next;
    784                 if (((name == NULL) || (xmlStrEqual(name, iter->name))) &&
    785                     ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) &&
    786                     ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) &&
     798                if (((name == NULL) || (name == iter->name)) &&
     799                    ((name2 == NULL) || (name2 == iter->name2)) &&
     800                    ((name3 == NULL) || (name3 == iter->name3)) &&
    787801                    (iter->payload != NULL)) {
    788802                    f(iter->payload, data, iter->name,
    789803                      iter->name2, iter->name3);
     
    913927    if (table->table[key].valid == 0) {
    914928        return(-1);
    915929    } else {
     930        if (name) name = xmlDictLookup(table->dict, name, -1);
     931        if (name2) name2 = xmlDictLookup(table->dict, name2, -1);
     932        if (name3) name3 = xmlDictLookup(table->dict, name3, -1);
    916933        for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
    917             if (xmlStrEqual(entry->name, name) &&
    918                     xmlStrEqual(entry->name2, name2) &&
    919                     xmlStrEqual(entry->name3, name3)) {
     934            if ((entry->name == name) &&
     935                (entry->name2 == name2) &&
     936                (entry->name3 == name3)) {
    920937                if ((f != NULL) && (entry->payload != NULL))
    921938                    f(entry->payload, entry->name);
    922939                entry->payload = NULL;
    923                 if(entry->name)
    924                     xmlFree(entry->name);
    925                 if(entry->name2)
    926                     xmlFree(entry->name2);
    927                 if(entry->name3)
    928                     xmlFree(entry->name3);
    929940                if(prev) {
    930941                    prev->next = entry->next;
    931942                    xmlFree(entry);
  • include/libxml/hash.h

    RCS file: /cvs/gnome/gnome-xml/include/libxml/hash.h,v
    retrieving revision 1.15
    diff -u -r1.15 hash.h
     
    4242 *
    4343 * Callback to free data from a hash.
    4444 */
    45 typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
     45typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name);
    4646/**
    4747 * xmlHashCopier:
    4848 * @payload:  the data in the hash
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette