-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommon.h
More file actions
178 lines (151 loc) · 7.76 KB
/
common.h
File metadata and controls
178 lines (151 loc) · 7.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/*
* a_common.h: common declarations for C.
*
* Copyright (c) Eason Qin <eason@ezntek.com>, 2024-2025.
*
* This source code form is placed under CC0/Public domain. Whatever you wanna
* do idk
*/
#ifndef _COMMON_H
#define _COMMON_H
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/types.h>
typedef size_t usize;
typedef ssize_t isize;
typedef uint8_t u8;
typedef int8_t i8;
typedef uint16_t u16;
typedef int16_t i16;
typedef uint32_t u32;
typedef int32_t i32;
typedef uint64_t u64;
typedef int64_t i64;
typedef float f32;
typedef double f64;
#define S_BOLD "\033[1m"
#define S_DIM "\033[2m"
#define S_END "\033[0m"
#define S_BLACK "\033[30m"
#define S_RED "\033[31m"
#define S_GREEN "\033[32m"
#define S_YELLOW "\033[33m"
#define S_BLUE "\033[34m"
#define S_MAGENTA "\033[35m"
#define S_CYAN "\033[36m"
#define S_WHITE "\033[37m"
#define S_BG_BLACK "\033[40m"
#define S_BG_RED "\033[41m"
#define S_BG_GREEN "\033[42m"
#define S_BG_YELLOW "\033[43m"
#define S_BG_BLUE "\033[44m"
#define S_BG_MAGENTA "\033[45m"
#define S_BG_CYAN "\033[46m"
#define S_BG_WHITE "\033[47m"
#define S_CLEAR_SCREEN "\033[2J\033[H"
#define S_CLEAR_LINE "\r\033[K"
#define S_ENTER_ALT "\033[?1049h"
#define S_LEAVE_ALT "\033[?1049l"
#define S_SHOWCURSOR "\033[?25h"
#define S_HIDECURSOR "\033[?25l"
#define LENGTH(lst) (i32)(sizeof(lst) / sizeof(lst[0]))
#define RINTPC(T) *(T*)&
#define check_alloc(ptr) \
do { \
if (ptr == NULL) { \
panic("allocation of `%s` failed", #ptr); \
perror("perror"); \
exit(1); \
} \
} while (0)
#define eprintf(...) fprintf(stderr, __VA_ARGS__);
#ifdef _A_STRING_DEBUG
#define panic(...) \
do { \
eprintf("\033[31;1mpanic:\033[0m line %d, func \"%s\" in file " \
"\"%s\": ", \
__LINE__, __func__, __FILE__); \
eprintf(__VA_ARGS__); \
eprintf("\n"); \
*(int*)0 = 0; \
exit(1); \
} while (0)
#else
#define panic(...) \
do { \
eprintf("\033[31;1mpanic:\033[0m line %d, func \"%s\" in file " \
"\"%s\": ", \
__LINE__, __func__, __FILE__); \
eprintf(__VA_ARGS__); \
eprintf("\n"); \
exit(1); \
} while (0)
#endif
#ifdef unreachable
#undef unreachable
#endif
#define unreachable panic("reached unreachable code")
#define fatal_noexit(...) \
do { \
eprintf(S_RED S_BOLD "[fatal] " S_END); \
eprintf(S_DIM); \
eprintf(__VA_ARGS__); \
eprintf(S_END "\n"); \
} while (0)
#define fatal(...) \
do { \
fatal_noexit(__VA_ARGS__); \
exit(1); \
} while (0);
#define warn(...) \
do { \
eprintf(S_MAGENTA S_BOLD "[warn] " S_END); \
eprintf(S_DIM); \
eprintf(__VA_ARGS__); \
eprintf(S_END "\n"); \
} while (0)
#define info(...) \
do { \
eprintf(S_CYAN S_BOLD "[info] " S_END); \
eprintf(S_DIM); \
eprintf(__VA_ARGS__); \
eprintf(S_END "\n"); \
} while (0)
// duplicates a value onto a new heap variable
#define dupe(T, ident, val) \
T* ident = NULL; \
do { \
(ident) = malloc(sizeof(T)); \
check_alloc((ident)); \
*(ident) = (val); \
} while (0)
// duplicates a slice onto the heap with length count
#define dupe_slice(T, ident, orig, count) \
T* ident = NULL; \
do { \
(ident) = calloc((count), sizeof(T)); \
check_alloc((ident)); \
memcpy((ident), (orig), (count)); \
} while (0)
#define if_let(type, id, expr) \
for (typeof(expr) _if_let_temp = (expr); _if_let_temp.have; \
_if_let_temp.have = 0) \
for (type id = _if_let_temp.data; _if_let_temp.have; \
_if_let_temp.have = 0) \
if (1)
#define let_else(type, id, expr) \
for (typeof(expr) _let_else_temp = (expr); !_let_else_temp.have; \
_let_else_temp.have = 1) \
for (type id = _let_else_temp.data; !_let_else_temp.have; \
_let_else_temp.have = 1) \
if (1)
#define while_let(type, id, expr) \
for (typeof(expr) _while_let_temp = (expr); _while_let_temp.have; \
_while_let_temp = (expr)) \
for (type id = _while_let_temp.data; _while_let_temp.have; \
_while_let_temp.have = 0)
#define let(id, expr) ((id = (expr).data, (expr)).have)
#define inrange(x, lower, higher) ((lower) <= (x) && (x) <= (higher))
#define VERSION "0.1.0"
#endif