Graphviz 12.0.1~dev.20240715.2254
Loading...
Searching...
No Matches
dtlist.c
Go to the documentation of this file.
1#include <cdt/dthdr.h>
2#include <stdlib.h>
3
4/* List, Deque, Stack, Queue.
5**
6** Written by Kiem-Phong Vo (05/25/96)
7*/
8
9static void* dtlist(Dt_t* dt, void* obj, int type)
10{
11 int lk, sz, ky;
13 Dtdisc_t* disc;
14 Dtlink_t *r, *t;
15 void *key, *k;
16
17 UNFLATTEN(dt);
18 disc = dt->disc; _DTDSC(disc,ky,sz,lk,cmpf);
19
20 if(!obj)
21 { if(type&(DT_LAST|DT_FIRST) )
22 { if((r = dt->data->head) )
23 { if(type&DT_LAST)
24 r = r->left;
25 dt->data->here = r;
26 }
27 return r ? _DTOBJ(r,lk) : NULL;
28 }
29 else if(type&(DT_DELETE|DT_DETACH))
30 { if(!(r = dt->data->head))
31 return NULL;
32 else goto dt_delete;
33 }
34 else if(type&DT_CLEAR)
35 { if(disc->freef || disc->link < 0)
36 { for(r = dt->data->head; r; r = t)
37 { t = r->right;
38 if(disc->freef)
39 disc->freef(_DTOBJ(r, lk));
40 if(disc->link < 0)
41 free(r);
42 }
43 }
44 dt->data->head = dt->data->here = NULL;
45 dt->data->size = 0;
46 return NULL;
47 }
48 else return NULL;
49 }
50
51 if(type&DT_INSERT)
52 { if (disc->makef && (type&DT_INSERT) && !(obj = disc->makef(obj, disc)))
53 return NULL;
54 if(lk >= 0)
55 r = _DTLNK(obj,lk);
56 else
57 { r = malloc(sizeof(Dthold_t));
58 if(r)
59 ((Dthold_t*)r)->obj = obj;
60 else
61 { if(disc->makef && disc->freef && (type&DT_INSERT))
62 disc->freef(obj);
63 return NULL;
64 }
65 }
66
67 /* if(dt->data->type&DT_QUEUE) */
68 if((t = dt->data->head) )
69 { t->left->right = r;
70 r->left = t->left;
71 t->left = r;
72 }
73 else
74 { dt->data->head = r;
75 r->left = r;
76 }
77 r->right = NULL;
78
79 if(dt->data->size >= 0)
80 dt->data->size += 1;
81
82 dt->data->here = r;
83 return _DTOBJ(r,lk);
84 }
85
86 if((type&DT_MATCH) || !(r = dt->data->here) || _DTOBJ(r,lk) != obj)
87 { key = (type&DT_MATCH) ? obj : _DTKEY(obj,ky,sz);
88 for(r = dt->data->head; r; r = r->right)
89 { k = _DTOBJ(r,lk); k = _DTKEY(k,ky,sz);
90 if(_DTCMP(key, k, cmpf, sz) == 0)
91 break;
92 }
93 }
94
95 if(!r)
96 return NULL;
97
99 { dt_delete:
100 if(r->right)
101 r->right->left = r->left;
102 if(r == (t = dt->data->head) )
103 { dt->data->head = r->right;
104 if(dt->data->head)
105 dt->data->head->left = t->left;
106 }
107 else
108 { r->left->right = r->right;
109 if(r == t->left)
110 t->left = r->left;
111 }
112
113 dt->data->here = r == dt->data->here ? r->right : NULL;
114 dt->data->size -= 1;
115
116 obj = _DTOBJ(r,lk);
117 if(disc->freef && (type&DT_DELETE))
118 disc->freef(obj);
119 if(disc->link < 0)
120 free(r);
121 return obj;
122 }
123 else if(type&DT_NEXT)
124 r = r->right;
125 else if(type&DT_PREV)
126 r = r == dt->data->head ? NULL : r->left;
127
128 dt->data->here = r;
129 return r ? _DTOBJ(r,lk) : NULL;
130}
131
133
#define DT_MATCH
Definition cdt.h:140
#define _DTKEY(o, ky, sz)
Definition cdt.h:177
#define _DTDSC(dc, ky, sz, lk, cmpf)
Definition cdt.h:173
#define DT_LAST
Definition cdt.h:139
#define DT_PREV
Definition cdt.h:135
#define _DTLNK(o, lk)
Definition cdt.h:175
#define DT_NEXT
Definition cdt.h:134
int(* Dtcompar_f)(void *, void *)
Definition cdt.h:52
#define DT_DELETE
Definition cdt.h:132
#define DT_CLEAR
Definition cdt.h:137
#define DT_INSERT
Definition cdt.h:131
#define DT_DETACH
Definition cdt.h:142
#define _DTCMP(k1, k2, cmpf, sz)
Definition cdt.h:179
#define _DTOBJ(e, lk)
Definition cdt.h:176
#define DT_QUEUE
Definition cdt.h:127
#define DT_FIRST
Definition cdt.h:138
static int cmpf(void *key1, void *key2)
Definition dijkstra.c:81
#define UNFLATTEN(dt)
Definition dthdr.h:27
Dtmethod_t * Dtqueue
queue: insert at top, delete at tail
Definition dtlist.c:134
Dtmethod_t _Dtqueue
Definition dtlist.c:132
static void * dtlist(Dt_t *dt, void *obj, int type)
Definition dtlist.c:9
disc key
Definition exparse.y:214
expr procedure type
Definition exparse.y:211
void * malloc(YYSIZE_T)
void free(void *)
node NULL
Definition grammar.y:149
Definition cdt.h:104
Dtdata_t * data
Definition cdt.h:106
Dtdisc_t * disc
Definition cdt.h:105
Dtlink_t * here
Definition cdt.h:77
int size
Definition cdt.h:83
Dtfree_f freef
Definition cdt.h:93
Dtmake_f makef
Definition cdt.h:92
int link
Definition cdt.h:91