/****************************************************************************** * * Copyright (c) 2017-2019 by Löwenware Ltd * Please, refer LICENSE file for legal information * ******************************************************************************/ /** * @file list.c * @author Ilja Kartašov * @brief cStuff list module * * @see https://lowenware.com/ */ #include #include #include "list.h" CStuffRetcode cstuff_list_init(CStuffList self, int size) { if (!(self->items = calloc(size, sizeof (void *)))) return CSTUFF_MALLOC_ERROR; self->length = 0; self->size = size; return CSTUFF_SUCCESS; } void cstuff_list_release(CStuffList self, CStuffListFree item_free) { if (self->items) { if (item_free) { int i; for (i = 0; i < self->length; i++) { void *ptr = self->items[i]; if (ptr) { item_free(ptr); } } } free(self->items); } } int cstuff_list_append(CStuffList self, void *item) { void **items; int size = self->length + 1; if (size > self->size) { if (!(items = realloc(self->items, size * sizeof (void*)))) return -1; self->items = items; self->size = size; } self->items[self->length] = item; return self->length++; } int cstuff_list_insert(CStuffList self, void *item, int index) { int r; if ((r = cstuff_list_append(self, item)) == -1) return -1; if (index >= r || index < 0) return r; memmove(&self->items[index + 1], &self->items[index], (self->length - index - 1) * sizeof (void*)); self->items[index] = item; return index; } void * cstuff_list_remove(CStuffList self, int index) { void *result; int i; if (index < self->length) { result = self->items[index]; self->length--; for (i = index; i < self->length; i++) { self->items[i] = self->items[i + 1]; } } else { result = NULL; } return result; } void cstuff_list_remove_item(CStuffList self, void *item) { int i; for (i = 0; i < self->length; i++) { if (self->items[i] == item) { cstuff_list_remove(self, i); break; } } } void cstuff_list_set_item(CStuffList self, int index, void *value) { if (self->size > index) { self->items[index] = value; if (index >= self->length) self->length = index + 1; } }