1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-26 08:32:00 +00:00

Added routines to remove an entry from the hash table.

git-svn-id: svn://svn.cc65.org/cc65/trunk@5048 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2011-06-11 18:17:54 +00:00
parent ce0d51d55a
commit 279ad05150
2 changed files with 58 additions and 8 deletions

View File

@ -6,10 +6,10 @@
/* */ /* */
/* */ /* */
/* */ /* */
/* (C) 2003 Ullrich von Bassewitz */ /* (C) 2003-2011, Ullrich von Bassewitz */
/* Römerstrasse 52 */ /* Roemerstrasse 52 */
/* D-70794 Filderstadt */ /* D-70794 Filderstadt */
/* EMail: uz@cc65.org */ /* EMail: uz@cc65.org */
/* */ /* */
/* */ /* */
/* This software is provided 'as-is', without any expressed or implied */ /* This software is provided 'as-is', without any expressed or implied */
@ -34,6 +34,7 @@
/* common */ /* common */
#include "check.h"
#include "hashtab.h" #include "hashtab.h"
#include "xmalloc.h" #include "xmalloc.h"
@ -164,6 +165,34 @@ void HT_Insert (HashTable* T, HashNode* N)
void HT_Remove (HashNode* N)
/* Remove a node from a hash table. */
{
/* Get the table from the node */
HashTable* T = N->Owner;
/* Calculate the reduced hash, which is also the slot number */
unsigned Slot = N->Hash % T->Slots;
/* Remove the entry from the single linked list */
HashNode** Q = &T->Table[Slot];
while (1) {
/* If the pointer is NULL, the node is not in the table which we will
* consider a serious error.
*/
CHECK (*Q != 0);
if (*Q == N) {
/* Found - remove it */
*Q = N->Next;
break;
}
/* Next node */
Q = &(*Q)->Next;
}
}
void HT_InsertEntry (HashTable* T, void* Entry) void HT_InsertEntry (HashTable* T, void* Entry)
/* Insert an entry into the given hash table */ /* Insert an entry into the given hash table */
{ {
@ -172,6 +201,21 @@ void HT_InsertEntry (HashTable* T, void* Entry)
void HT_RemoveEntry (HashTable* T, void* Entry)
/* Remove an entry from the given hash table */
{
/* Get the node from the entry */
HashNode* N = T->Func->GetHashNode (Entry);
/* Make sure the entry is actually in the given table */
CHECK (N->Owner == T);
/* Remove the node */
HT_Remove (N);
}
void HT_Walk (HashTable* T, void (*F) (void* Entry, void* Data), void* Data) void HT_Walk (HashTable* T, void (*F) (void* Entry, void* Data), void* Data)
/* Walk over all nodes of a hash table. For each node, the user supplied /* Walk over all nodes of a hash table. For each node, the user supplied
* function F is called, passing a pointer to the entry, and the data pointer * function F is called, passing a pointer to the entry, and the data pointer

View File

@ -6,10 +6,10 @@
/* */ /* */
/* */ /* */
/* */ /* */
/* (C) 2003-2008 Ullrich von Bassewitz */ /* (C) 2003-2011, Ullrich von Bassewitz */
/* Roemerstrasse 52 */ /* Roemerstrasse 52 */
/* D-70794 Filderstadt */ /* D-70794 Filderstadt */
/* EMail: uz@cc65.org */ /* EMail: uz@cc65.org */
/* */ /* */
/* */ /* */
/* This software is provided 'as-is', without any expressed or implied */ /* This software is provided 'as-is', without any expressed or implied */
@ -196,9 +196,15 @@ void* HT_FindEntry (const HashTable* T, const void* Key);
void HT_Insert (HashTable* T, HashNode* N); void HT_Insert (HashTable* T, HashNode* N);
/* Insert a node into the given hash table */ /* Insert a node into the given hash table */
void HT_Remove (HashNode* N);
/* Remove a node from its hash table */
void HT_InsertEntry (HashTable* T, void* Entry); void HT_InsertEntry (HashTable* T, void* Entry);
/* Insert an entry into the given hash table */ /* Insert an entry into the given hash table */
void HT_RemoveEntry (HashTable* T, void* Entry);
/* Remove an entry from the given hash table */
void HT_Walk (HashTable* T, void (*F) (void* Entry, void* Data), void* Data); void HT_Walk (HashTable* T, void (*F) (void* Entry, void* Data), void* Data);
/* Walk over all nodes of a hash table. For each node, the user supplied /* Walk over all nodes of a hash table. For each node, the user supplied
* function F is called, passing a pointer to the entry, and the data pointer * function F is called, passing a pointer to the entry, and the data pointer