gbdk-2020 | GameBoy Development Kit |
| download: https://git.y1.nz/archives/gbdk.tar.gz | |
| README | Files | Log | Refs | LICENSE |
gbdk-support/bankpack/list.c
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 "list.h"
11
12 #define LIST_GROW_SIZE 50 // grow array by N entries at a time
13
14 // Initialize the list and it's array
15 // typesize *must* match the type that will be used with the array
16 void list_init(list_type * p_list, size_t array_typesize) {
17 p_list->typesize = array_typesize;
18 p_list->count = 0;
19 p_list->size = LIST_GROW_SIZE;
20 p_list->p_array = (void *)malloc(p_list->size * p_list->typesize);
21
22 if (!p_list->p_array) {
23 printf("BankPack: ERROR: Failed to allocate memory for list!\n");
24 exit(EXIT_FAILURE);
25 }
26 }
27
28
29 // Free the array memory allocated for the list
30 void list_cleanup(list_type * p_list) {
31 if (p_list->p_array) {
32 free (p_list->p_array);
33 p_list->p_array = NULL;
34 }
35 }
36
37
38 // Add a new item to the lists array, resize if needed
39 // p_newitem *must* be the same type the list was initialized with
40 void list_additem(list_type * p_list, void * p_newitem) {
41
42 void * tmp_list;
43
44 p_list->count++;
45
46 // Grow array if needed
47 if (p_list->count == p_list->size) {
48 // Save a copy in case reallocation fails
49 tmp_list = p_list->p_array;
50
51 p_list->size += LIST_GROW_SIZE;
52 p_list->p_array = (void *)realloc(p_list->p_array, p_list->size * p_list->typesize);
53 // If realloc failed, free original buffer before quitting
54 if (!p_list->p_array) {
55 printf("BankPack: ERROR: Failed to reallocate memory for list!\n");
56 if (tmp_list) free(tmp_list);
57 exit(EXIT_FAILURE);
58 }
59 }
60
61 // Copy new entry
62 memcpy(p_list->p_array + ((p_list->count - 1) * p_list->typesize),
63 p_newitem,
64 p_list->typesize);
65 }
66
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.