4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
28 /* $Id: list.c 146 2006-03-24 00:26:54Z njacobs $ */
30 #pragma ident "%Z%%M% %I% %E% SMI"
38 static int __list_increment
= 16;
40 #define LIST_SIZE(x) ((((x) / __list_increment) + 1) * __list_increment)
43 list_append(void ***list
, void *item
)
47 if ((list
== NULL
) || (item
== NULL
)) {
54 *list
= (void **)calloc(__list_increment
,
57 for (count
= 0; (*list
)[count
] != NULL
; count
++)
60 if ((count
+ 1) % __list_increment
== 0) { /* expand the list */
61 void **new_list
= NULL
;
62 int new_size
= LIST_SIZE(count
+ 1);
64 new_list
= (void **)calloc(new_size
, sizeof (void *));
68 for (count
= 0; (*list
)[count
] != NULL
; count
++)
69 new_list
[count
] = (*list
)[count
];
74 (*list
)[count
] = item
;
81 * list_concatenate() takes in two NULL terminated lists of items (type **)
82 * and creates a new list with items from list2 appended on the end of
83 * the list of items from list1. The result is a list (type **). If
84 * there is a failure, -1 is returned.
87 list_concatenate(void ***result
, void **list2
)
94 if ((result
== NULL
) || ((*result
== NULL
) && (list2
== NULL
))) {
102 for (size1
= 0; list1
[size1
] != NULL
; size1
++)
105 for (size2
= 0; list2
[size2
] != NULL
; size2
++)
108 /* list1 + list2 padded to a multiple of _list_increment */
109 new_size
= LIST_SIZE(size1
+ size2
);
111 if ((*result
= (void **)calloc((new_size
), sizeof (void *))) != NULL
) {
115 for (size1
= 0; list1
[size1
] != NULL
; size1
++)
116 (*result
)[count
++] = list1
[size1
];
118 for (size2
= 0; list2
[size2
] != NULL
; size2
++)
119 (*result
)[count
++] = list2
[size2
];
127 * list_locate() iterates through the list passed in and uses the comparison
128 * routine and element passed in to find an element in the list. It
129 * returns the first element matched, or NULL if none exists
132 list_locate(void **list
, int (*compare
)(void *, void *), void *element
)
136 if ((list
!= NULL
) && (element
!= NULL
))
137 for (current
= 0; list
[current
] != NULL
; current
++)
138 if ((compare
)(list
[current
], element
) == 0)
139 return (list
[current
]);
144 list_remove(void ***list
, void *item
)
148 if ((list
== NULL
) || (*list
== NULL
) || (item
== NULL
))
151 /* size the original list */
152 for (count
= 0; (*list
)[count
] != NULL
; count
++)
153 if ((*list
)[count
] == item
) { /* mark the location of item */
158 /* if found, remove it */
160 /* shift the list over the item */
161 for (++i
; ((*list
)[i
] != NULL
); i
++)
162 (*list
)[i
-1] = (*list
)[i
];
166 /* if found, removed, and list should shrink, shrink it */
167 if ((item
== NULL
) && (LIST_SIZE(i
) < LIST_SIZE(count
))) {
168 void **tmp
= (void **)calloc(LIST_SIZE(i
), sizeof (void *));
171 for (i
= 0; (*list
)[i
] != NULL
; i
++)