From: kainazzzo Date: Tue, 6 Apr 2004 17:11:52 +0000 (+0000) Subject: Updated TODO and fixed the hashing algorithm for P10 numerics + others' nickname... X-Git-Url: https://jfr.im/git/irc/gameservirc.git/commitdiff_plain/59dc3990c7a62a9c3ad35142d5ef8a3d2cd02d8e?hp=82a7ca1fe7a4fe9197189e26691fdaceb5a62834 Updated TODO and fixed the hashing algorithm for P10 numerics + others' nickname changes git-svn-id: https://svn.code.sf.net/p/gameservirc/code/trunk@158 bc333340-6410-0410-a689-9d09f3c113fa --- diff --git a/gameserv/TODO b/gameserv/TODO index 5af2501..ddfd06d 100644 --- a/gameserv/TODO +++ b/gameserv/TODO @@ -89,3 +89,5 @@ X Deal with cheaters who create additional characters, fight with them a X Hash tables for speedy search/insert into player lists. +X Fix the hashing algorithm for nickname changes! + diff --git a/gameserv/gameserv.cpp b/gameserv/gameserv.cpp index c5e9cdf..e976420 100644 --- a/gameserv/gameserv.cpp +++ b/gameserv/gameserv.cpp @@ -2919,7 +2919,11 @@ unsigned long HASH(const unsigned char *name, int size_of_table) while (*name) { - h = (h << 4) + tolower(*name++); + #ifdef P10 + h = (h << 4) + (*name++); // Case sensitive for numerics + #else + h = (h << 4) + tolower(*name++); + #endif if ((g = (h & 0xF0000000))) h ^= g >> 24; h &= ~g; diff --git a/gameserv/list.h b/gameserv/list.h index e51d6f5..d19e556 100644 --- a/gameserv/list.h +++ b/gameserv/list.h @@ -21,7 +21,8 @@ class List { void insertAtBack( T *&); bool removeFromFront( T & ); bool removeFromBack( T & ); - bool remove( T * ); + bool del( T *); + ListNode < T > *remove( T * ); bool isEmpty() const; void print() const; ListNode < T > *Find( T * ); @@ -195,7 +196,19 @@ void List::print() const #endif template -bool List::remove(T *remPtr) +bool List::del(T *remPtr) +{ + ListNode *removed = remove( remPtr ); + if (removed != NULL) + { + delete removed; + return true; + } + return false; +} + +template +ListNode *List::remove(T *remPtr) { ListNode *newPtr = firstPtr; T *testPtr; @@ -214,8 +227,7 @@ bool List::remove(T *remPtr) log("One Element. Deleting it"); #endif firstPtr = lastPtr = NULL; - delete newPtr; - return true; + return newPtr; } else if (newPtr != lastPtr && newPtr != firstPtr) { @@ -224,8 +236,7 @@ bool List::remove(T *remPtr) #endif newPtr->prev->next = newPtr->next; newPtr->next->prev = newPtr->prev; - delete newPtr; - return true; + return newPtr; } else if (newPtr == lastPtr) { @@ -234,8 +245,7 @@ bool List::remove(T *remPtr) #endif lastPtr = newPtr->prev; lastPtr->next = 0; - delete newPtr; - return true; + return newPtr; } else if (newPtr == firstPtr) { @@ -244,12 +254,11 @@ bool List::remove(T *remPtr) #endif firstPtr = newPtr->next; firstPtr->prev = 0; - delete newPtr; - return true; + return newPtr; } } newPtr = newPtr->next; } - return false; + return NULL; } #endif diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index a0440ae..3e355d6 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -238,8 +238,14 @@ int main(int argc, char *argv[]) if ((tempPtr = find((source + 1)))) { char *nick; + unsigned long oldhv, newhv; nick = strtok(NULL, " "); + oldhv = HASH((unsigned char *) tempPtr->getNick(), + U_TABLE_SIZE); + newhv = HASH((unsigned char *) nick, U_TABLE_SIZE); tempPtr->setNick(nick); + clients[oldhv].remove(tempPtr); + clients[newhv].insertAtBack(tempPtr); } } else