1.1 --- a/types.c Thu Feb 07 09:58:48 2008 -0500
1.2 +++ b/types.c Fri Feb 08 11:19:36 2008 -0500
1.3 @@ -43,6 +43,69 @@
1.4 return p;
1.5 }
1.6
1.7 +#define RAZOR_ENTRY_LAST 0x80000000ul
1.8 +#define RAZOR_IMMEDIATE 0x80000000ul
1.9 +#define RAZOR_ENTRY_MASK 0x00fffffful
1.10 +
1.11 +void
1.12 +list_init(uint32_t *list)
1.13 +{
1.14 + *list = ~0;
1.15 +}
1.16 +
1.17 +void
1.18 +list_set(uint32_t *list, struct array *pool, struct array *items)
1.19 +{
1.20 + uint32_t *p;
1.21 +
1.22 + if (items->size == 0) {
1.23 + list_init(list);
1.24 + } else if (items->size == sizeof (uint32_t)) {
1.25 + *list = *(uint32_t *) items->data | RAZOR_IMMEDIATE;
1.26 + } else {
1.27 + p = array_add(pool, items->size);
1.28 + memcpy(p, items->data, items->size);
1.29 + p[items->size / sizeof *p - 1] |= RAZOR_ENTRY_LAST;
1.30 + *list = p - (uint32_t *) pool->data;
1.31 + }
1.32 +}
1.33 +
1.34 +uint32_t *
1.35 +list_first(uint32_t *list, struct array *pool)
1.36 +{
1.37 + if (*list == ~0)
1.38 + return NULL;
1.39 + else if (*list & RAZOR_IMMEDIATE)
1.40 + return list;
1.41 + else
1.42 + return (uint32_t *) pool->data + (*list & RAZOR_ENTRY_MASK);
1.43 +}
1.44 +
1.45 +uint32_t *
1.46 +list_next(uint32_t *list)
1.47 +{
1.48 + if (*list & ~RAZOR_ENTRY_MASK)
1.49 + return NULL;
1.50 + return ++list;
1.51 +}
1.52 +
1.53 +void
1.54 +list_remap_pool(struct array *pool, uint32_t *map)
1.55 +{
1.56 + uint32_t *p, *end;
1.57 +
1.58 + end = pool->data + pool->size;
1.59 + for (p = pool->data; p < end; p++)
1.60 + *p = map[LIST_VALUE(p)] | LIST_FLAGS(p);
1.61 +}
1.62 +
1.63 +void
1.64 +list_remap_if_immediate(uint32_t *list, uint32_t *map)
1.65 +{
1.66 + if ((*list & ~RAZOR_ENTRY_MASK) == RAZOR_IMMEDIATE)
1.67 + *list = map[LIST_VALUE(list)] | LIST_FLAGS(list);
1.68 +}
1.69 +
1.70
1.71 void
1.72 hashtable_init(struct hashtable *table, struct array *pool)