#pragma once #include "../syscall.h" #include #include void _Noreturn panic(const char *message) { syscall(SYS_switch_to_text, 0); // ??? syscall(SYS_puts, (uintptr_t)message); syscall(SYS_exit, 1); __builtin_unreachable(); } #define check(expr) \ if (!(expr)) { \ panic("Assertion failed at " __FILE__ ": " #expr "\n"); \ } typedef struct { int x, y; } ivec2; void *memcpy(void *dst, const void *src, uint32_t size) { uint8_t *d = (uint8_t *)dst; const uint8_t *s = (const uint8_t *)src; for (uint32_t i = 0; i < size; i++) { d[i] = s[i]; } return dst; } void *memset(void *dst, int value, uint32_t size) { uint8_t *d = (uint8_t *)dst; uint8_t byte = (uint8_t)value; for (uint32_t i = 0; i < size; i++) { d[i] = byte; } return dst; } #define STRING_BUILDER_CAPACITY 150 typedef struct { char buf[STRING_BUILDER_CAPACITY]; int len; } StringBuilder; void StringBuilder_putc(StringBuilder *self, char ch) { if (self->len + 1 > STRING_BUILDER_CAPACITY) { panic("string builder\n"); } self->buf[self->len++] = ch; } void StringBuilder_append_cstr(StringBuilder *self, const char *str) { for (const char *p = str; *p; p++) { StringBuilder_putc(self, *p); } } void StringBuilder_append_u32(StringBuilder *self, uint32_t x) { char b[11]; int len = 0; if (x == 0) { b[len++] = '0'; } else { while (x > 0) { b[len++] = (char)('0' + (x % 10)); x /= 10; } int i = 0, j = len - 1; while (i < j) { char tmp = b[i]; b[i] = b[j]; b[j] = tmp; i++; j--; } } b[len] = 0; StringBuilder_append_cstr(self, b); } const char *StringBuilder_get_cstr(StringBuilder *self) { StringBuilder_putc(self, 0); return self->buf; } uint32_t time_ms(void) { return (uint32_t)syscall(SYS_time_ms, 0); }