10677dfd1SJulio Merino /* Copyright (c) 2008 The NetBSD Foundation, Inc.
2c243e490SMarcel Moolenaar * All rights reserved.
3c243e490SMarcel Moolenaar *
4c243e490SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without
5c243e490SMarcel Moolenaar * modification, are permitted provided that the following conditions
6c243e490SMarcel Moolenaar * are met:
7c243e490SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright
8c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer.
9c243e490SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright
10c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the
11c243e490SMarcel Moolenaar * documentation and/or other materials provided with the distribution.
12c243e490SMarcel Moolenaar *
13c243e490SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14c243e490SMarcel Moolenaar * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15c243e490SMarcel Moolenaar * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16c243e490SMarcel Moolenaar * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17c243e490SMarcel Moolenaar * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18c243e490SMarcel Moolenaar * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c243e490SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20c243e490SMarcel Moolenaar * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21c243e490SMarcel Moolenaar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22c243e490SMarcel Moolenaar * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23c243e490SMarcel Moolenaar * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
240677dfd1SJulio Merino * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
250677dfd1SJulio Merino
260677dfd1SJulio Merino #include "atf-c/detail/list.h"
27c243e490SMarcel Moolenaar
28c243e490SMarcel Moolenaar #include <stdlib.h>
29c243e490SMarcel Moolenaar #include <string.h>
30c243e490SMarcel Moolenaar
310677dfd1SJulio Merino #include "atf-c/detail/sanity.h"
32c243e490SMarcel Moolenaar #include "atf-c/error.h"
33c243e490SMarcel Moolenaar #include "atf-c/utils.h"
34c243e490SMarcel Moolenaar
35c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
36c243e490SMarcel Moolenaar * Auxiliary functions.
37c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */
38c243e490SMarcel Moolenaar
39c243e490SMarcel Moolenaar struct list_entry {
40c243e490SMarcel Moolenaar struct list_entry *m_prev;
41c243e490SMarcel Moolenaar struct list_entry *m_next;
42c243e490SMarcel Moolenaar void *m_object;
43c243e490SMarcel Moolenaar bool m_managed;
44c243e490SMarcel Moolenaar };
45c243e490SMarcel Moolenaar
46c243e490SMarcel Moolenaar static
47c243e490SMarcel Moolenaar atf_list_citer_t
entry_to_citer(const atf_list_t * l,const struct list_entry * le)48c243e490SMarcel Moolenaar entry_to_citer(const atf_list_t *l, const struct list_entry *le)
49c243e490SMarcel Moolenaar {
50c243e490SMarcel Moolenaar atf_list_citer_t iter;
51c243e490SMarcel Moolenaar iter.m_list = l;
52c243e490SMarcel Moolenaar iter.m_entry = le;
53c243e490SMarcel Moolenaar return iter;
54c243e490SMarcel Moolenaar }
55c243e490SMarcel Moolenaar
56c243e490SMarcel Moolenaar static
57c243e490SMarcel Moolenaar atf_list_iter_t
entry_to_iter(atf_list_t * l,struct list_entry * le)58c243e490SMarcel Moolenaar entry_to_iter(atf_list_t *l, struct list_entry *le)
59c243e490SMarcel Moolenaar {
60c243e490SMarcel Moolenaar atf_list_iter_t iter;
61c243e490SMarcel Moolenaar iter.m_list = l;
62c243e490SMarcel Moolenaar iter.m_entry = le;
63c243e490SMarcel Moolenaar return iter;
64c243e490SMarcel Moolenaar }
65c243e490SMarcel Moolenaar
66c243e490SMarcel Moolenaar static
67c243e490SMarcel Moolenaar struct list_entry *
new_entry(void * object,bool managed)68c243e490SMarcel Moolenaar new_entry(void *object, bool managed)
69c243e490SMarcel Moolenaar {
70c243e490SMarcel Moolenaar struct list_entry *le;
71c243e490SMarcel Moolenaar
72c243e490SMarcel Moolenaar le = (struct list_entry *)malloc(sizeof(*le));
73c243e490SMarcel Moolenaar if (le != NULL) {
74c243e490SMarcel Moolenaar le->m_prev = le->m_next = NULL;
75c243e490SMarcel Moolenaar le->m_object = object;
76c243e490SMarcel Moolenaar le->m_managed = managed;
77*c203bd70SAlex Richardson } else if (managed)
78c243e490SMarcel Moolenaar free(object);
79c243e490SMarcel Moolenaar
80c243e490SMarcel Moolenaar return le;
81c243e490SMarcel Moolenaar }
82c243e490SMarcel Moolenaar
83c243e490SMarcel Moolenaar static
84c243e490SMarcel Moolenaar void
delete_entry(struct list_entry * le)85c243e490SMarcel Moolenaar delete_entry(struct list_entry *le)
86c243e490SMarcel Moolenaar {
87c243e490SMarcel Moolenaar if (le->m_managed)
88c243e490SMarcel Moolenaar free(le->m_object);
89c243e490SMarcel Moolenaar
90c243e490SMarcel Moolenaar free(le);
91c243e490SMarcel Moolenaar }
92c243e490SMarcel Moolenaar
93c243e490SMarcel Moolenaar static
94c243e490SMarcel Moolenaar struct list_entry *
new_entry_and_link(void * object,bool managed,struct list_entry * prev,struct list_entry * next)95c243e490SMarcel Moolenaar new_entry_and_link(void *object, bool managed, struct list_entry *prev,
96c243e490SMarcel Moolenaar struct list_entry *next)
97c243e490SMarcel Moolenaar {
98c243e490SMarcel Moolenaar struct list_entry *le;
99c243e490SMarcel Moolenaar
100c243e490SMarcel Moolenaar le = new_entry(object, managed);
101c243e490SMarcel Moolenaar if (le != NULL) {
102c243e490SMarcel Moolenaar le->m_prev = prev;
103c243e490SMarcel Moolenaar le->m_next = next;
104c243e490SMarcel Moolenaar
105c243e490SMarcel Moolenaar prev->m_next = le;
106c243e490SMarcel Moolenaar next->m_prev = le;
107c243e490SMarcel Moolenaar }
108c243e490SMarcel Moolenaar
109c243e490SMarcel Moolenaar return le;
110c243e490SMarcel Moolenaar }
111c243e490SMarcel Moolenaar
112c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
113c243e490SMarcel Moolenaar * The "atf_list_citer" type.
114c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */
115c243e490SMarcel Moolenaar
116c243e490SMarcel Moolenaar /*
117c243e490SMarcel Moolenaar * Getters.
118c243e490SMarcel Moolenaar */
119c243e490SMarcel Moolenaar
120c243e490SMarcel Moolenaar const void *
atf_list_citer_data(const atf_list_citer_t citer)121c243e490SMarcel Moolenaar atf_list_citer_data(const atf_list_citer_t citer)
122c243e490SMarcel Moolenaar {
123c243e490SMarcel Moolenaar const struct list_entry *le = citer.m_entry;
124c243e490SMarcel Moolenaar PRE(le != NULL);
125c243e490SMarcel Moolenaar return le->m_object;
126c243e490SMarcel Moolenaar }
127c243e490SMarcel Moolenaar
128c243e490SMarcel Moolenaar atf_list_citer_t
atf_list_citer_next(const atf_list_citer_t citer)129c243e490SMarcel Moolenaar atf_list_citer_next(const atf_list_citer_t citer)
130c243e490SMarcel Moolenaar {
131c243e490SMarcel Moolenaar const struct list_entry *le = citer.m_entry;
132c243e490SMarcel Moolenaar atf_list_citer_t newciter;
133c243e490SMarcel Moolenaar
134c243e490SMarcel Moolenaar PRE(le != NULL);
135c243e490SMarcel Moolenaar
136c243e490SMarcel Moolenaar newciter = citer;
137c243e490SMarcel Moolenaar newciter.m_entry = le->m_next;
138c243e490SMarcel Moolenaar
139c243e490SMarcel Moolenaar return newciter;
140c243e490SMarcel Moolenaar }
141c243e490SMarcel Moolenaar
142c243e490SMarcel Moolenaar bool
atf_equal_list_citer_list_citer(const atf_list_citer_t i1,const atf_list_citer_t i2)143c243e490SMarcel Moolenaar atf_equal_list_citer_list_citer(const atf_list_citer_t i1,
144c243e490SMarcel Moolenaar const atf_list_citer_t i2)
145c243e490SMarcel Moolenaar {
146c243e490SMarcel Moolenaar return i1.m_list == i2.m_list && i1.m_entry == i2.m_entry;
147c243e490SMarcel Moolenaar }
148c243e490SMarcel Moolenaar
149c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
150c243e490SMarcel Moolenaar * The "atf_list_iter" type.
151c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */
152c243e490SMarcel Moolenaar
153c243e490SMarcel Moolenaar /*
154c243e490SMarcel Moolenaar * Getters.
155c243e490SMarcel Moolenaar */
156c243e490SMarcel Moolenaar
157c243e490SMarcel Moolenaar void *
atf_list_iter_data(const atf_list_iter_t iter)158c243e490SMarcel Moolenaar atf_list_iter_data(const atf_list_iter_t iter)
159c243e490SMarcel Moolenaar {
160c243e490SMarcel Moolenaar const struct list_entry *le = iter.m_entry;
161c243e490SMarcel Moolenaar PRE(le != NULL);
162c243e490SMarcel Moolenaar return le->m_object;
163c243e490SMarcel Moolenaar }
164c243e490SMarcel Moolenaar
165c243e490SMarcel Moolenaar atf_list_iter_t
atf_list_iter_next(const atf_list_iter_t iter)166c243e490SMarcel Moolenaar atf_list_iter_next(const atf_list_iter_t iter)
167c243e490SMarcel Moolenaar {
168c243e490SMarcel Moolenaar const struct list_entry *le = iter.m_entry;
169c243e490SMarcel Moolenaar atf_list_iter_t newiter;
170c243e490SMarcel Moolenaar
171c243e490SMarcel Moolenaar PRE(le != NULL);
172c243e490SMarcel Moolenaar
173c243e490SMarcel Moolenaar newiter = iter;
174c243e490SMarcel Moolenaar newiter.m_entry = le->m_next;
175c243e490SMarcel Moolenaar
176c243e490SMarcel Moolenaar return newiter;
177c243e490SMarcel Moolenaar }
178c243e490SMarcel Moolenaar
179c243e490SMarcel Moolenaar bool
atf_equal_list_iter_list_iter(const atf_list_iter_t i1,const atf_list_iter_t i2)180c243e490SMarcel Moolenaar atf_equal_list_iter_list_iter(const atf_list_iter_t i1,
181c243e490SMarcel Moolenaar const atf_list_iter_t i2)
182c243e490SMarcel Moolenaar {
183c243e490SMarcel Moolenaar return i1.m_list == i2.m_list && i1.m_entry == i2.m_entry;
184c243e490SMarcel Moolenaar }
185c243e490SMarcel Moolenaar
186c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
187c243e490SMarcel Moolenaar * The "atf_list" type.
188c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */
189c243e490SMarcel Moolenaar
190c243e490SMarcel Moolenaar /*
191c243e490SMarcel Moolenaar * Constructors and destructors.
192c243e490SMarcel Moolenaar */
193c243e490SMarcel Moolenaar
194c243e490SMarcel Moolenaar atf_error_t
atf_list_init(atf_list_t * l)195c243e490SMarcel Moolenaar atf_list_init(atf_list_t *l)
196c243e490SMarcel Moolenaar {
197c243e490SMarcel Moolenaar struct list_entry *lebeg, *leend;
198c243e490SMarcel Moolenaar
199c243e490SMarcel Moolenaar lebeg = new_entry(NULL, false);
200c243e490SMarcel Moolenaar if (lebeg == NULL) {
201c243e490SMarcel Moolenaar return atf_no_memory_error();
202c243e490SMarcel Moolenaar }
203c243e490SMarcel Moolenaar
204c243e490SMarcel Moolenaar leend = new_entry(NULL, false);
205c243e490SMarcel Moolenaar if (leend == NULL) {
206c243e490SMarcel Moolenaar free(lebeg);
207c243e490SMarcel Moolenaar return atf_no_memory_error();
208c243e490SMarcel Moolenaar }
209c243e490SMarcel Moolenaar
210c243e490SMarcel Moolenaar lebeg->m_next = leend;
211c243e490SMarcel Moolenaar lebeg->m_prev = NULL;
212c243e490SMarcel Moolenaar
213c243e490SMarcel Moolenaar leend->m_next = NULL;
214c243e490SMarcel Moolenaar leend->m_prev = lebeg;
215c243e490SMarcel Moolenaar
216c243e490SMarcel Moolenaar l->m_size = 0;
217c243e490SMarcel Moolenaar l->m_begin = lebeg;
218c243e490SMarcel Moolenaar l->m_end = leend;
219c243e490SMarcel Moolenaar
220c243e490SMarcel Moolenaar return atf_no_error();
221c243e490SMarcel Moolenaar }
222c243e490SMarcel Moolenaar
223c243e490SMarcel Moolenaar void
atf_list_fini(atf_list_t * l)224c243e490SMarcel Moolenaar atf_list_fini(atf_list_t *l)
225c243e490SMarcel Moolenaar {
226c243e490SMarcel Moolenaar struct list_entry *le;
227c243e490SMarcel Moolenaar size_t freed;
228c243e490SMarcel Moolenaar
229c243e490SMarcel Moolenaar le = (struct list_entry *)l->m_begin;
230c243e490SMarcel Moolenaar freed = 0;
231c243e490SMarcel Moolenaar while (le != NULL) {
232c243e490SMarcel Moolenaar struct list_entry *lenext;
233c243e490SMarcel Moolenaar
234c243e490SMarcel Moolenaar lenext = le->m_next;
235c243e490SMarcel Moolenaar delete_entry(le);
236c243e490SMarcel Moolenaar le = lenext;
237c243e490SMarcel Moolenaar
238c243e490SMarcel Moolenaar freed++;
239c243e490SMarcel Moolenaar }
240c243e490SMarcel Moolenaar INV(freed == l->m_size + 2);
241c243e490SMarcel Moolenaar }
242c243e490SMarcel Moolenaar
243c243e490SMarcel Moolenaar /*
244c243e490SMarcel Moolenaar * Getters.
245c243e490SMarcel Moolenaar */
246c243e490SMarcel Moolenaar
247c243e490SMarcel Moolenaar atf_list_iter_t
atf_list_begin(atf_list_t * l)248c243e490SMarcel Moolenaar atf_list_begin(atf_list_t *l)
249c243e490SMarcel Moolenaar {
250c243e490SMarcel Moolenaar struct list_entry *le = l->m_begin;
251c243e490SMarcel Moolenaar return entry_to_iter(l, le->m_next);
252c243e490SMarcel Moolenaar }
253c243e490SMarcel Moolenaar
254c243e490SMarcel Moolenaar atf_list_citer_t
atf_list_begin_c(const atf_list_t * l)255c243e490SMarcel Moolenaar atf_list_begin_c(const atf_list_t *l)
256c243e490SMarcel Moolenaar {
257c243e490SMarcel Moolenaar const struct list_entry *le = l->m_begin;
258c243e490SMarcel Moolenaar return entry_to_citer(l, le->m_next);
259c243e490SMarcel Moolenaar }
260c243e490SMarcel Moolenaar
261c243e490SMarcel Moolenaar atf_list_iter_t
atf_list_end(atf_list_t * l)262c243e490SMarcel Moolenaar atf_list_end(atf_list_t *l)
263c243e490SMarcel Moolenaar {
264c243e490SMarcel Moolenaar return entry_to_iter(l, l->m_end);
265c243e490SMarcel Moolenaar }
266c243e490SMarcel Moolenaar
267c243e490SMarcel Moolenaar atf_list_citer_t
atf_list_end_c(const atf_list_t * l)268c243e490SMarcel Moolenaar atf_list_end_c(const atf_list_t *l)
269c243e490SMarcel Moolenaar {
270c243e490SMarcel Moolenaar return entry_to_citer(l, l->m_end);
271c243e490SMarcel Moolenaar }
272c243e490SMarcel Moolenaar
273c243e490SMarcel Moolenaar void *
atf_list_index(atf_list_t * list,const size_t idx)274c243e490SMarcel Moolenaar atf_list_index(atf_list_t *list, const size_t idx)
275c243e490SMarcel Moolenaar {
276c243e490SMarcel Moolenaar atf_list_iter_t iter;
277c243e490SMarcel Moolenaar
278c243e490SMarcel Moolenaar PRE(idx < atf_list_size(list));
279c243e490SMarcel Moolenaar
280c243e490SMarcel Moolenaar iter = atf_list_begin(list);
281c243e490SMarcel Moolenaar {
282c243e490SMarcel Moolenaar size_t pos = 0;
283c243e490SMarcel Moolenaar while (pos < idx &&
284c243e490SMarcel Moolenaar !atf_equal_list_iter_list_iter((iter), atf_list_end(list))) {
285c243e490SMarcel Moolenaar iter = atf_list_iter_next(iter);
286c243e490SMarcel Moolenaar pos++;
287c243e490SMarcel Moolenaar }
288c243e490SMarcel Moolenaar }
289c243e490SMarcel Moolenaar return atf_list_iter_data(iter);
290c243e490SMarcel Moolenaar }
291c243e490SMarcel Moolenaar
292c243e490SMarcel Moolenaar const void *
atf_list_index_c(const atf_list_t * list,const size_t idx)293c243e490SMarcel Moolenaar atf_list_index_c(const atf_list_t *list, const size_t idx)
294c243e490SMarcel Moolenaar {
295c243e490SMarcel Moolenaar atf_list_citer_t iter;
296c243e490SMarcel Moolenaar
297c243e490SMarcel Moolenaar PRE(idx < atf_list_size(list));
298c243e490SMarcel Moolenaar
299c243e490SMarcel Moolenaar iter = atf_list_begin_c(list);
300c243e490SMarcel Moolenaar {
301c243e490SMarcel Moolenaar size_t pos = 0;
302c243e490SMarcel Moolenaar while (pos < idx &&
303c243e490SMarcel Moolenaar !atf_equal_list_citer_list_citer((iter),
304c243e490SMarcel Moolenaar atf_list_end_c(list))) {
305c243e490SMarcel Moolenaar iter = atf_list_citer_next(iter);
306c243e490SMarcel Moolenaar pos++;
307c243e490SMarcel Moolenaar }
308c243e490SMarcel Moolenaar }
309c243e490SMarcel Moolenaar return atf_list_citer_data(iter);
310c243e490SMarcel Moolenaar }
311c243e490SMarcel Moolenaar
312c243e490SMarcel Moolenaar size_t
atf_list_size(const atf_list_t * l)313c243e490SMarcel Moolenaar atf_list_size(const atf_list_t *l)
314c243e490SMarcel Moolenaar {
315c243e490SMarcel Moolenaar return l->m_size;
316c243e490SMarcel Moolenaar }
317c243e490SMarcel Moolenaar
318c243e490SMarcel Moolenaar char **
atf_list_to_charpp(const atf_list_t * l)319c243e490SMarcel Moolenaar atf_list_to_charpp(const atf_list_t *l)
320c243e490SMarcel Moolenaar {
321c243e490SMarcel Moolenaar char **array;
322c243e490SMarcel Moolenaar atf_list_citer_t iter;
323c243e490SMarcel Moolenaar size_t i;
324c243e490SMarcel Moolenaar
325c243e490SMarcel Moolenaar array = malloc(sizeof(char *) * (atf_list_size(l) + 1));
326c243e490SMarcel Moolenaar if (array == NULL)
327c243e490SMarcel Moolenaar goto out;
328c243e490SMarcel Moolenaar
329c243e490SMarcel Moolenaar i = 0;
330c243e490SMarcel Moolenaar atf_list_for_each_c(iter, l) {
331c243e490SMarcel Moolenaar array[i] = strdup((const char *)atf_list_citer_data(iter));
332c243e490SMarcel Moolenaar if (array[i] == NULL) {
333c243e490SMarcel Moolenaar atf_utils_free_charpp(array);
334c243e490SMarcel Moolenaar array = NULL;
335c243e490SMarcel Moolenaar goto out;
336c243e490SMarcel Moolenaar }
337c243e490SMarcel Moolenaar
338c243e490SMarcel Moolenaar i++;
339c243e490SMarcel Moolenaar }
340c243e490SMarcel Moolenaar array[i] = NULL;
341c243e490SMarcel Moolenaar
342c243e490SMarcel Moolenaar out:
343c243e490SMarcel Moolenaar return array;
344c243e490SMarcel Moolenaar }
345c243e490SMarcel Moolenaar
346c243e490SMarcel Moolenaar /*
347c243e490SMarcel Moolenaar * Modifiers.
348c243e490SMarcel Moolenaar */
349c243e490SMarcel Moolenaar
350c243e490SMarcel Moolenaar atf_error_t
atf_list_append(atf_list_t * l,void * data,bool managed)351c243e490SMarcel Moolenaar atf_list_append(atf_list_t *l, void *data, bool managed)
352c243e490SMarcel Moolenaar {
353c243e490SMarcel Moolenaar struct list_entry *le, *next, *prev;
354c243e490SMarcel Moolenaar atf_error_t err;
355c243e490SMarcel Moolenaar
356c243e490SMarcel Moolenaar next = (struct list_entry *)l->m_end;
357c243e490SMarcel Moolenaar prev = next->m_prev;
358c243e490SMarcel Moolenaar le = new_entry_and_link(data, managed, prev, next);
359c243e490SMarcel Moolenaar if (le == NULL)
360c243e490SMarcel Moolenaar err = atf_no_memory_error();
361c243e490SMarcel Moolenaar else {
362c243e490SMarcel Moolenaar l->m_size++;
363c243e490SMarcel Moolenaar err = atf_no_error();
364c243e490SMarcel Moolenaar }
365c243e490SMarcel Moolenaar
366c243e490SMarcel Moolenaar return err;
367c243e490SMarcel Moolenaar }
368c243e490SMarcel Moolenaar
369c243e490SMarcel Moolenaar void
atf_list_append_list(atf_list_t * l,atf_list_t * src)370c243e490SMarcel Moolenaar atf_list_append_list(atf_list_t *l, atf_list_t *src)
371c243e490SMarcel Moolenaar {
372c243e490SMarcel Moolenaar struct list_entry *e1, *e2, *ghost1, *ghost2;
373c243e490SMarcel Moolenaar
374c243e490SMarcel Moolenaar ghost1 = (struct list_entry *)l->m_end;
375c243e490SMarcel Moolenaar ghost2 = (struct list_entry *)src->m_begin;
376c243e490SMarcel Moolenaar
377c243e490SMarcel Moolenaar e1 = ghost1->m_prev;
378c243e490SMarcel Moolenaar e2 = ghost2->m_next;
379c243e490SMarcel Moolenaar
380c243e490SMarcel Moolenaar delete_entry(ghost1);
381c243e490SMarcel Moolenaar delete_entry(ghost2);
382c243e490SMarcel Moolenaar
383c243e490SMarcel Moolenaar e1->m_next = e2;
384c243e490SMarcel Moolenaar e2->m_prev = e1;
385c243e490SMarcel Moolenaar
386c243e490SMarcel Moolenaar l->m_end = src->m_end;
387c243e490SMarcel Moolenaar l->m_size += src->m_size;
388c243e490SMarcel Moolenaar }
389