void_list.c
来自「this is the pkg installer for linux」· C语言 代码 · 共 195 行
C
195 行
/* void_list.c - the itsy package management system Carl D. Worth Copyright (C) 2001 University of Southern California This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.*/#include "ipkg.h"#include <errno.h>#include "void_list.h"int void_list_elt_init(void_list_elt_t *elt, void *data){ elt->next = NULL; elt->data = data; return 0;}void void_list_elt_deinit(void_list_elt_t *elt){ void_list_elt_init(elt, NULL);}int void_list_init(void_list_t *list){ void_list_elt_init(&list->pre_head, NULL); list->head = NULL; list->pre_head.next = list->head; list->tail = NULL; return 0;}void void_list_deinit(void_list_t *list){ void_list_elt_t *elt; while (list->head) { elt = void_list_pop(list); void_list_elt_deinit(elt); /* malloced in void_list_append */ free(elt); }}int void_list_append(void_list_t *list, void *data){ void_list_elt_t *elt; /* freed in void_list_deinit */ elt = malloc(sizeof(void_list_elt_t)); if (elt == NULL) { fprintf(stderr, "%s: out of memory\n", __FUNCTION__); return ENOMEM; } void_list_elt_init(elt, data); if (list->tail) { list->tail->next = elt; list->tail = elt; } else { list->head = elt; list->pre_head.next = list->head; list->tail = elt; } return 0;}int void_list_push(void_list_t *list, void *data){ void_list_elt_t *elt; elt = malloc(sizeof(void_list_elt_t)); if (elt == NULL) { fprintf(stderr, "%s: out of memory\n", __FUNCTION__); return ENOMEM; } void_list_elt_init(elt, data); elt->next = list->head; list->head->next = elt; if (list->tail == NULL) { list->tail = list->head; } return 0;}void_list_elt_t *void_list_pop(void_list_t *list){ void_list_elt_t *elt; elt = list->head; if (list->head) { list->head = list->head->next; list->pre_head.next = list->head; if (list->head == NULL) { list->tail = NULL; } } return elt;}void *void_list_remove(void_list_t *list, void_list_elt_t **iter){ void_list_elt_t *prior; void_list_elt_t *old_elt; void *old_data; old_elt = *iter; old_data = old_elt->data; if (old_elt == list->head) { prior = &list->pre_head; void_list_pop(list); } else { for (prior = list->head; prior; prior = prior->next) { if (prior->next == old_elt) { break; } } if (prior == NULL || prior->next != old_elt) { fprintf(stderr, "%s: ERROR: element not found in list\n", __FUNCTION__); return NULL; } prior->next = old_elt->next; if (old_elt == list->tail) { list->tail = prior; } } void_list_elt_deinit(old_elt); *iter = prior; return old_data;}/* remove element containing elt data, using cmp(elt->data, target_data) == 0. */void *void_list_remove_elt(void_list_t *list, const void *target_data, void_list_cmp_t cmp){ void_list_elt_t *prior; void_list_elt_t *old_elt = NULL; void *old_data = NULL; /* first element */ if (list->head && list->head->data && (cmp(list->head->data, target_data) == 0)) { old_elt = list->head; old_data = list->head->data; void_list_pop(list); } else { int found = 0; for (prior = list->head; prior && prior->next; prior = prior->next) { if (prior->next->data && (cmp(prior->next->data, target_data) == 0)) { old_elt = prior->next; old_data = old_elt->data; found = 1; break; } } if (!found) { return NULL; } prior->next = old_elt->next; if (old_elt == list->tail) { list->tail = prior; } } if (old_elt) void_list_elt_deinit(old_elt); if (old_data) return old_data; else return NULL;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?