shithub: femtolisp

ref: 2b105a52129a3124f1d75273f7b4e01b25ab25df
dir: /attic/flutils.c/

View raw version
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];
}