1 /*
2    Copyright (c) 1991-1999 Thomas T. Wetmore IV
3 
4    Permission is hereby granted, free of charge, to any person
5    obtaining a copy of this software and associated documentation
6    files (the "Software"), to deal in the Software without
7    restriction, including without limitation the rights to use, copy,
8    modify, merge, publish, distribute, sublicense, and/or sell copies
9    of the Software, and to permit persons to whom the Software is
10    furnished to do so, subject to the following conditions:
11 
12    The above copyright notice and this permission notice shall be
13    included in all copies or substantial portions of the Software.
14 
15    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22    SOFTWARE.
23 */
24 /*==============================================================
25  * brwslist.c -- Browse list operations
26  * Copyright (c) 1993-94 by T.T. Wetmore IV; all rights reserved
27  *   3.0.2 - 27 Nov 94
28  *============================================================*/
29 
30 #include "llstdlib.h"
31 #include "table.h"
32 #include "translat.h"
33 #include "gedcom.h"
34 #include "indiseq.h"
35 #include "vtable.h"
36 
37 /*********************************************
38  * global/exported variables
39  *********************************************/
40 
41 INDISEQ current_seq = NULL;
42 
43 /*********************************************
44  * local types
45  *********************************************/
46 
47 struct tag_blel {
48 	struct tag_vtable *vtable; /* generic object */
49 	INT refcnt; /* ref-countable object */
50 	STRING bl_name;
51 	INDISEQ bl_seq;
52 };
53 typedef struct tag_blel *BLEL;
54 
55 /*********************************************
56  * local function prototypes
57  *********************************************/
58 
59 static void blel_destructor(VTABLE *obj);
60 static BLEL create_new_blel(void);
61 /* unused
62 static void destroy_blel(BLEL blel);
63 */
64 
65 /*********************************************
66  * local variables
67  *********************************************/
68 
69 static struct tag_vtable vtable_for_blel = {
70 	VTABLE_MAGIC
71 	, "blel"
72 	, &blel_destructor
73 	, &refcountable_isref
74 	, &refcountable_addref
75 	, &refcountable_release
76 	, 0 /* copy_fnc */
77 	, &generic_get_type_name
78 };
79 static LIST browse_lists=0;
80 
81 /*********************************************
82  * local & exported function definitions
83  * body of module
84  *********************************************/
85 
86 /*=====================================================
87  *  init_browse_lists -- Initialize named browse lists.
88  *===================================================*/
89 void
init_browse_lists(void)90 init_browse_lists (void)
91 {
92 	browse_lists = create_list();
93 }
94 /*===========================================
95  *  create_new_blel -- Create browse list entry
96  *=========================================*/
97 static BLEL
create_new_blel(void)98 create_new_blel (void)
99 {
100 	BLEL blel = (BLEL) stdalloc(sizeof(*blel));
101 	memset(blel, 0, sizeof(*blel));
102 	blel->vtable = &vtable_for_blel;
103 	blel->refcnt = 1;
104 	return blel;
105 }
106 /*===========================================
107  *  add_browse_list -- Add named browse list.
108  *=========================================*/
109 void
add_browse_list(STRING name,INDISEQ seq)110 add_browse_list (STRING name, INDISEQ seq)
111 {
112 	BLEL blel;
113 	BOOLEAN done = FALSE;
114 	if (!name) return;
115 	FORLIST(browse_lists, e)
116 		blel = (BLEL) e;
117 		if (blel->bl_name && eqstr(name, blel->bl_name)) {
118 			remove_indiseq(blel->bl_seq);
119 			blel->bl_seq = seq;
120 			done = TRUE;
121 			STOPLIST
122 			break;
123 		}
124 	ENDLIST
125 	if (done) return;
126 	FORLIST(browse_lists, e)
127 		blel = (BLEL) e;
128 		if (!blel->bl_name) {
129 			blel->bl_name = name;
130 			blel->bl_seq = seq;
131 			STOPLIST
132 			return;
133 		}
134 	ENDLIST
135 	blel = create_new_blel();
136 	blel->bl_name = name;
137 	blel->bl_seq = seq;
138 	enqueue_list(browse_lists, blel);
139 }
140 /*=================================================
141  *  remove_browse_list -- Remove named browse list.
142  *===============================================*/
143 void
remove_browse_list(STRING name,INDISEQ seq)144 remove_browse_list (STRING name,
145                     INDISEQ seq)
146 {
147 	BLEL blel;
148 	remove_indiseq(seq);
149 	if (!name) return;
150 	FORLIST(browse_lists, e)
151 		blel = (BLEL) e;
152 		if (blel->bl_name && eqstr(name, blel->bl_name)) {
153 			blel->bl_name = NULL;
154 			blel->bl_seq = NULL;
155 		}
156 	ENDLIST
157 }
158 /*===========================================
159  * find_named_seq -- Find named browse list.
160  *=========================================*/
161 INDISEQ
find_named_seq(STRING name)162 find_named_seq (STRING name)
163 {
164 	BLEL blel;
165 	FORLIST(browse_lists, e)
166 		blel = (BLEL) e;
167 		if (eqstr(name, blel->bl_name)) {
168 			STOPLIST
169 			return copy_indiseq(blel->bl_seq);
170 		}
171 	ENDLIST
172 	return NULL;
173 }
174 /*===================================================
175  * new_name_browse_list -- Rename named browse list.
176  *=================================================*/
177 void
new_name_browse_list(STRING oldstr,STRING newstr)178 new_name_browse_list (STRING oldstr, STRING newstr)
179 {
180 	BLEL blel;
181 	FORLIST(browse_lists, e)
182 		blel = (BLEL) e;
183 		if (eqstr(oldstr, blel->bl_name)) {
184 			stdfree(blel->bl_name);
185 			blel->bl_name = newstr;
186 			STOPLIST
187 			return;
188 		}
189 	ENDLIST
190 }
191 /*===================================================
192  *  update_browse_list -- Assign name to browse list.
193  *=================================================*/
194 void
update_browse_list(STRING name,INDISEQ seq)195 update_browse_list (STRING name,
196                     INDISEQ seq)
197 {
198 	BLEL blel;
199 	if (!name) {	/* remove anonymous lists */
200 		remove_indiseq(seq);
201 		return;
202 	}
203 	FORLIST(browse_lists, e)
204 		blel = (BLEL) e;
205 		if (eqstr(name, blel->bl_name))
206 			blel->bl_seq = seq;
207 	ENDLIST
208 }
209 /*==============================================================
210  * remove_from_browse_lists -- Remove stale elements from lists.
211  *============================================================*/
212 void
remove_from_browse_lists(STRING key)213 remove_from_browse_lists (STRING key)
214 {
215 	BLEL blel;
216 	INDISEQ seq;
217 	if (current_seq) {
218 		seq = current_seq;
219 		while (delete_indiseq(seq, key, NULL, 0))
220 			;
221 	}
222 	FORLIST(browse_lists, e)
223 		blel = (BLEL) e;
224 		seq = blel->bl_seq;
225 		while (delete_indiseq(seq, key, NULL, 0))
226 			;
227 	ENDLIST
228 }
229 /*================================================================
230  * rename_from_browse_lists -- Re-figures name of possible element
231  *   in browse lists.
232  *==============================================================*/
233 void
rename_from_browse_lists(STRING key)234 rename_from_browse_lists (STRING key)
235 {
236 	INDISEQ seq;
237 	BLEL blel;
238 	if (current_seq) {
239 		seq = current_seq;
240 		rename_indiseq(seq, key);
241 	}
242 	FORLIST(browse_lists, e)
243 		blel = (BLEL) e;
244 		seq = blel->bl_seq;
245 		rename_indiseq(seq, key);
246 	ENDLIST
247 }
248 /*=================================================
249  * blel_destructor -- destructor for blel (browse list element)
250  *  (destructor entry in vtable)
251  *===============================================*/
252 static void
blel_destructor(VTABLE * obj)253 blel_destructor (VTABLE *obj)
254 {
255 	BLEL blel = (BLEL)obj;
256 	ASSERT(blel->vtable == &vtable_for_blel);
257 	stdfree(blel);
258 }
259 /*=================================================
260  * destroy_blel -- destroy and free blel (browse list element)
261  * All blels are destroyed in this function
262  *===============================================*/
263 /* not used
264 static void
265 destroy_blel (BLEL blel)
266 {
267 	stdfree(blel->bl_name);
268 	remove_indiseq(blel->bl_seq);
269 	stdfree(blel);
270 }
271 */
272