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