2011-08-25 19:08:55 +08:00
|
|
|
/*
|
|
|
|
* Summary: Chained hash tables
|
|
|
|
* Description: This module implements the hash table support used in
|
2012-04-19 14:35:52 +08:00
|
|
|
* various places in the library.
|
2011-08-25 19:08:55 +08:00
|
|
|
*
|
|
|
|
* Copy: See Copyright for the status of this software.
|
|
|
|
*
|
|
|
|
* Author: Bjorn Reese <bjorn.reese@systematic.dk>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __XML_HASH_H__
|
|
|
|
#define __XML_HASH_H__
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The hash table.
|
|
|
|
*/
|
|
|
|
typedef struct _xmlHashTable xmlHashTable;
|
|
|
|
typedef xmlHashTable *xmlHashTablePtr;
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <libxml/xmlversion.h>
|
|
|
|
#include <libxml/parser.h>
|
|
|
|
#include <libxml/dict.h>
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Recent version of gcc produce a warning when a function pointer is assigned
|
|
|
|
* to an object pointer, or vice versa. The following macro is a dirty hack
|
|
|
|
* to allow suppression of the warning. If your architecture has function
|
|
|
|
* pointers which are a different size than a void pointer, there may be some
|
|
|
|
* serious trouble within the library.
|
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* XML_CAST_FPTR:
|
|
|
|
* @fptr: pointer to a function
|
|
|
|
*
|
|
|
|
* Macro to do a casting from an object pointer to a
|
|
|
|
* function pointer without encountering a warning from
|
|
|
|
* gcc
|
|
|
|
*
|
|
|
|
* #define XML_CAST_FPTR(fptr) (*(void **)(&fptr))
|
|
|
|
* This macro violated ISO C aliasing rules (gcc4 on s390 broke)
|
|
|
|
* so it is disabled now
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define XML_CAST_FPTR(fptr) fptr
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* function types:
|
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* xmlHashDeallocator:
|
|
|
|
* @payload: the data in the hash
|
|
|
|
* @name: the name associated
|
|
|
|
*
|
|
|
|
* Callback to free data from a hash.
|
|
|
|
*/
|
|
|
|
typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name);
|
|
|
|
/**
|
|
|
|
* xmlHashCopier:
|
|
|
|
* @payload: the data in the hash
|
|
|
|
* @name: the name associated
|
|
|
|
*
|
|
|
|
* Callback to copy data from a hash.
|
|
|
|
*
|
|
|
|
* Returns a copy of the data or NULL in case of error.
|
|
|
|
*/
|
|
|
|
typedef void *(*xmlHashCopier)(void *payload, xmlChar *name);
|
|
|
|
/**
|
|
|
|
* xmlHashScanner:
|
|
|
|
* @payload: the data in the hash
|
|
|
|
* @data: extra scannner data
|
|
|
|
* @name: the name associated
|
|
|
|
*
|
|
|
|
* Callback when scanning data in a hash with the simple scanner.
|
|
|
|
*/
|
|
|
|
typedef void (*xmlHashScanner)(void *payload, void *data, xmlChar *name);
|
|
|
|
/**
|
|
|
|
* xmlHashScannerFull:
|
|
|
|
* @payload: the data in the hash
|
|
|
|
* @data: extra scannner data
|
|
|
|
* @name: the name associated
|
|
|
|
* @name2: the second name associated
|
|
|
|
* @name3: the third name associated
|
|
|
|
*
|
|
|
|
* Callback when scanning data in a hash with the full scanner.
|
|
|
|
*/
|
|
|
|
typedef void (*xmlHashScannerFull)(void *payload, void *data,
|
2012-04-19 14:35:52 +08:00
|
|
|
const xmlChar *name, const xmlChar *name2,
|
|
|
|
const xmlChar *name3);
|
2011-08-25 19:08:55 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Constructor and destructor.
|
|
|
|
*/
|
|
|
|
XMLPUBFUN xmlHashTablePtr XMLCALL
|
2012-04-19 14:35:52 +08:00
|
|
|
xmlHashCreate (int size);
|
2011-08-25 19:08:55 +08:00
|
|
|
XMLPUBFUN xmlHashTablePtr XMLCALL
|
2012-04-19 14:35:52 +08:00
|
|
|
xmlHashCreateDict(int size,
|
|
|
|
xmlDictPtr dict);
|
|
|
|
XMLPUBFUN void XMLCALL
|
|
|
|
xmlHashFree (xmlHashTablePtr table,
|
|
|
|
xmlHashDeallocator f);
|
2011-08-25 19:08:55 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Add a new entry to the hash table.
|
|
|
|
*/
|
2012-04-19 14:35:52 +08:00
|
|
|
XMLPUBFUN int XMLCALL
|
|
|
|
xmlHashAddEntry (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
void *userdata);
|
|
|
|
XMLPUBFUN int XMLCALL
|
|
|
|
xmlHashUpdateEntry(xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
void *userdata,
|
|
|
|
xmlHashDeallocator f);
|
|
|
|
XMLPUBFUN int XMLCALL
|
|
|
|
xmlHashAddEntry2(xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2,
|
|
|
|
void *userdata);
|
|
|
|
XMLPUBFUN int XMLCALL
|
|
|
|
xmlHashUpdateEntry2(xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2,
|
|
|
|
void *userdata,
|
|
|
|
xmlHashDeallocator f);
|
|
|
|
XMLPUBFUN int XMLCALL
|
|
|
|
xmlHashAddEntry3(xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2,
|
|
|
|
const xmlChar *name3,
|
|
|
|
void *userdata);
|
|
|
|
XMLPUBFUN int XMLCALL
|
|
|
|
xmlHashUpdateEntry3(xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2,
|
|
|
|
const xmlChar *name3,
|
|
|
|
void *userdata,
|
|
|
|
xmlHashDeallocator f);
|
2011-08-25 19:08:55 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Remove an entry from the hash table.
|
|
|
|
*/
|
|
|
|
XMLPUBFUN int XMLCALL
|
2012-04-19 14:35:52 +08:00
|
|
|
xmlHashRemoveEntry(xmlHashTablePtr table, const xmlChar *name,
|
2011-08-25 19:08:55 +08:00
|
|
|
xmlHashDeallocator f);
|
|
|
|
XMLPUBFUN int XMLCALL
|
2012-04-19 14:35:52 +08:00
|
|
|
xmlHashRemoveEntry2(xmlHashTablePtr table, const xmlChar *name,
|
2011-08-25 19:08:55 +08:00
|
|
|
const xmlChar *name2, xmlHashDeallocator f);
|
|
|
|
XMLPUBFUN int XMLCALL
|
2012-04-19 14:35:52 +08:00
|
|
|
xmlHashRemoveEntry3(xmlHashTablePtr table, const xmlChar *name,
|
2011-08-25 19:08:55 +08:00
|
|
|
const xmlChar *name2, const xmlChar *name3,
|
|
|
|
xmlHashDeallocator f);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Retrieve the userdata.
|
|
|
|
*/
|
2012-04-19 14:35:52 +08:00
|
|
|
XMLPUBFUN void * XMLCALL
|
|
|
|
xmlHashLookup (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name);
|
|
|
|
XMLPUBFUN void * XMLCALL
|
|
|
|
xmlHashLookup2 (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2);
|
|
|
|
XMLPUBFUN void * XMLCALL
|
|
|
|
xmlHashLookup3 (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2,
|
|
|
|
const xmlChar *name3);
|
|
|
|
XMLPUBFUN void * XMLCALL
|
|
|
|
xmlHashQLookup (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *prefix);
|
|
|
|
XMLPUBFUN void * XMLCALL
|
|
|
|
xmlHashQLookup2 (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *prefix,
|
|
|
|
const xmlChar *name2,
|
|
|
|
const xmlChar *prefix2);
|
|
|
|
XMLPUBFUN void * XMLCALL
|
|
|
|
xmlHashQLookup3 (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *prefix,
|
|
|
|
const xmlChar *name2,
|
|
|
|
const xmlChar *prefix2,
|
|
|
|
const xmlChar *name3,
|
|
|
|
const xmlChar *prefix3);
|
2011-08-25 19:08:55 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Helpers.
|
|
|
|
*/
|
2012-04-19 14:35:52 +08:00
|
|
|
XMLPUBFUN xmlHashTablePtr XMLCALL
|
|
|
|
xmlHashCopy (xmlHashTablePtr table,
|
|
|
|
xmlHashCopier f);
|
|
|
|
XMLPUBFUN int XMLCALL
|
|
|
|
xmlHashSize (xmlHashTablePtr table);
|
|
|
|
XMLPUBFUN void XMLCALL
|
|
|
|
xmlHashScan (xmlHashTablePtr table,
|
|
|
|
xmlHashScanner f,
|
|
|
|
void *data);
|
|
|
|
XMLPUBFUN void XMLCALL
|
|
|
|
xmlHashScan3 (xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2,
|
|
|
|
const xmlChar *name3,
|
|
|
|
xmlHashScanner f,
|
|
|
|
void *data);
|
|
|
|
XMLPUBFUN void XMLCALL
|
|
|
|
xmlHashScanFull (xmlHashTablePtr table,
|
|
|
|
xmlHashScannerFull f,
|
|
|
|
void *data);
|
|
|
|
XMLPUBFUN void XMLCALL
|
|
|
|
xmlHashScanFull3(xmlHashTablePtr table,
|
|
|
|
const xmlChar *name,
|
|
|
|
const xmlChar *name2,
|
|
|
|
const xmlChar *name3,
|
|
|
|
xmlHashScannerFull f,
|
|
|
|
void *data);
|
2011-08-25 19:08:55 +08:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* ! __XML_HASH_H__ */
|