#pragma once #include #include #include #include #include #include #include #include typedef int8_t i8; typedef uint8_t u8; typedef int16_t i16; typedef uint16_t u16; typedef int32_t i32; typedef uint32_t u32; typedef int64_t i64; typedef uint64_t u64; typedef float f32; typedef double f64; typedef u8 bool; #define true 1 #define false 0 typedef const char* cstr; #define __count_args( \ a0, a1, a2, a3, a4, a5, a6, a7 , a8, a9, a10,a11,a12,a13,a14,a15, \ a16,a17,a18,a19,a20,a21,a22,a23, a24,a25,a26,a27,a28,a29,a30,a31, \ a32,a33,a34,a35,a36,a37,a38,a39, a40,a41,a42,a43,a44,a45,a46,a47, \ a48,a49,a50,a51,a52,a53,a54,a55, a56,a57,a58,a59,a60,a61,a62,a63, \ a64,...) a64 // Macro for counting variadic arguments (max 64) // (see usage in kprint.h) #define count_args(ARGS...) __count_args(ARGS, \ 64,63,62,61,60,59,58,57, 56,55,54,53,52,51,50,49, \ 48,47,46,45,44,43,42,41, 40,39,38,37,36,35,34,33, \ 32,31,30,29,28,27,26,25, 24,23,22,21,20,19,18,17, \ 16,15,14,13,12,11,10,9, 8, 7, 6, 5, 4, 3, 2, 1, 0) #define printfe(FORMAT, ...) fprintf(stderr, FORMAT ,##__VA_ARGS__) /// @warning pointer can be null #define NULLABLE(NAME) NAME #define strcat_malloc(STR0, ...) _strcat_malloc(count_args(__VA_ARGS__), STR0, __VA_ARGS__) char* _strcat_malloc(size_t n, cstr str0, ...); char* _vstrcat_malloc(size_t n, cstr str0, va_list argv); char* NULLABLE(sprintf_malloc)(size_t buffer_size, cstr format, ...) __attribute__((__format__(__printf__, 2, 3))); char* NULLABLE(vsprintf_malloc)(size_t buffer_size, cstr format, va_list argv); static inline bool isAlphabeticalLower(char c) { return 'a' <= c && c <= 'z'; } static inline bool isAlphabeticalUpper(char c) { return 'A' <= c && c <= 'Z'; } static inline bool isDigit(char c) { return '0' <= c && c <= '9'; }