1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
/**
* @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 */
|