24 #include <sys/types.h> 30 #if defined(__sun__) && defined(StupidSunHeaders) 45 #ifdef HAVE_LIBDMALLOC 57 #if !defined(__STDC__) 70 static unsigned long hashstr(
const char *str) {
71 unsigned long hash = 0;
78 for (p = str; i <
MAXSTRING && *p; p++, i++) {
79 hash ^= (
unsigned long)*p<<rot;
81 if (rot >= (
sizeof(
unsigned long)-
sizeof(
char))*CHAR_BIT)
143 ss = hash_table[ind];
150 GATHER(add_stats.strcmps);
151 if (strcmp(ss->
string, str)) {
160 GATHER(add_stats.strcmps);
161 if (strcmp(ss->
string, str)) {
197 hash_table[ind]->
u.
array = &(hash_table[ind]);
199 return hash_table[ind]->
string;
211 GATHER(add_ref_stats.calls);
212 ++(
SS(str)->refcount);
243 ss = hash_table[ind];
249 GATHER(find_stats.strcmps);
250 if (!strcmp(ss->
string, str)) {
251 GATHER(find_stats.hashed);
256 GATHER(find_stats.search);
257 GATHER(find_stats.strcmps);
259 if (!strcmp(ss->
string, str)) {
260 GATHER(find_stats.linked);
324 static char line[80];
326 snprintf(buf, size,
"%-13s %6s %6s %6s %6s %6s\n",
"",
"calls",
"hashed",
"strcmp",
"search",
"linked");
327 snprintf(line,
sizeof(line),
"%-13s %6d %6d %6d %6d %6d\n",
"add_string:", add_stats.calls, add_stats.hashed, add_stats.strcmps, add_stats.search, add_stats.linked);
328 snprintf(buf+strlen(buf), size-strlen(buf),
"%s", line);
329 snprintf(line,
sizeof(line),
"%-13s %6d\n",
"add_refcount:", add_ref_stats.calls);
330 snprintf(buf+strlen(buf), size-strlen(buf),
"%s", line);
331 snprintf(line,
sizeof(line),
"%-13s %6d\n",
"free_string:", free_stats.calls);
332 snprintf(buf+strlen(buf), size-strlen(buf),
"%s", line);
333 snprintf(line,
sizeof(line),
"%-13s %6d %6d %6d %6d %6d\n",
"find_string:", find_stats.calls, find_stats.hashed, find_stats.strcmps, find_stats.search, find_stats.linked);
334 snprintf(buf+strlen(buf), size-strlen(buf),
"%s", line);
335 snprintf(line,
sizeof(line),
"%-13s %6d\n",
"hashstr:", hash_stats.calls);
336 snprintf(buf+strlen(buf), size-strlen(buf),
"%s", line);
355 int entries = 0, refs = 0, links = 0;
361 if ((ss = hash_table[i]) != NULL) {
381 snprintf(buf, size,
"\n%d entries, %d refs, %d links.", entries, refs, links);
399 size_t len1 = 0, len2 = 0;
407 if (len1 >= (bufsize-len2))
sstring add_refcount(sstring str)
void fatal(enum fatal_error err)
int query_refcount(sstring str)
void free_string(sstring str)
struct _shared_string * previous
struct _shared_string * next
sstring find_string(const char *str)
void init_hash_table(void)
int buf_overflow(const char *buf1, const char *buf2, size_t bufsize)
struct _shared_string ** array
unsigned REFCOUNT_TYPE refcount
char * ss_dump_table(int what, char *buf, size_t size)
static shared_string * hash_table[TABLESIZE]
union _shared_string::@4 u
static unsigned long hashstr(const char *str)
void ss_dump_statistics(char *buf, size_t size)
static shared_string * new_shared_string(const char *str)
sstring add_string(const char *str)
void LOG(LogLevel logLevel, const char *format,...)