1 /*
2  *  alpm_list.h
3  *
4  *  Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
5  *  Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20 #ifndef ALPM_LIST_H
21 #define ALPM_LIST_H
22 
23 #include <stdlib.h> /* size_t */
24 
25 /* Note: alpm_list.{c,h} are intended to be standalone files. Do not include
26  * any other libalpm headers.
27  */
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 /**
34  * @brief Linked list type used by libalpm.
35  *
36  * It is exposed so front ends can use it to prevent the need to reimplement
37  * lists of their own; however, it is not required that the front end uses
38  * it.
39  */
40 typedef struct __alpm_list_t {
41 	/** data held by the list node */
42 	void *data;
43 	/** pointer to the previous node */
44 	struct __alpm_list_t *prev;
45 	/** pointer to the next node */
46 	struct __alpm_list_t *next;
47 } alpm_list_t;
48 
49 #define FREELIST(p) do { alpm_list_free_inner(p, free); alpm_list_free(p); p = NULL; } while(0)
50 
51 typedef void (*alpm_list_fn_free)(void *); /* item deallocation callback */
52 typedef int (*alpm_list_fn_cmp)(const void *, const void *); /* item comparison callback */
53 
54 /* allocation */
55 void alpm_list_free(alpm_list_t *list);
56 void alpm_list_free_inner(alpm_list_t *list, alpm_list_fn_free fn);
57 
58 /* item mutators */
59 alpm_list_t *alpm_list_add(alpm_list_t *list, void *data);
60 alpm_list_t *alpm_list_append(alpm_list_t **list, void *data);
61 alpm_list_t *alpm_list_append_strdup(alpm_list_t **list, const char *data);
62 alpm_list_t *alpm_list_add_sorted(alpm_list_t *list, void *data, alpm_list_fn_cmp fn);
63 alpm_list_t *alpm_list_join(alpm_list_t *first, alpm_list_t *second);
64 alpm_list_t *alpm_list_mmerge(alpm_list_t *left, alpm_list_t *right, alpm_list_fn_cmp fn);
65 alpm_list_t *alpm_list_msort(alpm_list_t *list, size_t n, alpm_list_fn_cmp fn);
66 alpm_list_t *alpm_list_remove_item(alpm_list_t *haystack, alpm_list_t *item);
67 alpm_list_t *alpm_list_remove(alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn, void **data);
68 alpm_list_t *alpm_list_remove_str(alpm_list_t *haystack, const char *needle, char **data);
69 alpm_list_t *alpm_list_remove_dupes(const alpm_list_t *list);
70 alpm_list_t *alpm_list_strdup(const alpm_list_t *list);
71 alpm_list_t *alpm_list_copy(const alpm_list_t *list);
72 alpm_list_t *alpm_list_copy_data(const alpm_list_t *list, size_t size);
73 alpm_list_t *alpm_list_reverse(alpm_list_t *list);
74 
75 /* item accessors */
76 alpm_list_t *alpm_list_nth(const alpm_list_t *list, size_t n);
77 alpm_list_t *alpm_list_next(const alpm_list_t *list);
78 alpm_list_t *alpm_list_previous(const alpm_list_t *list);
79 alpm_list_t *alpm_list_last(const alpm_list_t *list);
80 
81 /* misc */
82 size_t alpm_list_count(const alpm_list_t *list);
83 void *alpm_list_find(const alpm_list_t *haystack, const void *needle, alpm_list_fn_cmp fn);
84 void *alpm_list_find_ptr(const alpm_list_t *haystack, const void *needle);
85 char *alpm_list_find_str(const alpm_list_t *haystack, const char *needle);
86 alpm_list_t *alpm_list_diff(const alpm_list_t *lhs, const alpm_list_t *rhs, alpm_list_fn_cmp fn);
87 void alpm_list_diff_sorted(const alpm_list_t *left, const alpm_list_t *right,
88 		alpm_list_fn_cmp fn, alpm_list_t **onlyleft, alpm_list_t **onlyright);
89 void *alpm_list_to_array(const alpm_list_t *list, size_t n, size_t size);
90 
91 #ifdef __cplusplus
92 }
93 #endif
94 #endif /* ALPM_LIST_H */
95