15 typedef struct girara_tree_node_data_s
37 girara_list_t* list = g_malloc0(
sizeof(girara_list_t));
81 g_return_if_fail(list);
88 if (list == NULL || list->start == NULL) {
93 #if (GLIB_MAJOR_VERSION >= 2) && (GLIB_MINOR_VERSION >= 28)
94 g_list_free_full(list->start, list->free);
96 g_list_foreach(list->start, (GFunc)list->free, NULL);
97 g_list_free(list->start);
100 g_list_free(list->start);
119 g_return_if_fail(list);
122 list->start = g_list_insert_sorted(list->start, data, list->cmp);
124 list->start = g_list_append(list->start, data);
131 g_return_if_fail(list);
136 list->start = g_list_prepend(list->start, data);
143 g_return_if_fail(list);
148 GList* tmp = g_list_find(list->start, data);
154 (list->free)(tmp->data);
156 list->start = g_list_delete_link(list->start, tmp);
162 g_return_val_if_fail(list, NULL);
163 g_return_val_if_fail(!list->start || (n < g_list_length(list->start)), NULL);
165 GList* tmp = g_list_nth(list->start, n);
166 g_return_val_if_fail(tmp, NULL);
174 g_return_val_if_fail(list,
false);
179 GList* tmp = g_list_find(list->start, data);
191 g_return_val_if_fail(list && compare, NULL);
192 if (list->start == NULL) {
196 GList* element = g_list_find_custom(list->start, data, compare);
197 if (element == NULL) {
201 return element->data;
205 girara_list_iterator_t*
208 g_return_val_if_fail(list, NULL);
214 girara_list_iterator_t* iter = g_malloc0(
sizeof(girara_list_iterator_t));
216 iter->element = list->start;
221 girara_list_iterator_t*
224 if (!iter || !iter->element) {
228 iter->element = g_list_next(iter->element);
230 if (!iter->element) {
240 return iter && iter->element && g_list_next(iter->element);
246 return iter && iter->element;
252 g_return_val_if_fail(iter && iter->element, NULL);
254 return iter->element->data;
260 g_return_if_fail(iter && iter->element && iter->list && !iter->list->cmp);
262 if (iter->list->free) {
263 (*iter->list->free)(iter->element->data);
266 iter->element->data = data;
282 g_return_val_if_fail(list, 0);
288 return g_list_length(list->start);
294 g_return_val_if_fail(list != NULL, -1);
296 if (list->start == NULL) {
315 g_return_if_fail(list != NULL);
316 if (list->start == NULL || compare == NULL) {
320 list->start = g_list_sort(list->start, compare);
326 g_return_if_fail(list && list->start && callback);
328 g_list_foreach(list->start, callback, data);
341 if (list->free != other->free) {
342 girara_warning(
"girara_list_merge: merging lists with different free functions!");
355 girara_tree_node_t* node = g_malloc0(
sizeof(girara_tree_node_t));
358 nodedata->
data = data;
359 nodedata->
node = node;
360 node->node = g_node_new(nodedata);
374 g_return_if_fail(node);
385 g_return_if_fail(node->node);
387 g_return_if_fail(nodedata);
390 (*node->free)(nodedata->
data);
395 GNode* childnode = node->node->children;
399 childnode = childnode->next;
402 g_node_destroy(node->node);
409 g_return_if_fail(parent && child);
410 g_node_append(parent->node, child->node);
416 g_return_val_if_fail(parent, NULL);
418 g_return_val_if_fail(child, NULL);
419 child->free = parent->free;
428 g_return_val_if_fail(node && node->node, NULL);
430 if (!node->node->parent) {
435 g_return_val_if_fail(nodedata, NULL);
437 return nodedata->
node;
443 g_return_val_if_fail(node && node->node, NULL);
445 if (!node->node->parent) {
449 GNode* root = g_node_get_root(node->node);
450 g_return_val_if_fail(root, NULL);
452 g_return_val_if_fail(nodedata, NULL);
454 return nodedata->
node;
460 g_return_val_if_fail(node, NULL);
462 g_return_val_if_fail(list, NULL);
464 GNode* childnode = node->node->children;
468 childnode = childnode->next;
477 g_return_val_if_fail(node && node->node, 0);
479 return g_node_n_children(node->node);
485 g_return_val_if_fail(node && node->node, NULL);
487 g_return_val_if_fail(nodedata, NULL);
489 return nodedata->
data;
495 g_return_if_fail(node && node->node);
497 g_return_if_fail(nodedata);
500 (*node->free)(nodedata->
data);
503 nodedata->
data = data;