#pragma once // ------------------------------------------------------------------------ // Standard library #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // ------------------------------------------------------------------------ // Modern type aliases typedef char byte; typedef unsigned char ubyte; typedef signed char sbyte; typedef long long vlong; typedef unsigned long long uvlong; typedef unsigned int uint; typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32; typedef uint64_t uint64; typedef int8_t int8; typedef int16_t int16; typedef int32_t int32; typedef int64_t int64; typedef float float32; typedef double float64; typedef uintptr_t uintptr; typedef intptr_t intptr; typedef int error; typedef void* Iface; #define nil NULL // ---------------------------------------------------------------------------- // Dynamic array. typedef struct bufHdr { vlong len; vlong cap; byte buf[]; } bufHdr; #define _bufHdr(s) ((bufHdr*)((uint8*)(s)-offsetof(bufHdr, buf))) #define buflen(s) ((s) ? (_bufHdr(s)->len) : 0) #define bufcap(s) ((s) ? (_bufHdr(s)->cap) : 0) #define bufend(s) ((s) + buflen(s)) #define bufsize(s) ((s) ? (buflen(s) * sizeof((s)[0])) : 0) #define buffree(s) ((s) ? (free(_bufHdr(s)), (s) = nil) : 0) #define buffit(s, n) ((n) <= bufcap(s) ? 0 : ((s) = bufgrow((s), (n), sizeof(*(s))))) #define bufresize(s, n) \ do { \ (buffit(s, n)); \ ((_bufHdr(s)->len) = (n)); \ } while (0) #define bufpush(s, ...) (buffit((s), 1 + buflen(s)), (s)[_bufHdr(s)->len++] = (__VA_ARGS__)) #define bufpop(s, i) (_bufpop((s), (i), sizeof(*(s))), (s)[_bufHdr(s)->len]) void* bufgrow(void*, vlong, vlong); void _bufpop(void*, int, vlong); // ----------------------------------------------------------------------------- // Co-routines typedef struct coro coro; coro* coro·new(uintptr stk, uintptr (*func)(coro*, uintptr)); uintptr coro·yield(coro *c, uintptr arg); error coro·free(coro *c); // ----------------------------------------------------------------------------- // Strings #include "str.h" // ----------------------------------------------------------------------------- // Maps or dictionaries #include "map.h" // ------------------------------------------------------------------ // Global macros #ifdef RELEASE #define Assert(x) #else #define Assert(x) assert(x) #endif #define arrlen(Array) (sizeof(Array) / sizeof((Array)[0])) #define MAX(x, y) ((x) >= (y) ? (x) : (y)) #define MIN(x, y) ((x) < (y) ? (x) : (y)) // ----------------------------------------------------------------------------- // Error handling functions. void errorf(const byte* fmt, ...); #define panicf(...) (errorf(__VA_ARGS__), assert(0))