From f0fa6713b0c43a645f8ba610b8ef0d54f99bb5c7 Mon Sep 17 00:00:00 2001 From: ac_stef Date: Sat, 14 Feb 2009 15:12:52 +0000 Subject: [PATCH] memleak fixed + hashtable additions git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@4156 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/serverbrowser.cpp | 4 ++-- source/src/tools.cpp | 9 +++++++++ source/src/tools.h | 25 ++++++++++++++++++------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/source/src/serverbrowser.cpp b/source/src/serverbrowser.cpp index 3e97fd8f..b0dea454 100644 --- a/source/src/serverbrowser.cpp +++ b/source/src/serverbrowser.cpp @@ -602,7 +602,7 @@ void searchnickname(const char *name) if(!name || !name[0]) return; s_strcpy(cursearch, name); s_strcpy(cursearchuc, name); - for(char *t = cursearchuc; *t; t++) *t = toupper(*t); + strtoupper(cursearchuc); showmenu("search"); } COMMAND(searchnickname, ARG_1STR); @@ -613,7 +613,7 @@ bool matchplayername(const char *name) { static string nameuc; s_strcpy(nameuc, name); - for(char *t = nameuc; *t; t++) *t = toupper(*t); + strtoupper(nameuc); return strstr(nameuc, cursearchuc) != NULL; } diff --git a/source/src/tools.cpp b/source/src/tools.cpp index 591d534d..09fb86ea 100644 --- a/source/src/tools.cpp +++ b/source/src/tools.cpp @@ -457,6 +457,15 @@ bool isbigendian() return !(*((char *)(&one))); } +void strtoupper(char *s) +{ + while(*s) + { + *s = toupper(*s); + s++; + } +} + //////////////// geometry utils //////////////// static inline float det2x2(float a, float b, float c, float d) { return a*d - b*c; } diff --git a/source/src/tools.h b/source/src/tools.h index 89be9d2e..a419e292 100644 --- a/source/src/tools.h +++ b/source/src/tools.h @@ -416,6 +416,13 @@ template struct hashtable deletechunks(); } + void insertchains(chainchunk *emptychunk) + { + loopi(CHUNKSIZE-1) emptychunk->chains[i].next = &emptychunk->chains[i+1]; + emptychunk->chains[CHUNKSIZE-1].next = unused; + unused = emptychunk->chains; + } + chain *insert(const K &key, uint h) { if(!unused) @@ -423,9 +430,7 @@ template struct hashtable chainchunk *chunk = new chainchunk; chunk->next = chunks; chunks = chunk; - loopi(CHUNKSIZE-1) chunk->chains[i].next = &chunk->chains[i+1]; - chunk->chains[CHUNKSIZE-1].next = unused; - unused = chunk->chains; + insertchains(chunk); } chain *c = unused; unused = unused->next; @@ -474,7 +479,7 @@ template struct hashtable new (&c->data) T; new (&c->key) K; c->next = unused; - unused = c->next; + unused = c; numelems--; return true; } @@ -491,12 +496,16 @@ template struct hashtable } } - void clear() + void clear(bool del = true) { loopi(size) table[i] = NULL; numelems = 0; unused = NULL; - deletechunks(); + if(del) deletechunks(); + else + { + for(chainchunk *chunk = chunks; chunk; chunk = chunk->next) insertchains(chunk); + } } }; @@ -524,7 +533,7 @@ template struct ringbuf len--; return data[start]; } - + T &add(const T &e) { T &t = data[index]; @@ -560,6 +569,7 @@ template struct ringbuf #define ftoa(s, f) sprintf(s, (f) == int(f) ? "%.1f" : "%.7g", f) #define enumeratekt(ht,k,e,t,f,b) loopi((ht).size) for(hashtable::chain *enumc = (ht).table[i]; enumc;) { hashtable::const_key &e = enumc->key; t &f = enumc->data; enumc = enumc->next; b; } +#define enumeratek(ht,k,e,b) loopi((ht).size) for((ht).enumc = (ht).table[i]; (ht).enumc;) { k &e = (ht).enumc->key; (ht).enumc = (ht).enumc->next; b; } #define enumerate(ht,t,e,b) loopi((ht).size) for((ht).enumc = (ht).table[i]; (ht).enumc;) { t &e = (ht).enumc->data; (ht).enumc = (ht).enumc->next; b; } inline char *newstring(size_t l) { return new char[l+1]; } @@ -590,6 +600,7 @@ extern bool cmpb(void *b, int n, enet_uint32 c); extern bool cmpf(char *fn, enet_uint32 c); extern void endianswap(void *, int, int); extern bool isbigendian(); +extern void strtoupper(char *s); #if defined(WIN32) && !defined(_DEBUG) && !defined(__GNUC__) extern void stackdumper(unsigned int type, EXCEPTION_POINTERS *ep);