xref: /Universal-ctags/main/trashbox.c (revision 6749a76edeb8c271a44b84a4529395b763b929af)
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