mirror of
https://github.com/cc65/cc65.git
synced 2024-11-19 06:31:31 +00:00
Change HT_Walk so that it can optionally be used to delete nodes from the hash
table. git-svn-id: svn://svn.cc65.org/cc65/trunk@5210 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
862c0ba70e
commit
c9ddc44ebe
@ -230,10 +230,13 @@ void HT_RemoveEntry (HashTable* T, void* Entry)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void HT_Walk (HashTable* T, void (*F) (void* Entry, void* Data), void* Data)
|
void HT_Walk (HashTable* T, int (*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, optionally deleting entries from the
|
||||||
* function F is called, passing a pointer to the entry, and the data pointer
|
* table. For each node, the user supplied function F is called, passing a
|
||||||
* passed to HT_Walk by the caller.
|
* pointer to the entry, and the data pointer passed to HT_Walk by the caller.
|
||||||
|
* If F returns true, the node is deleted from the hash table otherwise it's
|
||||||
|
* left in place. While deleting the node, the node is not accessed, so it is
|
||||||
|
* safe for F to free the memory associcated with the entry.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
unsigned I;
|
unsigned I;
|
||||||
@ -247,16 +250,23 @@ void HT_Walk (HashTable* T, void (*F) (void* Entry, void* Data), void* Data)
|
|||||||
for (I = 0; I < T->Slots; ++I) {
|
for (I = 0; I < T->Slots; ++I) {
|
||||||
|
|
||||||
/* Get the pointer to the first entry of the hash chain */
|
/* Get the pointer to the first entry of the hash chain */
|
||||||
HashNode* N = T->Table[I];
|
HashNode** Cur = &T->Table[I];
|
||||||
|
|
||||||
/* Walk over all entries in this chain */
|
/* Walk over all entries in this chain */
|
||||||
while (N) {
|
while (*Cur) {
|
||||||
/* Call the user function. N is also the pointer to the entry */
|
/* Fetch the next node in chain now, because F() may delete it */
|
||||||
F (N, Data);
|
HashNode* Next = (*Cur)->Next;
|
||||||
/* Next node in chain */
|
/* Call the user function. N is also the pointer to the entry. If
|
||||||
N = N->Next;
|
* the function returns true, the entry is to be deleted.
|
||||||
|
*/
|
||||||
|
if (F (*Cur, Data)) {
|
||||||
|
/* Delete the node from the chain */
|
||||||
|
*Cur = Next;
|
||||||
|
} else {
|
||||||
|
/* Next node in chain */
|
||||||
|
Cur = &(*Cur)->Next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,10 +162,13 @@ void HT_InsertEntry (HashTable* T, void* Entry);
|
|||||||
void HT_RemoveEntry (HashTable* T, void* Entry);
|
void HT_RemoveEntry (HashTable* T, void* Entry);
|
||||||
/* Remove an entry from the given hash table */
|
/* 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, int (*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, optionally deleting entries from the
|
||||||
* function F is called, passing a pointer to the entry, and the data pointer
|
* table. For each node, the user supplied function F is called, passing a
|
||||||
* passed to HT_Walk by the caller.
|
* pointer to the entry, and the data pointer passed to HT_Walk by the caller.
|
||||||
|
* If F returns true, the node is deleted from the hash table otherwise it's
|
||||||
|
* left in place. While deleting the node, the node is not accessed, so it is
|
||||||
|
* safe for F to free the memory associcated with the entry.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user