60 lines
1.1 KiB
C
60 lines
1.1 KiB
C
typedef struct {
|
|
size_t n, maxsize;
|
|
unsigned long *items;
|
|
} ltable_t;
|
|
|
|
void ltable_init(ltable_t *t, size_t n)
|
|
{
|
|
t->n = 0;
|
|
t->maxsize = n;
|
|
t->items = (unsigned long*)malloc(n * sizeof(unsigned long));
|
|
}
|
|
|
|
void ltable_clear(ltable_t *t)
|
|
{
|
|
t->n = 0;
|
|
}
|
|
|
|
void ltable_insert(ltable_t *t, unsigned long item)
|
|
{
|
|
unsigned long *p;
|
|
|
|
if (t->n == t->maxsize) {
|
|
p = realloc(t->items, (t->maxsize*2)*sizeof(unsigned long));
|
|
if (p == NULL) return;
|
|
t->items = p;
|
|
t->maxsize *= 2;
|
|
}
|
|
t->items[t->n++] = item;
|
|
}
|
|
|
|
#define LT_NOTFOUND ((int)-1)
|
|
|
|
int ltable_lookup(ltable_t *t, unsigned long item)
|
|
{
|
|
int i;
|
|
for(i=0; i < (int)t->n; i++)
|
|
if (t->items[i] == item)
|
|
return i;
|
|
return LT_NOTFOUND;
|
|
}
|
|
|
|
void ltable_adjoin(ltable_t *t, unsigned long item)
|
|
{
|
|
if (ltable_lookup(t, item) == LT_NOTFOUND)
|
|
ltable_insert(t, item);
|
|
}
|
|
|
|
char *snprintf_gensym_id(char *nbuf, size_t n, u_int32_t g)
|
|
{
|
|
size_t i=n-1;
|
|
|
|
nbuf[i--] = '\0';
|
|
do {
|
|
nbuf[i--] = '0' + g%10;
|
|
g/=10;
|
|
} while (g && i);
|
|
nbuf[i] = 'g';
|
|
return &nbuf[i];
|
|
}
|