zig0

my attempts at zig bootstrapping in C
Log | Files | Refs | README | LICENSE

common.h (2994B) - Raw


      1 // common.h — must be included before any system headers.
      2 #ifndef _ZIG0_COMMON_H__
      3 #define _ZIG0_COMMON_H__
      4 
      5 #include <stdint.h>
      6 #include <stdlib.h>
      7 
      8 #define SLICE(Type)                                                           \
      9     struct Type##Slice {                                                      \
     10         uint32_t len;                                                         \
     11         uint32_t cap;                                                         \
     12         Type* arr;                                                            \
     13     }
     14 
     15 #define ARR_INIT(Type, initial_cap)                                           \
     16     ({                                                                        \
     17         Type* arr = calloc(initial_cap, sizeof(Type));                        \
     18         if (!arr)                                                             \
     19             exit(1);                                                          \
     20         arr;                                                                  \
     21     })
     22 
     23 #define SLICE_INIT(Type, initial_cap)                                         \
     24     { .len = 0, .cap = (initial_cap), .arr = ARR_INIT(Type, initial_cap) }
     25 
     26 #define SLICE_RESIZE(Type, slice, new_cap)                                    \
     27     ({                                                                        \
     28         const uint32_t cap = (new_cap);                                       \
     29         Type* new_arr = realloc((slice)->arr, cap * sizeof(Type));            \
     30         if (new_arr == NULL) {                                                \
     31             free((slice)->arr);                                               \
     32             exit(1);                                                          \
     33         }                                                                     \
     34         (slice)->arr = new_arr;                                               \
     35         (slice)->cap = cap;                                                   \
     36     })
     37 
     38 #define SLICE_ENSURE_CAPACITY(Type, slice, additional)                        \
     39     ({                                                                        \
     40         if ((slice)->len + (additional) > (slice)->cap) {                     \
     41             SLICE_RESIZE(Type, slice,                                         \
     42                 ((slice)->cap * 2 > (slice)->len + (additional))              \
     43                     ? (slice)->cap * 2                                        \
     44                     : (slice)->len + (additional));                           \
     45         }                                                                     \
     46     })
     47 
     48 #define SLICE_APPEND(Type, slice, item)                                       \
     49     ({                                                                        \
     50         SLICE_ENSURE_CAPACITY(Type, slice, 1);                                \
     51         (slice)->arr[(slice)->len++] = (item);                                \
     52     })
     53 
     54 #endif