File indexing completed on 2024-04-21 14:46:23

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 }