#define STR_FMT(buff, str) \ va_list args1; \ va_start(args1, str); \ i32 len = stbsp_vsnprintf(buff, sizeof(buff), str, args1); \ va_end(args1) i32 str_len(char *str) { i32 i = 0; while (str[i]) i += 1; return i; } b32 s8_equal(s8_t a, s8_t b); s8_t s8_from_char(char *string); b32 str_eq(char *a, char *b) { return s8_equal(s8_from_char(a), s8_from_char(b)); } char char_to_lower_case(char a) { if (a >= 'A' && a <= 'Z') a += 32; return a; } char char_to_upper_case(char a) { if (a >= 'a' && a <= 'z') a -= 32; return a; } b32 char_is_whitespace(char w) { b32 result = w == '\n' || w == ' ' || w == '\t' || w == '\v' || w == '\r'; return result; } b32 char_is_alphabetic(char a) { b32 result = (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z'); return result; } b32 char_is_ident(char a) { b32 result = (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') || a == '_'; return result; } b32 char_is_digit(char a) { b32 result = a >= '0' && a <= '9'; return result; } b32 char_is_alphanumeric(char a) { b32 result = char_is_digit(a) || char_is_alphabetic(a); return result; } i64 wstr_len(wchar_t *string) { i64 len = 0; while (*string++ != 0) len++; return len; }