1 /* $Id$ $Revision$ */
2 /* vim:set shiftwidth=4 ts=8: */
3
4 /*************************************************************************
5 * Copyright (c) 2011 AT&T Intellectual Property
6 * All rights reserved. This program and the accompanying materials
7 * are made available under the terms of the Eclipse Public License v1.0
8 * which accompanies this distribution, and is available at
9 * http://www.eclipse.org/legal/epl-v10.html
10 *
11 * Contributors: See CVS logs. Details at http://www.graphviz.org/
12 *************************************************************************/
13
14
15 /*
16 * Queue implementation using cdt
17 *
18 */
19
20 #include <queue.h>
21 #include <ast.h>
22
23 typedef struct {
24 Dtlink_t link;
25 void *np;
26 } nsitem;
27
makef(Dt_t * d,nsitem * obj,Dtdisc_t * disc)28 static void *makef(Dt_t * d, nsitem * obj, Dtdisc_t * disc)
29 {
30 nsitem *p;
31
32 p = oldof(0, nsitem, 1, 0);
33 p->np = obj->np;
34 return p;
35 }
36
freef(Dt_t * d,nsitem * obj,Dtdisc_t * disc)37 static void freef(Dt_t * d, nsitem * obj, Dtdisc_t * disc)
38 {
39 free(obj);
40 }
41
42 static Dtdisc_t ndisc = {
43 offsetof(nsitem, np),
44 sizeof(void *),
45 offsetof(nsitem, link),
46 (Dtmake_f) makef,
47 (Dtfree_f) freef,
48 0,
49 0,
50 0,
51 0
52 };
53
mkQ(Dtmethod_t * meth)54 queue *mkQ(Dtmethod_t * meth)
55 {
56 queue *nq;
57
58 nq = dtopen(&ndisc, meth);
59 return nq;
60 }
61
push(queue * nq,void * n)62 void push(queue * nq, void *n)
63 {
64 nsitem obj;
65
66 obj.np = n;
67 dtinsert(nq, &obj);
68 }
69
pop(queue * nq,int delete)70 void *pop(queue * nq, int delete)
71 {
72 nsitem *obj;
73 void *n;
74
75 obj = dtfirst(nq);
76 if (obj) {
77 n = obj->np;
78 if (delete)
79 dtdelete(nq, 0);
80 return n;
81 } else
82 return 0;
83 }
84
freeQ(queue * nq)85 void freeQ(queue * nq)
86 {
87 dtclose(nq);
88 }
89