#ifndef LOG_H #define LOG_H #include #include #define ARR_SIZE(a) (sizeof(a)/sizeof(*(a))) #define __RED__ "\033[0;31m" #define __GREEN__ "\033[0;32m" #define __YELLOW__ "\033[0;33m" #define __RESET__ "\033[0m" #define STR(x) #x #define XSTR(x) STR(x) #define info(...) do { fprintf(stdout, __GREEN__"[INFO]"__RESET__" "__VA_ARGS__); fprintf(stdout, "\n"); } while(0) #define err(...) do { fprintf(stderr, __RED__"[ERROR]"__RESET__" "__FILE__":"XSTR(__LINE__)": "__VA_ARGS__); fprintf(stderr, "\n"); } while(0) #define warn(...) do { fprintf(stderr, __YELLOW__"[WARN]"__RESET__" "__FILE__":"XSTR(__LINE__)": "__VA_ARGS__); fprintf(stderr, "\n"); } while(0) #define die(...) do { \ err(__VA_ARGS__); \ abort(); \ } while(0) void *xmalloc(size_t size); void *xcalloc(size_t nmemb, size_t size); void *xrealloc(void *ptr, size_t size); #define F_LOAD_FILE_ALIGNED(T) \ static int load_file_##T##_aligned( \ char *path, size_t *size, u32 *buf) \ { \ int ret = 1; \ \ FILE *fp = fopen(path, "rb"); \ if(!fp) { \ err("fopen: %s: %s", path, strerror(errno)); \ return 1; \ } \ \ fseek(fp, 0, SEEK_END); \ *size = (size_t)ftell(fp); \ *size += (*size % sizeof(u32)); \ \ if(buf == NULL) { \ ret = 0; \ goto exit; \ } \ \ fseek(fp, 0, SEEK_SET); \ fread(buf, sizeof(u32), *size/sizeof(u32), fp); \ \ ret = 0; \ exit: \ fclose(fp); \ return ret; \ } #endif