Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtappbuilder / src / libAButil / util_ds.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /*
24  *      $XConsortium: util_ds.c /main/4 1995/11/06 18:53:21 rswiston $
25  *
26  * @(#)util_ds.c        1.3 23 Feb 1994      cde_app_builder/src/libAButil
27  *
28  *      RESTRICTED CONFIDENTIAL INFORMATION:
29  *
30  *      The information in this document is subject to special
31  *      restrictions in a confidential disclosure agreement between
32  *      HP, IBM, Sun, USL, SCO and Univel.  Do not distribute this
33  *      document outside HP, IBM, Sun, USL, SCO, or Univel without
34  *      Sun's specific written approval.  This document and all copies
35  *      and derivative works thereof must be returned or destroyed at
36  *      Sun's request.
37  *
38  *      Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
39  *
40  */
41
42
43 #include <X11/Intrinsic.h>
44 #include <ab_private/util_ds.h>
45
46 /***************************************************
47  * Linked List and Active Set ADT implementations
48  ***************************************************/
49
50 struct _LListStruct {
51     void                *value;
52     struct _LListStruct *next;
53 };
54
55 static void             llist_delete_next(
56                             LList       llist
57                         );
58
59 extern LList
60 util_llist_create(
61     void
62 )
63 {
64     LList tmp = (LList) XtMalloc(sizeof(struct _LListStruct));
65
66     tmp->next = NULL;
67     return(tmp);
68 }
69
70 extern void
71 util_llist_destroy(
72     LList       llist
73 )
74 {
75     while (llist != NULL)
76     {
77         LList   tmp = llist;
78
79         llist = llist->next;
80         XtFree((char *)tmp);
81     }
82 }
83
84 extern void
85 util_llist_insert_after(
86     LList       llist,
87     void        *cl_data
88 )
89 {
90     LList       tmp = util_llist_create();
91
92     tmp->value  = cl_data;
93     tmp->next   = llist->next;
94     llist->next = tmp;
95 }
96
97 extern LList
98 util_llist_find(
99     LList       llist,
100     void        *cl_data
101 )
102 {
103     ASet        prev;
104     ASet        trav;
105
106     for (prev = llist, trav = llist->next; trav != NULL;
107                             prev = trav, trav = trav->next)
108         if (trav->value == cl_data)
109             return(prev);
110     return(NULL);
111 }
112
113 extern void
114 util_llist_delete(
115     LList       llist,
116     void        *cl_data
117 )
118 {
119     LList       tmp = util_llist_find(llist, cl_data);
120
121     if (tmp != NULL)
122         llist_delete_next(tmp);
123 }
124
125 static void
126 llist_delete_next(
127     LList       llist
128 )
129 {
130     LList       tmp = llist->next;
131
132     if (tmp != NULL)
133     {
134         llist->next = tmp->next;
135         XtFree((char *)tmp);
136     }
137 }
138
139 extern void
140 util_llist_iterate(
141     LList       llist,
142     LListIterFn fn
143 )
144 {
145     for (llist = llist->next; llist != NULL; llist = llist->next)
146         (*fn)(llist->value);
147 }
148 \f
149 extern void
150 util_aset_add(
151     ASet        aset,
152     void        *cl_data
153 )
154 {
155     if (util_llist_find(aset, cl_data) == NULL)
156         util_llist_insert_after(aset, cl_data);
157 }