mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-12 07:34:50 +00:00
54 lines
1.1 KiB
C++
54 lines
1.1 KiB
C++
|
#include <string.h>
|
||
|
#include "name.h"
|
||
|
#include "c_dispatch.h"
|
||
|
|
||
|
int name::Buckets[name::HASH_SIZE];
|
||
|
TArray<name::MainName> name::NameArray;
|
||
|
bool name::Inited;
|
||
|
|
||
|
name::MainName::MainName (int next)
|
||
|
: NextHash(next)
|
||
|
{
|
||
|
}
|
||
|
int name::FindName (const char *text, bool noCreate)
|
||
|
{
|
||
|
if (!Inited) InitBuckets ();
|
||
|
|
||
|
int hash = MakeKey (text) % HASH_SIZE;
|
||
|
int scanner = Buckets[hash];
|
||
|
|
||
|
// See if the name already exists.
|
||
|
while (scanner >= 0)
|
||
|
{
|
||
|
if (stricmp (NameArray[scanner].Text.GetChars(), text) == 0)
|
||
|
{
|
||
|
return scanner;
|
||
|
}
|
||
|
scanner = NameArray[scanner].NextHash;
|
||
|
}
|
||
|
|
||
|
// If we get here, then the name does not exist.
|
||
|
if (noCreate)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
// Assigning the string to the name after pushing it avoids needless
|
||
|
// manipulation of the string pool.
|
||
|
MainName entry (Buckets[hash]);
|
||
|
unsigned int index = NameArray.Push (entry);
|
||
|
NameArray[index].Text = text;
|
||
|
Buckets[hash] = index;
|
||
|
return index;
|
||
|
}
|
||
|
|
||
|
void name::InitBuckets ()
|
||
|
{
|
||
|
Inited = true;
|
||
|
for (int i = 0; i < HASH_SIZE; ++i)
|
||
|
{
|
||
|
Buckets[i] = -1;
|
||
|
}
|
||
|
name::FindName ("None", false); // 'None' is always name 0.
|
||
|
}
|