88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
/**
|
|
* @file
|
|
* Shared-strings defines.
|
|
*/
|
|
|
|
#ifndef SHSTR_H
|
|
#define SHSTR_H
|
|
|
|
/**
|
|
* The size of the shared strings hashtable. This must be smaller than
|
|
* 32767, but 947 ought to be plenty enough.
|
|
*/
|
|
#define TABLESIZE 4133
|
|
|
|
/**
|
|
* This specifies how many characters the hashing routine should look at.
|
|
* You may actually save CPU by increasing this number if the typical string
|
|
* is large.
|
|
*/
|
|
#ifndef MAXSTRING
|
|
#define MAXSTRING 20
|
|
#endif
|
|
|
|
/**
|
|
* In the unlikely occurence that 16383 references to a string are too
|
|
* few, you can modify the below type to something bigger.
|
|
* (The top bit of "refcount" is used to signify that "u.array" points
|
|
* at the array entry.)
|
|
*/
|
|
#define REFCOUNT_TYPE int
|
|
|
|
/**
|
|
* The offsetof macro is part of ANSI C, but many compilers lack it, for
|
|
* example "gcc -ansi"
|
|
*/
|
|
#if !defined(offsetof)
|
|
#define offsetof(type, member) (int)&(((type *)0)->member)
|
|
#endif
|
|
|
|
/**
|
|
* SS(string) will return the address of the shared_string struct which
|
|
* contains "string".
|
|
*/
|
|
#define SS(x) ((shared_string *) ((x)-offsetof(shared_string, string)))
|
|
|
|
#define SS_DUMP_TABLE 1
|
|
#define SS_DUMP_TOTALS 2
|
|
|
|
#ifdef SS_STATISTICS
|
|
/** Used to collect statistics on string manipulation. */
|
|
static struct statistics {
|
|
int calls;
|
|
int hashed;
|
|
int strcmps;
|
|
int search;
|
|
int linked;
|
|
} add_stats, add_ref_stats, free_stats, find_stats, hash_stats;
|
|
#define GATHER(n) (++n)
|
|
#else /* !SS_STATISTICS */
|
|
#define GATHER(n)
|
|
#endif /* SS_STATISTICS */
|
|
|
|
#define TOPBIT ((unsigned REFCOUNT_TYPE)1<<(sizeof(REFCOUNT_TYPE)*CHAR_BIT-1))
|
|
|
|
#define PADDING ((2*sizeof(long)-sizeof(REFCOUNT_TYPE))%sizeof(long))+1
|
|
|
|
/**
|
|
* One actual shared string.
|
|
*/
|
|
typedef struct _shared_string {
|
|
union {
|
|
struct _shared_string **array;
|
|
struct _shared_string *previous;
|
|
} u;
|
|
struct _shared_string *next;
|
|
/* The top bit of "refcount" is used to signify that "u.array" points
|
|
* at the array entry.
|
|
*/
|
|
unsigned REFCOUNT_TYPE refcount;
|
|
/* Padding will be unused memory, since we can't know how large
|
|
* the padding when allocating memory. We assume here that
|
|
* sizeof(long) is a good boundary.
|
|
*/
|
|
char string[PADDING];
|
|
} shared_string;
|
|
|
|
#endif /* SHSTR_H */
|