--- deliantra/server/common/shstr.C 2006/09/03 11:37:25 1.6 +++ deliantra/server/common/shstr.C 2006/09/03 23:33:00 1.7 @@ -9,9 +9,6 @@ #include "shstr.h" -// NOTE: even with lots of stuff loaded, we do not usually have >>20000 strings. -// maybe refcounting is just overhead? - struct hash { std::size_t operator ()(const char *s) const @@ -51,6 +48,22 @@ static HT ht; +static const char *makevec (const char *s) +{ + int len = strlen (s); + + const char *v = (const char *)(2 + (int *)malloc (sizeof (int) * 2 + len + 1)); + + shstr::length (v) = len; + shstr::refcnt (v) = 1; + + memcpy ((char *)v, s, len + 1); + + return s; +} + +const char *shstr::null = makevec (""); + const char * shstr::find (const char *s) { @@ -68,7 +81,7 @@ shstr::intern (const char *s) { if (!s) - return s; + return null; if (const char *found = find (s)) { @@ -76,18 +89,9 @@ return found; } - int len = strlen (s); - - const char *v = (const char *)(2 + (int *)malloc (sizeof (int) * 2 + len + 1)); - - length (v) = len; - refcnt (v) = 1; - - memcpy ((char *)v, s, len + 1); - - ht.insert (v); - - return v; + s = makevec (s); + ht.insert (s); + return s; } // periodically test refcounts == 0 for a few strings