1#pragma once 2#include <assert.h> 3#include <stdbool.h> 4#include <stddef.h> 5#include <stdint.h> 6#include <stdio.h> 7#include <stdlib.h> 8#include <string.h> 9 10#define CONCAT(x, y) CONCAT2(x, y) 11#define CONCAT2(x, y) x ## y 12 13#define STRINGIFY(x) STRINGIFY2(x) 14#define STRINGIFY2(x) # x 15 16#define ARRAYLEN(x) (sizeof(x) / sizeof(*x)) 17 18#define TERM_BOLD(x) "\033[1m" x "\033[0m" 19#define TERM_RED(x) "\x1b[31m" x "\x1b[0m" 20#define TERM_GREEN(x) "\x1b[32m" x "\x1b[0m" 21#define TERM_YELLOW(x) "\x1b[33m" x "\x1b[0m" 22#define TERM_BLUE(x) "\x1b[34m" x "\x1b[0m" 23#define TERM_MAGENTA(x) "\x1b[35m" x "\x1b[0m" 24#define TERM_CYAN(x) "\x1b[36m" x "\x1b[0m" 25 26#define LOG(fmt, ...) printf("[%-6lu "__FILE__ ":%s:%d] " fmt "\n", ap_frame, __func__, __LINE__, ## __VA_ARGS__) 27#define LOGB(fmt, ...) LOG(TERM_BOLD(fmt), ## __VA_ARGS__) 28#define DEBUG(...) ({ if(ap_debug){LOG(__VA_ARGS__);} }) 29#define INFO_STRING_SIZE 256 30#define INFO(...) snprintf(ap_info_string, INFO_STRING_SIZE, __VA_ARGS__) 31#define INFO_HEXDUMP(ptr) INFO_HEXDUMP2(((uint8_t *)ptr)) 32#define INFO_HEXDUMP2(p) INFO("%02X %02X %02X %02X.%02X %02X %02X %02X.%02X %02X %02X %02X", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11]); 33 34extern char ap_info_string[]; 35extern bool ap_debug; 36extern uint64_t ap_frame; 37 38#define LL_INIT(list) ({ \ 39 (list)->prev = (list); \ 40 (list)->next = (list); \ 41 (list); }) 42 43#define LL_PUSH(list, node) ({ \ 44 assert((node)->next == (node) && (node)->prev == (node)); \ 45 (node)->prev = (list)->prev; \ 46 (node)->prev->next = (node); \ 47 (node)->next = (list); \ 48 (node)->next->prev = (node); }) 49 50#define LL_PREPEND(list, node) ({ \ 51 assert((node)->next == (node) && (node)->prev == (node)); \ 52 (node)->next = (list)->next; \ 53 (node)->next->prev = (node); \ 54 (node)->prev = (list); \ 55 (node)->prev->next = (node); }) 56 57#define LL_POP(list) ({ \ 58 __auto_type n = (list)->next; \ 59 (list)->next = (list)->next->next; \ 60 (list)->next->prev = (list); \ 61 (n == (list)) ? NULL : LL_INIT(n); }) 62 63#define LL_EXTRACT(node) ({ \ 64 (node)->prev->next = (node)->next; \ 65 (node)->next->prev = (node)->prev; \ 66 LL_INIT(node); \ 67 }) 68 69#define LL_PEEK(list) ({ \ 70 (list)->next == (list) ? NULL : (list)->next; }) 71 72enum rc { 73 RC_FAIL = -1, 74 RC_DONE = 0, 75 RC_INPR = 1, 76}; 77 78#define NONNULL(x) ({ __typeof__(x) _x = (x); assert((_x) != NULL); _x; }) 79#define assert_bp(x) ({ if (!(x)) { __asm__("int3"); volatile bool _marker = 0; } }) 80//#define assert_bp(x) ((void) 0)