1b1466ae0SMasatake YAMATO /*
2b1466ae0SMasatake YAMATO *
3b1466ae0SMasatake YAMATO * Copyright (c) 2014, Red Hat, Inc.
4b1466ae0SMasatake YAMATO * Copyright (c) 2014, Masatake YAMATO
5b1466ae0SMasatake YAMATO *
6b1466ae0SMasatake YAMATO * This source code is released for free distribution under the terms of the
7b1466ae0SMasatake YAMATO * GNU General Public License.
8b1466ae0SMasatake YAMATO *
9b1466ae0SMasatake YAMATO */
10b1466ae0SMasatake YAMATO
11b1466ae0SMasatake YAMATO #include "general.h"
12b1466ae0SMasatake YAMATO
13b1466ae0SMasatake YAMATO #include "debug.h"
14b1466ae0SMasatake YAMATO #include "routines.h"
15b1466ae0SMasatake YAMATO #include "trashbox.h"
16b1466ae0SMasatake YAMATO
17b1466ae0SMasatake YAMATO typedef TrashBoxDestroyItemProc TrashDestroyItemProc;
18b1466ae0SMasatake YAMATO typedef struct sTrash {
19b1466ae0SMasatake YAMATO void* item;
20b1466ae0SMasatake YAMATO struct sTrash* next;
21b1466ae0SMasatake YAMATO TrashDestroyItemProc destrctor;
22b1466ae0SMasatake YAMATO } Trash;
23b1466ae0SMasatake YAMATO
24b1466ae0SMasatake YAMATO struct sTrashBox {
25b1466ae0SMasatake YAMATO Trash *trash;
26b1466ae0SMasatake YAMATO };
27b1466ae0SMasatake YAMATO
28a09da8e0SMasatake YAMATO static TrashBox* defaultTrashBox;
29*6749a76eSMasatake YAMATO static TrashBox* parserTrashBox;
30a09da8e0SMasatake YAMATO
31b1466ae0SMasatake YAMATO static Trash* trashPut (Trash* trash, void* item,
32b1466ae0SMasatake YAMATO TrashDestroyItemProc destrctor);
33b1466ae0SMasatake YAMATO static Trash* trashTakeBack (Trash* trash, void* item, TrashDestroyItemProc* destrctor);
34b1466ae0SMasatake YAMATO static Trash* trashMakeEmpty (Trash* trash);
35b1466ae0SMasatake YAMATO
trashBoxNew(void)36b1466ae0SMasatake YAMATO extern TrashBox* trashBoxNew (void)
37b1466ae0SMasatake YAMATO {
38b1466ae0SMasatake YAMATO TrashBox *t = xMalloc (1, TrashBox);
39b1466ae0SMasatake YAMATO t->trash = NULL;
40b1466ae0SMasatake YAMATO return t;
41b1466ae0SMasatake YAMATO }
42b1466ae0SMasatake YAMATO
trashBoxStack(TrashBox * trash_box)43b1466ae0SMasatake YAMATO extern TrashBox* trashBoxStack (TrashBox* trash_box)
44b1466ae0SMasatake YAMATO {
45b1466ae0SMasatake YAMATO TrashBox *t = trashBoxNew();
46b1466ae0SMasatake YAMATO
47a09da8e0SMasatake YAMATO if (!trash_box)
48a09da8e0SMasatake YAMATO trash_box = defaultTrashBox;
49a09da8e0SMasatake YAMATO
50b1466ae0SMasatake YAMATO trashBoxPut (trash_box, t, (TrashBoxDestroyItemProc) trashBoxDelete);
51b1466ae0SMasatake YAMATO
52b1466ae0SMasatake YAMATO return t;
53b1466ae0SMasatake YAMATO }
54b1466ae0SMasatake YAMATO
trashBoxDelete(TrashBox * trash_box)55b1466ae0SMasatake YAMATO extern void trashBoxDelete (TrashBox* trash_box)
56b1466ae0SMasatake YAMATO {
57a09da8e0SMasatake YAMATO if (!trash_box)
58a09da8e0SMasatake YAMATO trash_box = defaultTrashBox;
59a09da8e0SMasatake YAMATO
60b1466ae0SMasatake YAMATO trashBoxMakeEmpty(trash_box);
61b1466ae0SMasatake YAMATO
62b1466ae0SMasatake YAMATO eFree (trash_box);
63b1466ae0SMasatake YAMATO }
64b1466ae0SMasatake YAMATO
trashBoxPut(TrashBox * trash_box,void * item,TrashBoxDestroyItemProc destroy)65b1466ae0SMasatake YAMATO extern void* trashBoxPut (TrashBox* trash_box, void* item, TrashBoxDestroyItemProc destroy)
66b1466ae0SMasatake YAMATO {
67a09da8e0SMasatake YAMATO if (!trash_box)
68a09da8e0SMasatake YAMATO trash_box = defaultTrashBox;
69a09da8e0SMasatake YAMATO
70b1466ae0SMasatake YAMATO trash_box->trash = trashPut(trash_box->trash, item, destroy);
71b1466ae0SMasatake YAMATO return item;
72b1466ae0SMasatake YAMATO }
73b1466ae0SMasatake YAMATO
trashBoxTakeBack(TrashBox * trash_box,void * item)74b1466ae0SMasatake YAMATO extern TrashBoxDestroyItemProc trashBoxTakeBack (TrashBox* trash_box, void* item)
75b1466ae0SMasatake YAMATO {
76b1466ae0SMasatake YAMATO TrashBoxDestroyItemProc d;
77b1466ae0SMasatake YAMATO
78a09da8e0SMasatake YAMATO if (!trash_box)
79a09da8e0SMasatake YAMATO trash_box = defaultTrashBox;
80a09da8e0SMasatake YAMATO
81b1466ae0SMasatake YAMATO trash_box->trash = trashTakeBack(trash_box->trash, item, &d);
82b1466ae0SMasatake YAMATO return d;
83b1466ae0SMasatake YAMATO }
84b1466ae0SMasatake YAMATO
trashBoxMakeEmpty(TrashBox * trash_box)85b1466ae0SMasatake YAMATO extern void trashBoxMakeEmpty (TrashBox* trash_box)
86b1466ae0SMasatake YAMATO {
87a09da8e0SMasatake YAMATO if (!trash_box)
88a09da8e0SMasatake YAMATO trash_box = defaultTrashBox;
89a09da8e0SMasatake YAMATO
90b1466ae0SMasatake YAMATO trash_box->trash = trashMakeEmpty (trash_box->trash);
91b1466ae0SMasatake YAMATO }
92b1466ae0SMasatake YAMATO
93b1466ae0SMasatake YAMATO
trashBoxFree(TrashBox * trash_box,void * item)94b1466ae0SMasatake YAMATO extern void trashBoxFree (TrashBox* trash_box, void* item)
95b1466ae0SMasatake YAMATO {
96b1466ae0SMasatake YAMATO TrashBoxDestroyItemProc d;
97b1466ae0SMasatake YAMATO
98a09da8e0SMasatake YAMATO if (!trash_box)
99a09da8e0SMasatake YAMATO trash_box = defaultTrashBox;
100a09da8e0SMasatake YAMATO
101b1466ae0SMasatake YAMATO d = trashBoxTakeBack (trash_box, item);
102b1466ae0SMasatake YAMATO d (item);
103b1466ae0SMasatake YAMATO }
104b1466ae0SMasatake YAMATO
trashPut(Trash * trash,void * item,TrashDestroyItemProc destrctor)105b1466ae0SMasatake YAMATO static Trash* trashPut (Trash* trash, void* item,
106b1466ae0SMasatake YAMATO TrashDestroyItemProc destrctor)
107b1466ae0SMasatake YAMATO {
108b1466ae0SMasatake YAMATO Trash* t = xMalloc (1, Trash);
109b1466ae0SMasatake YAMATO t->next = trash;
110b1466ae0SMasatake YAMATO t->item = item;
111b1466ae0SMasatake YAMATO t->destrctor = destrctor? destrctor: eFree;
112b1466ae0SMasatake YAMATO return t;
113b1466ae0SMasatake YAMATO }
114b1466ae0SMasatake YAMATO
trashTakeBack0(Trash ** trash,void * item)115b1466ae0SMasatake YAMATO static TrashBoxDestroyItemProc trashTakeBack0 (Trash** trash, void* item)
116b1466ae0SMasatake YAMATO {
117b1466ae0SMasatake YAMATO TrashBoxDestroyItemProc removed;
118b1466ae0SMasatake YAMATO Trash* tmp;
119b1466ae0SMasatake YAMATO
120b1466ae0SMasatake YAMATO removed = NULL;
121b1466ae0SMasatake YAMATO while (*trash)
122b1466ae0SMasatake YAMATO {
123b1466ae0SMasatake YAMATO if ( (*trash)->item == item )
124b1466ae0SMasatake YAMATO {
125b1466ae0SMasatake YAMATO tmp = *trash;
126b1466ae0SMasatake YAMATO *trash = (*trash)->next;
127b1466ae0SMasatake YAMATO tmp->next = NULL;
128b1466ae0SMasatake YAMATO tmp->item = NULL;
129b1466ae0SMasatake YAMATO removed = tmp->destrctor;
130b1466ae0SMasatake YAMATO
131b1466ae0SMasatake YAMATO eFree (tmp);
132b1466ae0SMasatake YAMATO tmp = NULL;
133b1466ae0SMasatake YAMATO break;
134b1466ae0SMasatake YAMATO }
135b1466ae0SMasatake YAMATO else
136b1466ae0SMasatake YAMATO trash = &(*trash)->next;
137b1466ae0SMasatake YAMATO }
138b1466ae0SMasatake YAMATO
139b1466ae0SMasatake YAMATO Assert (removed);
140b1466ae0SMasatake YAMATO return removed;
141b1466ae0SMasatake YAMATO }
142b1466ae0SMasatake YAMATO
trashTakeBack(Trash * trash,void * item,TrashDestroyItemProc * destrctor)143b1466ae0SMasatake YAMATO static Trash* trashTakeBack (Trash* trash, void* item, TrashDestroyItemProc *destrctor)
144b1466ae0SMasatake YAMATO {
145b1466ae0SMasatake YAMATO TrashDestroyItemProc d;
146b1466ae0SMasatake YAMATO d = trashTakeBack0 (&trash, item);
147b1466ae0SMasatake YAMATO if (destrctor)
148b1466ae0SMasatake YAMATO *destrctor = d;
149b1466ae0SMasatake YAMATO
150b1466ae0SMasatake YAMATO return trash;
151b1466ae0SMasatake YAMATO }
152b1466ae0SMasatake YAMATO
trashMakeEmpty(Trash * trash)153b1466ae0SMasatake YAMATO static Trash* trashMakeEmpty (Trash* trash)
154b1466ae0SMasatake YAMATO {
155b1466ae0SMasatake YAMATO Trash* tmp;
156b1466ae0SMasatake YAMATO
157b1466ae0SMasatake YAMATO while (trash)
158b1466ae0SMasatake YAMATO {
159b1466ae0SMasatake YAMATO tmp = trash;
160b1466ae0SMasatake YAMATO trash = trash->next;
161b1466ae0SMasatake YAMATO tmp->destrctor (tmp->item);
162b1466ae0SMasatake YAMATO tmp->item = NULL;
163b1466ae0SMasatake YAMATO tmp->destrctor = NULL;
164b1466ae0SMasatake YAMATO eFree (tmp);
165b1466ae0SMasatake YAMATO }
166b1466ae0SMasatake YAMATO return NULL;
167b1466ae0SMasatake YAMATO }
168b1466ae0SMasatake YAMATO
initDefaultTrashBox(void)169a09da8e0SMasatake YAMATO extern void initDefaultTrashBox (void)
170a09da8e0SMasatake YAMATO {
171a09da8e0SMasatake YAMATO defaultTrashBox = trashBoxNew ();
172a09da8e0SMasatake YAMATO }
173a09da8e0SMasatake YAMATO
finiDefaultTrashBox(void)174a09da8e0SMasatake YAMATO extern void finiDefaultTrashBox (void)
175a09da8e0SMasatake YAMATO {
176a09da8e0SMasatake YAMATO trashBoxDelete (defaultTrashBox);
177a09da8e0SMasatake YAMATO defaultTrashBox = NULL;
178a09da8e0SMasatake YAMATO }
179a09da8e0SMasatake YAMATO
initParserTrashBox(void)180*6749a76eSMasatake YAMATO extern void initParserTrashBox (void)
181*6749a76eSMasatake YAMATO {
182*6749a76eSMasatake YAMATO parserTrashBox = trashBoxNew ();
183*6749a76eSMasatake YAMATO }
184*6749a76eSMasatake YAMATO
finiParserTrashBox(void)185*6749a76eSMasatake YAMATO extern void finiParserTrashBox (void)
186*6749a76eSMasatake YAMATO {
187*6749a76eSMasatake YAMATO trashBoxDelete (parserTrashBox);
188*6749a76eSMasatake YAMATO parserTrashBox = NULL;
189*6749a76eSMasatake YAMATO }
190*6749a76eSMasatake YAMATO
parserTrashBoxPut(void * item,TrashBoxDestroyItemProc destroy)191*6749a76eSMasatake YAMATO extern void* parserTrashBoxPut (void* item, TrashBoxDestroyItemProc destroy)
192*6749a76eSMasatake YAMATO {
193*6749a76eSMasatake YAMATO return trashBoxPut(parserTrashBox, item, destroy);
194*6749a76eSMasatake YAMATO }
195*6749a76eSMasatake YAMATO
parserTrashBoxTakeBack(void * item)196*6749a76eSMasatake YAMATO extern TrashBoxDestroyItemProc parserTrashBoxTakeBack (void* item)
197*6749a76eSMasatake YAMATO {
198*6749a76eSMasatake YAMATO return trashBoxTakeBack(parserTrashBox, item);
199*6749a76eSMasatake YAMATO }
200*6749a76eSMasatake YAMATO
201b1466ae0SMasatake YAMATO #ifdef TRASH_TEST
202b1466ae0SMasatake YAMATO #include <stdio.h>
203b1466ae0SMasatake YAMATO
main(void)204b1466ae0SMasatake YAMATO int main (void)
205b1466ae0SMasatake YAMATO {
206b1466ae0SMasatake YAMATO Trash* trash = NULL;
207b1466ae0SMasatake YAMATO Trash* tmp;
208b1466ae0SMasatake YAMATO char* d = eStrdup ("d");
209b1466ae0SMasatake YAMATO char* b = eStrdup ("b");
210b1466ae0SMasatake YAMATO
211b1466ae0SMasatake YAMATO trash = trashPut (trash, eStrdup ("a"));
212b1466ae0SMasatake YAMATO trash = trashPut (trash, b);
213b1466ae0SMasatake YAMATO trash = trashPut (trash, eStrdup ("c"));
214b1466ae0SMasatake YAMATO trash = trashPut (trash, d);
215b1466ae0SMasatake YAMATO
216b1466ae0SMasatake YAMATO trash = trashTakeBack (trash, b, NULL);
217b1466ae0SMasatake YAMATO eFree (b);
218b1466ae0SMasatake YAMATO
219b1466ae0SMasatake YAMATO fputs("expects: dca\nactual: ", stderr);
220b1466ae0SMasatake YAMATO for (tmp = trash; tmp; tmp = tmp->next)
221b1466ae0SMasatake YAMATO fputs(tmp->item, stderr);
222b1466ae0SMasatake YAMATO fputc('\n', stderr);
223b1466ae0SMasatake YAMATO
224b1466ae0SMasatake YAMATO
225b1466ae0SMasatake YAMATO trash = trashTakeBack (trash, d, NULL);
226b1466ae0SMasatake YAMATO eFree (d);
227b1466ae0SMasatake YAMATO
228b1466ae0SMasatake YAMATO fputs("expects: ca\nactual: ", stderr);
229b1466ae0SMasatake YAMATO for (tmp = trash; tmp; tmp = tmp->next)
230b1466ae0SMasatake YAMATO fputs(tmp->item, stderr);
231b1466ae0SMasatake YAMATO fputc('\n', stderr);
232b1466ae0SMasatake YAMATO
233b1466ae0SMasatake YAMATO trash = trashMakeEmpty (trash);
234b1466ae0SMasatake YAMATO
235b1466ae0SMasatake YAMATO fputs("expects: \nactual: ", stderr);
236b1466ae0SMasatake YAMATO for (tmp = trash; tmp; tmp = tmp->next)
237b1466ae0SMasatake YAMATO fputs(tmp->item, stderr);
238b1466ae0SMasatake YAMATO fputc('\n', stderr);
239b1466ae0SMasatake YAMATO return 0;
240b1466ae0SMasatake YAMATO }
241b1466ae0SMasatake YAMATO
242b1466ae0SMasatake YAMATO #include <stdlib.h>
eFree(void * ptr)243b1466ae0SMasatake YAMATO void eFree (void *ptr) { free(ptr); }
eMalloc(const size_t size)244b1466ae0SMasatake YAMATO void *eMalloc (const size_t size) { return malloc(size); }
eStrdup(const char * str)245b1466ae0SMasatake YAMATO char *eStrdup (const char* str) { return strdup(str); }
246b1466ae0SMasatake YAMATO #endif
247