๐ŸŽ€ Toy Gemini Client Written in C99
cli retro gemini gemtext terminal tls lightweight minimal c99 gemini-protocol
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(dynamic_array): implement for future use

Fuwn 47b5504c 41d9ef6d

+301
+34
include/viv/dynamic_array.h
··· 1 + /* http://www.martinbroadhurst.com/dynamic-array-in-c.html */ 2 + 3 + #ifndef VIV_DYNAMIC_ARRAY_H 4 + #define VIV_DYNAMIC_ARRAY_H 5 + 6 + #pragma once 7 + 8 + typedef struct { 9 + void **buffer; 10 + unsigned int size; 11 + unsigned int count; 12 + } VIV_DYNAMIC_ARRAY_dynamic_array; 13 + 14 + typedef void (*VIV_DYNAMIC_ARRAY_for_function)(void *); 15 + 16 + VIV_DYNAMIC_ARRAY_dynamic_array *VIV_DYNAMIC_ARRAY_create(unsigned int); 17 + void VIV_DYNAMIC_ARRAY_empty(VIV_DYNAMIC_ARRAY_dynamic_array *); 18 + void VIV_DYNAMIC_ARRAY_delete(VIV_DYNAMIC_ARRAY_dynamic_array *); 19 + void VIV_DYNAMIC_ARRAY_add_tail(VIV_DYNAMIC_ARRAY_dynamic_array *, void *); 20 + void VIV_DYNAMIC_ARRAY_add_head(VIV_DYNAMIC_ARRAY_dynamic_array *, void *); 21 + void *VIV_DYNAMIC_ARRAY_remove_tail(VIV_DYNAMIC_ARRAY_dynamic_array *); 22 + void *VIV_DYNAMIC_ARRAY_remove_head(VIV_DYNAMIC_ARRAY_dynamic_array *); 23 + void VIV_DYNAMIC_ARRAY_insert(VIV_DYNAMIC_ARRAY_dynamic_array *, unsigned int, void *); 24 + void *VIV_DYNAMIC_ARRAY_remove(VIV_DYNAMIC_ARRAY_dynamic_array *, unsigned int); 25 + void *VIV_DYNAMIC_ARRAY_get(const VIV_DYNAMIC_ARRAY_dynamic_array *, unsigned int); 26 + void *VIV_DYNAMIC_ARRAY_set(VIV_DYNAMIC_ARRAY_dynamic_array *, unsigned int, void *); 27 + void VIV_DYNAMIC_ARRAY_for_each( 28 + const VIV_DYNAMIC_ARRAY_dynamic_array *, 29 + VIV_DYNAMIC_ARRAY_for_function 30 + ); 31 + unsigned int VIV_DYNAMIC_ARRAY_get_count(const VIV_DYNAMIC_ARRAY_dynamic_array *); 32 + void VIV_DYNAMIC_ARRAY_set_size(VIV_DYNAMIC_ARRAY_dynamic_array *, unsigned int); 33 + 34 + #endif /* VIV_DYNAMIC_ARRAY_H */
+1
viv/CMakeLists.txt
··· 1 1 add_executable(${PROJECT_NAME} 2 2 cli.c 3 + dynamic_array.c 3 4 gemini.c 4 5 flag.c 5 6 log.c
+266
viv/dynamic_array.c
··· 1 + /* http://www.martinbroadhurst.com/dynamic-array-in-c.html */ 2 + 3 + #include "viv/dynamic_array.h" 4 + 5 + #include <stdlib.h> 6 + #include <string.h> 7 + 8 + #define START_SIZE 4 /* Initial buffer size if not specified */ 9 + 10 + VIV_DYNAMIC_ARRAY_dynamic_array *VIV_DYNAMIC_ARRAY_create(unsigned int size) { 11 + VIV_DYNAMIC_ARRAY_dynamic_array *array = malloc( 12 + sizeof(VIV_DYNAMIC_ARRAY_dynamic_array) 13 + ); 14 + 15 + if (array != NULL) { 16 + if (size) { 17 + array->buffer = malloc(size * sizeof(void *)); 18 + if (array->buffer) { 19 + array->size = size; 20 + } else { 21 + free(array); 22 + array = NULL; 23 + } 24 + } else { 25 + array->buffer = NULL; 26 + array->size = 0; 27 + } 28 + 29 + array->count = 0; 30 + } 31 + 32 + return array; 33 + } 34 + 35 + void VIV_DYNAMIC_ARRAY_empty(VIV_DYNAMIC_ARRAY_dynamic_array *array) { 36 + array->count = 0; 37 + } 38 + 39 + void VIV_DYNAMIC_ARRAY_delete(VIV_DYNAMIC_ARRAY_dynamic_array *array) { 40 + if (array) { 41 + free(array->buffer); 42 + free(array); 43 + } 44 + } 45 + 46 + void VIV_DYNAMIC_ARRAY_add_tail( 47 + VIV_DYNAMIC_ARRAY_dynamic_array *array, 48 + void *data 49 + ) { 50 + if (array->count == array->size) { 51 + /* No more space */ 52 + if (array->buffer != NULL) { 53 + void **buffer = realloc( 54 + array->buffer, 55 + array->size * 2 * sizeof(void *) 56 + ); 57 + array->buffer = buffer; 58 + array->size *= 2; 59 + } else { 60 + array->buffer = malloc(START_SIZE * sizeof(void *)); 61 + array->size = START_SIZE; 62 + } 63 + } 64 + if (array->buffer != NULL) { 65 + array->buffer[array->count] = data; 66 + array->count++; 67 + } 68 + } 69 + 70 + void VIV_DYNAMIC_ARRAY_add_head( 71 + VIV_DYNAMIC_ARRAY_dynamic_array *array, 72 + void *data 73 + ) { 74 + if (array->count == array->size) { 75 + /* No more space */ 76 + if (array->buffer != NULL) { 77 + void **temp = malloc(array->size * 2 * sizeof(void *)); 78 + if (temp) { 79 + /* Copy the elements one space to the right */ 80 + memcpy(temp + 1, array->buffer, array->count * sizeof(void *)); 81 + free(array->buffer); 82 + array->buffer = temp; 83 + array->size *= 2; 84 + } 85 + } else { 86 + array->buffer = malloc(START_SIZE * sizeof(void *)); 87 + if (array->buffer) { 88 + array->size = START_SIZE; 89 + } 90 + } 91 + } else { 92 + /* Move the elements one space to the right */ 93 + memmove( 94 + array->buffer + 1, 95 + array->buffer, 96 + array->count * sizeof(void *) 97 + ); 98 + } 99 + if (array->buffer != NULL) { 100 + array->buffer[0] = data; 101 + array->count++; 102 + } 103 + } 104 + 105 + void *VIV_DYNAMIC_ARRAY_remove_tail(VIV_DYNAMIC_ARRAY_dynamic_array *array) { 106 + void *data = NULL; 107 + 108 + if (array->count > 0) { 109 + data = array->buffer[array->count - 1]; 110 + array->count--; 111 + } 112 + 113 + return data; 114 + } 115 + 116 + void *VIV_DYNAMIC_ARRAY_remove_head(VIV_DYNAMIC_ARRAY_dynamic_array *array) { 117 + void *data = NULL; 118 + 119 + if (array->count > 0) { 120 + data = array->buffer[0]; 121 + 122 + /* Move the elements one space to the left */ 123 + memmove( 124 + array->buffer, 125 + array->buffer + 1, 126 + (array->count - 1) * sizeof(void *) 127 + ); 128 + 129 + array->count--; 130 + } 131 + 132 + return data; 133 + } 134 + 135 + void VIV_DYNAMIC_ARRAY_insert( 136 + VIV_DYNAMIC_ARRAY_dynamic_array *array, 137 + unsigned int pos, 138 + void *data 139 + ) { 140 + if (pos == 0) { 141 + VIV_DYNAMIC_ARRAY_add_head(array, data); 142 + } else if (pos == array->count) { 143 + VIV_DYNAMIC_ARRAY_add_tail(array, data); 144 + } else if (pos < array->count) { 145 + /* unsigned int i; */ 146 + 147 + if (array->count == array->size) { 148 + /* Reallocate the buffer and copy, leaving a space */ 149 + void **temp = malloc(array->size * 2 * sizeof(void *)); 150 + if (temp) { 151 + memcpy(temp, array->buffer, pos * sizeof(void *)); 152 + memcpy( 153 + temp + pos + 1, 154 + array->buffer + pos, 155 + (array->count - pos) * sizeof(void *) 156 + ); 157 + free(array->buffer); 158 + array->buffer = temp; 159 + array->size *= 2; 160 + } 161 + } else { 162 + /* Move the elements after to the right */ 163 + memmove( 164 + array->buffer + pos + 1, array->buffer + pos, 165 + (array->count - pos) *sizeof(void *) 166 + ); 167 + } 168 + 169 + array->buffer[pos] = data; 170 + array->count++; 171 + } 172 + } 173 + 174 + void *VIV_DYNAMIC_ARRAY_remove( 175 + VIV_DYNAMIC_ARRAY_dynamic_array *array, 176 + unsigned int pos 177 + ) { 178 + void *data; 179 + 180 + if (array->count < pos + 1) { 181 + data = NULL; 182 + } else if (pos == 0) { 183 + data = VIV_DYNAMIC_ARRAY_remove_head(array); 184 + } else if (pos == array->count - 1) { 185 + data = VIV_DYNAMIC_ARRAY_remove_tail(array); 186 + } else { 187 + /* unsigned int i; */ 188 + 189 + data = array->buffer[pos]; 190 + 191 + /* Move the following elements left */ 192 + memmove( 193 + array->buffer + pos, array->buffer + pos + 1, 194 + (array->count - pos - 1) * sizeof(void *) 195 + ); 196 + 197 + array->count--; 198 + } 199 + 200 + return data; 201 + } 202 + 203 + void *VIV_DYNAMIC_ARRAY_get( 204 + const VIV_DYNAMIC_ARRAY_dynamic_array *array, 205 + unsigned int pos 206 + ) { 207 + void *data = NULL; 208 + 209 + if (pos < array->count) { 210 + data = array->buffer[pos]; 211 + } 212 + 213 + return data; 214 + } 215 + 216 + void *VIV_DYNAMIC_ARRAY_set( 217 + VIV_DYNAMIC_ARRAY_dynamic_array *array, 218 + unsigned int pos, 219 + void *data 220 + ) { 221 + void *temp = NULL; 222 + 223 + if (pos == array->count) { 224 + VIV_DYNAMIC_ARRAY_add_tail(array, data); 225 + } else if (pos < array->count) { 226 + temp = array->buffer[pos]; 227 + array->buffer[pos] = data; 228 + } 229 + 230 + return temp; 231 + } 232 + 233 + void VIV_DYNAMIC_ARRAY_set_size( 234 + VIV_DYNAMIC_ARRAY_dynamic_array *array, 235 + unsigned int size 236 + ) { 237 + array->buffer = realloc(array->buffer, size); 238 + 239 + if (array->buffer) { 240 + array->size = size; 241 + 242 + if (array->size < array->count) { 243 + array->count = array->size; 244 + } 245 + } else { 246 + array->size = 0; 247 + array->count = 0; 248 + } 249 + } 250 + 251 + void VIV_DYNAMIC_ARRAY_for_each( 252 + const VIV_DYNAMIC_ARRAY_dynamic_array *array, 253 + VIV_DYNAMIC_ARRAY_for_function function 254 + ) { 255 + unsigned int i; 256 + 257 + for (i = 0; i < array->count; ++i) { 258 + function(array->buffer[i]); 259 + } 260 + } 261 + 262 + unsigned int VIV_DYNAMIC_ARRAY_get_count( 263 + const VIV_DYNAMIC_ARRAY_dynamic_array *array 264 + ) { 265 + return array->count; 266 + }