File indexing completed on 2024-05-05 07:43:10
0001 /* 0002 ** Author: Eric Veach, July 1994. 0003 ** 0004 */ 0005 0006 #include <stddef.h> 0007 #include "dict-list.h" 0008 #include "memalloc.h" 0009 0010 /* really __gl_dictListNewDict */ 0011 Dict *dictNewDict(void *frame, int (*leq)(void *frame, DictKey key1, DictKey key2)) 0012 { 0013 Dict *dict = (Dict *)memAlloc(sizeof(Dict)); 0014 DictNode *head; 0015 0016 if (dict == NULL) 0017 return NULL; 0018 0019 head = &dict->head; 0020 0021 head->key = NULL; 0022 head->next = head; 0023 head->prev = head; 0024 0025 dict->frame = frame; 0026 dict->leq = leq; 0027 0028 return dict; 0029 } 0030 0031 /* really __gl_dictListDeleteDict */ 0032 void dictDeleteDict(Dict *dict) 0033 { 0034 DictNode *node, *next; 0035 0036 for (node = dict->head.next; node != &dict->head; node = next) 0037 { 0038 next = node->next; 0039 memFree(node); 0040 } 0041 memFree(dict); 0042 } 0043 0044 /* really __gl_dictListInsertBefore */ 0045 DictNode *dictInsertBefore(Dict *dict, DictNode *node, DictKey key) 0046 { 0047 DictNode *newNode; 0048 0049 do 0050 { 0051 node = node->prev; 0052 } while (node->key != NULL && !(*dict->leq)(dict->frame, node->key, key)); 0053 0054 newNode = (DictNode *)memAlloc(sizeof(DictNode)); 0055 if (newNode == NULL) 0056 return NULL; 0057 0058 newNode->key = key; 0059 newNode->next = node->next; 0060 node->next->prev = newNode; 0061 newNode->prev = node; 0062 node->next = newNode; 0063 0064 return newNode; 0065 } 0066 0067 /* really __gl_dictListDelete */ 0068 void dictDelete(Dict *dict, DictNode *node) /*ARGSUSED*/ 0069 { 0070 node->next->prev = node->prev; 0071 node->prev->next = node->next; 0072 memFree(node); 0073 } 0074 0075 /* really __gl_dictListSearch */ 0076 DictNode *dictSearch(Dict *dict, DictKey key) 0077 { 0078 DictNode *node = &dict->head; 0079 0080 do 0081 { 0082 node = node->next; 0083 } while (node->key != NULL && !(*dict->leq)(dict->frame, key, node->key)); 0084 0085 return node; 0086 }