sic

The sic programming language, compiler and tools (WIP)
Log | Files | Refs

array.h (4207B)



#pragma once

#include <stdlib.h>
#include <stdio.h>

#define ARRAY_PUSH(dest, len, cap, item)                                                \
    do {                                                                                \
        size_t arr_newcap, arr_itemsize;                                                \
        void* arr_newptr;                                                               \
        if ((len) >= (cap)) {                                                           \
            arr_newcap = (cap) == 0 ? 256 : (cap) * 2;                                  \
            arr_itemsize = sizeof(*(dest));                                             \
            if (arr_newcap <= (cap) || arr_newcap > SIZE_MAX / arr_itemsize) {          \
                fprintf(stderr, "array: capacity overflow (cap=%zu)\n", (size_t)(cap)); \
                exit(1);                                                                \
            }                                                                           \
                                                                                        \
            arr_newptr = realloc((dest), arr_newcap * arr_itemsize);                    \
            if (!arr_newptr) {                                                          \
                fprintf(stderr, "array: could not reallocate\n");                       \
                exit(1);                                                                \
            }                                                                           \
            (dest) = arr_newptr;                                                        \
            (cap) = arr_newcap;                                                         \
        }                                                                               \
                                                                                        \
        (dest)[(len)++] = (item);                                                       \
    } while (0)

// similar but with the +1 size check and null delimiter at the end!
#define STRING_PUSH(dest, len, cap, item)                                               \
    do {                                                                                \
        size_t arr_newcap, arr_itemsize;                                                \
        void* arr_newptr;                                                               \
        if ((len) + 1 >= (cap)) { /* +1 */                                              \
            arr_newcap = (cap) == 0 ? 256 : (cap) * 2;                                  \
            arr_itemsize = sizeof(*(dest));                                             \
            if (arr_newcap <= (cap) || arr_newcap > SIZE_MAX / arr_itemsize) {          \
                fprintf(stderr, "array: capacity overflow (cap=%zu)\n", (size_t)(cap)); \
                exit(1);                                                                \
            }                                                                           \
                                                                                        \
            arr_newptr = realloc((dest), arr_newcap * arr_itemsize);                    \
            if (!arr_newptr) {                                                          \
                fprintf(stderr, "array: could not reallocate\n");                       \
                exit(1);                                                                \
            }                                                                           \
            (dest) = arr_newptr;                                                        \
            (cap) = arr_newcap;                                                         \
        }                                                                               \
                                                                                        \
        (dest)[(len)++] = (item);                                                       \
        (dest)[(len)] = '\0';                                                           \
    } while (0)