#ifndef __USER_LIBS_ULIB_H__ #define __USER_LIBS_ULIB_H__ #include void __warn(const char *file, int line, const char *fmt, ...); void __noreturn __panic(const char *file, int line, const char *fmt, ...); #define warn(...) \ __warn(__FILE__, __LINE__, __VA_ARGS__) #define panic(...) \ __panic(__FILE__, __LINE__, __VA_ARGS__) #define assert(x) \ do { \ if (!(x)) { \ panic("assertion failed: %s", #x); \ } \ } while (0) // static_assert(x) will generate a compile-time error if 'x' is false. #define static_assert(x) \ switch (x) { case 0: case (x): ; } int fprintf(int fd, const char *fmt, ...); void __noreturn exit(int error_code); int fork(void); int wait(void); int waitpid(int pid, int *store); void yield(void); int kill(int pid); int getpid(void); void print_pgdir(void); int sleep(unsigned int time); unsigned int gettime_msec(void); int __exec(const char *name, const char **argv); #define __exec0(name, path, ...) \ ({ const char *argv[] = {path, ##__VA_ARGS__, NULL}; __exec(name, argv); }) #define exec(path, ...) __exec0(NULL, path, ##__VA_ARGS__) #define nexec(name, path, ...) __exec0(name, path, ##__VA_ARGS__) void lab6_set_priority(uint32_t priority); //only for lab6 #endif /* !__USER_LIBS_ULIB_H__ */