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