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