cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

list.c (2045B)


      1// This is free and unencumbered software released into the public domain.
      2// For more information, please refer to <https://unlicense.org>
      3// bbbbbr 2020
      4
      5#include <stdio.h>
      6#include <string.h>
      7#include <stdlib.h>
      8#include <stdint.h>
      9
     10#include "common.h"
     11#include "list.h"
     12
     13#define LIST_GROW_SIZE 100 // 50 // grow array by N entries at a time
     14
     15// Initialize the list and it's array
     16// typesize *must* match the type that will be used with the array
     17void list_init(list_type * p_list, size_t array_typesize) {
     18    p_list->typesize = array_typesize;
     19    p_list->count   = 0;
     20    p_list->size    = LIST_GROW_SIZE;
     21    p_list->p_array = (void *)malloc(p_list->size * p_list->typesize);
     22
     23    if (!p_list->p_array) {
     24        printf("makecom: ERROR: Failed to allocate memory for list!\n");
     25        exit(EXIT_FAILURE);
     26    }
     27}
     28
     29
     30// Free the array memory allocated for the list
     31void list_cleanup(list_type * p_list) {
     32    if (p_list->p_array) {
     33        free (p_list->p_array);
     34        p_list->p_array = NULL;
     35    }
     36}
     37
     38
     39// Add a new item to the lists array, resize if needed
     40// p_newitem *must* be the same type the list was initialized with
     41void list_additem(list_type * p_list, void * p_newitem) {
     42
     43    void * tmp_list;
     44
     45    p_list->count++;
     46
     47    // Grow array if needed
     48    if (p_list->count == p_list->size) {
     49        // Save a copy in case reallocation fails
     50        tmp_list = p_list->p_array;
     51
     52        p_list->size += p_list->typesize * LIST_GROW_SIZE;
     53        p_list->p_array = (void *)realloc(p_list->p_array, p_list->size * p_list->typesize);
     54        // If realloc failed, free original buffer before quitting
     55        if (!p_list->p_array) {
     56            printf("makecom: ERROR: Failed to reallocate memory for list!\n");
     57            if (tmp_list) {
     58                free(tmp_list);
     59                tmp_list = NULL;
     60            }
     61            exit(EXIT_FAILURE);
     62        }
     63    }
     64
     65    // Copy new entry
     66    memcpy((uint_least8_t *)p_list->p_array + ((p_list->count - 1) * p_list->typesize),
     67           p_newitem,
     68           p_list->typesize);
     69}
     70