/* handle<->ptr conversion. */ #include #include #include "handle.h" typedef struct _node node; struct _node { void *ptr; int handle; node *prev, *next; }; static node *head = NULL; static int nexthandle; void INITIALIZE() { if (head == NULL) { head = malloc(sizeof(node)); head->next = head; head->prev = head; } } int newhandle(void *ptr) { node *newnode; node *prevnode, *nextnode; INITIALIZE(); /* Create new node */ newnode = malloc(sizeof(node)); newnode->handle = nexthandle++; newnode->ptr = ptr; /* Insert into doubly-linked list */ prevnode = head; nextnode = head->next; prevnode->next = newnode; nextnode->prev = newnode; newnode->next = nextnode; newnode->prev = prevnode; } void deletehandle(int handle) { node *cur = head->next; node *prevnode, *nextnode; INITIALIZE(); while ((cur != head) && (cur->handle != handle)) cur = cur->next; assert(cur != head); assert(cur->handle == handle); /* Remove node from the doubly-linked list */ prevnode = cur->prev; nextnode = cur->next; prevnode->next = nextnode; nextnode->prev = prevnode; free(cur); } int handletoptr(int h, void **ptr) { node *cur = head->next; INITIALIZE(); while (cur != head) { if (cur->handle == h) { *ptr = cur->ptr; return 1; } cur = cur->next; } return 0; } int ptrtohandle(void *ptr, int *h) { node *cur = head->next; INITIALIZE(); while (cur != head) { if (cur->ptr == ptr) { *h = cur->handle; return 1; } cur = cur->next; } return 0; }