1 /* This file is included by config.h */
2 
3 #ifndef UTIL_H
4 #define UTIL_H
5 
6 #include "config.h"
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #ifndef __STDC_FORMAT_MACROS
13 #	define __STDC_FORMAT_MACROS 1
14 #endif
15 #include <inttypes.h>
16 
17 #ifndef powerof2
18 #	define powerof2(n) ((((n) - 1) & (n)) == 0)
19 #endif
20 #ifndef MAX
21 #	define MAX(a, b) (((a) > (b)) ? (a) : (b))
22 #endif
23 #ifndef MIN
24 #	define MIN(a, b) (((a) < (b)) ? (a) : (b))
25 #endif
26 #ifndef CLAMP
27 #	define CLAMP(x, low, high) (((x)>(high))?(high):(((x)<(low))?(low):(x)))
28 #endif
29 #define WCLAMP(x, low, high) (((x)>(high))?(low):(((x)<(low))?(high):(x)))
30 
31 #ifdef __GNUC__
32 #	if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
33 #		define full_memory_barrier() __sync_synchronize()
34 #		define read_memory_barrier() full_memory_barrier()
35 #		define write_memory_barrier() full_memory_barrier()
36 #	elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__x86_64__)
37 #		define full_memory_barrier() asm volatile ("lock; addl $0,0(%%esp)":::"memory")
38 #		define read_memory_barrier() full_memory_barrier()
39 #		define write_memory_barrier() full_memory_barrier()
40 /*
41  These would be faster on SSE2-capable processors:
42 #		define full_memory_barrier() asm volatile ("mfence":::"memory")
43 #		define read_memory_barrier() asm volatile ("lfence":::"memory")
44 #		define write_memory_barrier() asm volatile ("sfence":::"memory")
45 */
46 #	elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)
47 #		define full_memory_barrier() asm volatile("sync":::"memory")
48 #		define read_memory_barrier() full_memory_barrier()
49 #		define write_memory_barrier() full_memory_barrier()
50 #	else
51 #		warning Memory barriers not defined on this system
52 #		define full_memory_barrier() ((void)0)
53 #		define read_memory_barrier() full_memory_barrier()
54 #		define write_memory_barrier() full_memory_barrier()
55 #	endif
56 #else
57 #	warning Memory barriers not defined on this system
58 #	define full_memory_barrier() ((void)0)
59 #	define read_memory_barrier() full_memory_barrier()
60 #	define write_memory_barrier() full_memory_barrier()
61 #endif
62 
63 /* http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html */
64 #if defined(__GNUC__) && (__GNUC__ >= 3)
65 #	define likely(x)	__builtin_expect (!!(x), 1)
66 #	define unlikely(x)  __builtin_expect (!!(x), 0)
67 #	define used__	   __attribute__ ((__used__))
68 #	define unused__	 __attribute__ ((__unused__))
69 #	define must_check__ __attribute__ ((__warn_unused_result__))
70 #	define deprecated__ __attribute__ ((__deprecated__))
71 #	define noreturn__   __attribute__ ((__noreturn__))
72 #	define pure__	   __attribute__ ((__pure__))
73 #	define const__	  __attribute__ ((__const__))
74 #	define malloc__	 __attribute__ ((__malloc__))
75 #	define packed__	 __attribute__ ((__packed__))
76 #	define inline__	 inline __attribute__ ((__always_inline__))
77 #	define noinline__   __attribute__ ((__noinline__))
78 #	define nonnull__(x) __attribute__ ((__nonnull__(x)))
79 #	define format__(type_, index_, first_) __attribute__ ((format(type_, index_, first_)))
80 #else
81 #	define likely(x)	(x)
82 #	define unlikely(x)  (x)
83 #	define used__
84 #	define unused__
85 #	define must_check__
86 #	define deprecated__
87 #	define noreturn__
88 #	define pure__
89 #	define const__
90 #	define malloc__
91 #	define packed__
92 #	define inline__
93 #	define noinline__
94 #	define nonnull__(x)
95 #	define format__(type_, index_, first_)
96 #endif
97 
98 #if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
99 #	define hot__		__attribute__ ((__hot__))
100 #	define cold__	   __attribute__ ((__cold__))
101 #else
102 #	define hot__
103 #	define cold__
104 #endif
105 
106 #include <stddef.h>
107 
108 const__ uint32_t ceil2(uint32_t n);
109 const__ uint32_t floor2(uint32_t n);
110 
111 #if !HAVE_STRCASESTR || __WIN32__
112 char* strcasestr(const char* haystack, const char* needle);
113 #endif
114 
115 #if !HAVE_STRLCPY || __WIN32__
116 size_t strlcpy(char* dest, const char* src, size_t size);
117 #endif
118 
119 int set_cloexec(int fd, unsigned char v);
120 int set_nonblock(int fd, unsigned char v);
121 int set_nodelay(int fd, unsigned char v);
122 int get_bufsize(int fd, int dir, int* len);
123 int set_bufsize(int fd, int dir, int len);
124 
125 unsigned long ver2int(const char* version);
126 
127 void save_signals(void);
128 void restore_signals(void);
129 
130 void MilliSleep(long msecs);
131 
132 #ifdef __cplusplus
133 } // extern "C"
134 #endif
135 
136 #ifdef __cplusplus
137 uint32_t simple_hash_data(const unsigned char* buf, size_t len, uint32_t code = 0);
138 uint32_t simple_hash_str(const unsigned char* str, uint32_t code = 0);
139 #endif
140 
141 #ifdef __cplusplus
142 const char* str2hex(const unsigned char* str, size_t len);
143 const char* str2hex(const char* str, size_t len = 0);
144 #else
145 const char* str2hex(const unsigned* str, size_t len);
146 #endif
147 
148 const char* uint2bin(unsigned u, size_t len);
149 void MilliSleep(long msecs);
150 
151 #if !defined(NDEBUG) && defined(deprecated__) && defined(__GNUC__) && !defined(__WIN32__)
152 #include <stdio.h>
153 #include <string.h>
154 deprecated__ typeof(sprintf) sprintf;
155 /* there are far too many of these in the qrz code
156 deprecated__ typeof(strcpy) strcpy;
157 deprecated__ typeof(strcat) strcat;
158 */
159 #endif
160 
161 #ifdef __WIN32__
162 #  define NOMINMAX 1
163 #endif
164 
165 #ifndef __WIN32__
166 #  define PRIuSZ "zu"
167 #  define PRIdSZ "zd"
168 #else
169 #  define PRIuSZ "Iu"
170 #  define PRIdSZ "Id"
171 #endif
172 
173 #ifndef __WIN32__
174 #  define PATH_SEP "/"
175 #else
176 #  define PATH_SEP "\\"
177 #endif
178 
179 #endif /* UTIL_H */
180 
181 /*
182 Local Variables:
183 mode: c++
184 c-file-style: "linux"
185 End:
186 */
187