aboutsummaryrefslogtreecommitdiff
path: root/include/u.h
blob: 87d5080889b776df0514af40384fde0bb4b17e76 (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
#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;

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

// ------------------------------------------------------------------
// 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

/* 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)))