types.c
changeset 116 4ec6e2a55c34
parent 115 26edeea5c95a
child 117 1c213cbf9da9
     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)