memleak fixed + hashtable additions

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@4156 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
ac_stef
2009-02-14 15:12:52 +00:00
parent 42de5ba8ab
commit f0fa6713b0
3 changed files with 29 additions and 9 deletions
+2 -2
View File
@@ -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;
}
+9
View File
@@ -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; }
+18 -7
View File
@@ -416,6 +416,13 @@ template <class K, class T> 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 <class K, class T> 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 <class K, class T> 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 <class K, class T> 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 <class T, int SIZE> struct ringbuf
len--;
return data[start];
}
T &add(const T &e)
{
T &t = data[index];
@@ -560,6 +569,7 @@ template <class T, int SIZE> 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<k,t>::chain *enumc = (ht).table[i]; enumc;) { hashtable<k,t>::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);