fixed a long-standing problem that tries ignored empty strings

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401673
This commit is contained in:
David Anderson 2007-11-10 03:18:55 +00:00
parent a8f9073fb0
commit 6bda3e55b9

View File

@ -145,12 +145,28 @@ public:
unsigned int q; /* temporary var for x_check results */ unsigned int q; /* temporary var for x_check results */
unsigned int curoffs; /* current offset */ unsigned int curoffs; /* current offset */
/* Do not handle empty strings for simplicity */ /**
if (!*key) * Empty strings are a special case, since there are no productions. We could
* probably rework it to use BASE[0] but this hack is easier.
*/
if (*key == '\0')
{
if (m_empty != NULL && m_empty->valset)
{ {
return false; return false;
} }
if (m_empty == NULL)
{
m_empty = (KTrieNode *)malloc(sizeof(KTrieNode));
}
m_empty->valset = true;
new (&m_empty->value) K(obj);
return true;
}
/* Start traversing at the root node (1) */ /* Start traversing at the root node (1) */
do do
{ {
@ -627,11 +643,18 @@ public:
m_stringtab = (char *)malloc(sizeof(char) * 256); m_stringtab = (char *)malloc(sizeof(char) * 256);
m_baseSize = 256; m_baseSize = 256;
m_stSize = 256; m_stSize = 256;
m_empty = NULL;
internal_clear(); internal_clear();
} }
~KTrie() ~KTrie()
{ {
if (m_empty != NULL && m_empty->valset)
{
m_empty->value.~K();
m_empty->valset = false;
}
free(m_empty);
run_destructors(); run_destructors();
free(m_base); free(m_base);
free(m_stringtab); free(m_stringtab);
@ -668,7 +691,7 @@ private:
if (!*key) if (!*key)
{ {
return NULL; return m_empty;
} }
/* Start traversing at the root node */ /* Start traversing at the root node */
@ -856,6 +879,7 @@ private:
} }
private: private:
KTrieNode *m_base; /* Base array for the sparse tables */ KTrieNode *m_base; /* Base array for the sparse tables */
KTrieNode *m_empty; /* Special case for empty strings */
char *m_stringtab; /* String table pointer */ char *m_stringtab; /* String table pointer */
unsigned int m_baseSize; /* Size of the base array, in members */ unsigned int m_baseSize; /* Size of the base array, in members */
unsigned int m_stSize; /* Size of the string table, in bytes */ unsigned int m_stSize; /* Size of the string table, in bytes */