#include #include #include #include #include "private.h" union entry { uintptr_t next; void *data; }; XID csx_display_add_resource(struct csx_display *display, void *p) { union entry *e, *map; int size; if (display->free_resource > 0) { e = display->resource_map + display->free_resource; display->free_resource = e->next; } else { if (display->resource_count == display->resource_size) { if (display->resource_size == 0) size = 256; else size = display->resource_size * 2; map = realloc(display->resource_map, size * sizeof *e); if (map == NULL) return None; display->resource_map = map; display->resource_size = size; } e = display->resource_map + display->resource_count; display->resource_count++; } e->data = p; return e - display->resource_map; } void csx_display_remove_resource(struct csx_display *display, XID id) { union entry *e; e = display->resource_map + id; e->next = display->free_resource; display->free_resource = id; } void * csx_display_lookup_resource(struct csx_display *display, XID id) { /* FIXME: verify that we're looking up a valid resource: * inside valid range and not in free-list. */ if (id >= display->resource_size) return NULL; return display->resource_map[id].data; }