ap_macro.h80 lines · 2.5 KB · raw
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)