aboutsummaryrefslogtreecommitdiff
path: root/include/u.h
blob: d415d82f0b73855085f71132498abe53690e7f2e (plain)
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
#pragma once

#include <arch/bits.h>

// ------------------------------------------------------------------------
// types

/* useful aliases */
typedef char byte;
typedef signed char schar, sbyte;
typedef unsigned char uchar, ubyte;

typedef signed short sshort;
typedef unsigned short ushort;

typedef signed int sint;
typedef unsigned int uint;

typedef signed long slong;
typedef unsigned long ulong;

typedef long long vlong;
typedef unsigned long long uvlong;
typedef signed long long svlong;

typedef _Bool bool;

/* fixed width */
typedef signed INT8  int8;
typedef signed INT16 int16;
typedef signed INT32 int32;
typedef signed INT64 int64;

typedef unsigned INT8  uint8;
typedef unsigned INT16 uint16;
typedef unsigned INT32 uint32;
typedef unsigned INT64 uint64;

typedef uint32 rune;

/* pointer address */
typedef ADDR intptr;
typedef unsigned ADDR uintptr;
typedef ADDR address_t;
typedef REG  register_t;
typedef unsigned REG uregister_t;

/* variable length list */
typedef __builtin_va_list va_list;

#undef INT8
#undef INT16
#undef INT32
#undef INT64
#undef ADDR
#undef REG

// ------------------------------------------------------------------
// global constants

#define true  1
#define false 0
#define nil ((void*)0)

/* limits */
#define CHAR_BIT 8
#define SCHAR_MIN (-128)
#define SCHAR_MAX 127
#define UCHAR_MAX 255

#if '\xff' > 0
#   define CHAR_MIN 0
#   define CHAR_MAX UCHAR_MAX
#else
#   define CHAR_MIN SCHAR_MIN
#   define CHAR_MAX SCHAR_MAX
#endif

#define SHRT_MIN   (-1-0x7fff)
#define SHRT_MAX    0x7fff
#define USHRT_MAX   0xffff
#define INT_MIN    (-1-0x7fffffff)
#define INT_MAX     0x7fffffff
#define UINT_MAX    0xffffffffU
#define LONG_MIN   (-LONG_MAX-1)
#define ULONG_MAX  (2UL*LONG_MAX+1)
#define LLONG_MIN  (-LLONG_MAX-1)
#define LLONG_MAX   0x7fffffffffffffffLL
#define ULLONG_MAX (2ULL*LLONG_MAX+1)

#define INT8_MIN   (-1-0x7f)
#define INT16_MIN  (-1-0x7fff)
#define INT32_MIN  (-1-0x7fffffff)
#define INT64_MIN  (-1-0x7fffffffffffffff)

#define INT8_MAX   (0x7f)
#define INT16_MAX  (0x7fff)
#define INT32_MAX  (0x7fffffff)
#define INT64_MAX  (0x7fffffffffffffff)

#define UINT8_MAX  (0xff)
#define UINT16_MAX (0xffff)
#define UINT32_MAX (0xffffffffu)
#define UINT64_MAX (0xffffffffffffffffu)

#define PATH_MAX   4096

// ------------------------------------------------------------------
// global macros

/* weak aliasing */
#define noreturn _Noreturn
#define hidden __attribute__((__visibility__("hidden")))
#define weakalias(old, new) extern __typeof(old) new __attribute__((weak, alias(#old)))

/* offsets */
#define offsetof(t, d) __builtin_offsetof(t, d)

/* variable arguments */
#define va_start(v,a)  __builtin_va_start(v,a)
#define va_end(v)      __builtin_va_end(v)
#define va_arg(v,t)    __builtin_va_arg(v,t)
#define va_copy(d,s)   __builtin_va_copy(d,s)

/* array helpers */
#define arrlen(Array) (sizeof(Array) / sizeof((Array)[0]))
#define arrend(Array) ((Array) + arrlen(Array))

/* simple thresholding */
#define MAX(x, y)        (((x) > (y)) ? (x) : (y))
#define MIN(x, y)        (((x) < (y)) ? (x) : (y))
#define CLAMP(x, lo, hi) (((x) < (lo)) ? (lo) : (((x) > (hi)) ? (hi) : (x)))