00001 #ifndef util_h
00002 #define util_h
00003
00004 #ifdef HAVE_CONFIG_H
00005 # include <config.h>
00006 #endif
00007
00008 #include "lc.h"
00009
00010
00011 #include "no_opt.h"
00012
00013 #include <string.h>
00014
00015
00016 #ifdef HAVE_BYTESWAP_H
00017 # include<byteswap.h>
00018 #endif
00019
00020 #ifndef false
00021 # define false 0
00022
00023 #endif
00024 #ifndef true
00025 # define true !false
00026
00027 #endif
00028
00029 #if 0
00030 typedef int bool;
00035 #endif
00036
00044 #define return_error(val) return_val_error(val,val)
00045
00053 #define return_success() return_error(lc_error_success)
00054
00063 #define return_previous() return lc_errno
00064
00072 #define return_null_error(val) do \
00073 { \
00074 lc_errno = val; \
00075 return NULL; \
00076 } while(false)
00077
00085 #define return_void_error(val) do \
00086 { \
00087 lc_errno = val; \
00088 return; \
00089 } while(false)
00090
00091
00099 #define return_null_success() return_null_error(lc_error_success)
00100
00108 #define return_void_success() return_void_error(lc_error_success)
00109
00117 #define return_null_previous() return NULL
00118
00122 #define return_val_previous(val) return val
00123
00131 #define return_val_success(val) do \
00132 { \
00133 lc_errno = lc_error_success; \
00134 return val; \
00135 } while(false)
00136
00142 #define return_val_error(val, error) do \
00143 { \
00144 lc_errno = error; \
00145 return val; \
00146 } while(false)
00147
00148 #define test_free(alloced, ptr) do \
00149 { \
00150 if(alloced) \
00151 lc_free(ptr); \
00152 } while(false)
00153 #define tf_return_error(alloced, ptr, val) do \
00154 { \
00155 test_free(alloced, ptr); \
00156 return_error(val); \
00157 } while (false)
00158 #define tf_return_null_error(alloced, ptr, val) do \
00159 { \
00160 test_free(alloced, ptr); \
00161 return_null_error(val); \
00162 } while(false)
00163 #define tf_return_previous(alloced, ptr) do \
00164 { \
00165 test_free(alloced, ptr); \
00166 return_previous(); \
00167 } while(false)
00168 #define tf_return_null_success(alloced, ptr) do \
00169 { \
00170 test_free(alloced, ptr); \
00171 return_null_error(lc_error_success); \
00172 } while(false)
00173 #define tf_return_null_previous(alloced, ptr) do \
00174 { \
00175 test_free(alloced, ptr); \
00176 return_null_previous(); \
00177 } while(false)
00178
00179 #if !defined(HAVE_BSWAP_64) && !defined(bswap_64)
00180 # define bswap_64(n) \
00181 ( \
00182 (((n)&0x00000000000000FFull) << 56) | \
00183 (((n)&0x000000000000FF00ull) << 40) | \
00184 (((n)&0x0000000000FF0000ull) << 24) | \
00185 (((n)&0x00000000FF000000ull) << 8) | \
00186 (((n)&0x000000FF00000000ull) >> 8) | \
00187 (((n)&0x0000FF0000000000ull) >> 24) | \
00188 (((n)&0x00FF000000000000ull) >> 40) | \
00189 (((n)&0xFF00000000000000ull) >> 56) \
00190 )
00191 #endif
00192
00193 #ifdef WORDS_BIGENDIAN
00194 # define hton_64(n) (n)
00195 # define ntoh_64(n) (n)
00196 #else
00197 # define hton_64(n) (bswap_64((n)))
00198 # define ntoh_64(n) (bswap_64((n)))
00199 #endif
00200
00201 #define value_of1(var) var
00202 #define value_of2(var) value_of1(var)
00203 #define lc_reg_concat(a,b) a ## b
00204 #define lc_val_concat(a,b) lc_reg_concat(a,b)
00205 #define lc_line_var(var) lc_val_concat(lc_val_concat(var, _), __LINE__)
00206
00213 #if LC_SIZE_MAX > SIZE_MAX
00214 # define lc_mem_cpy(dst, src, size) do \
00215 { \
00216 lc_size lc_line_var(lc_mem_cpy_tmp) = (size); \
00217 if(lc_line_var(lc_mem_cpy_tmp) > SIZE_MAX) \
00218 lc_mem_cpy_huge(dst, src, lc_line_var(lc_mem_cpy_tmp)); \
00219 else \
00220 memcpy(dst, src, (size_t)(lc_line_var(lc_mem_cpy_tmp))); \
00221 } while(false)
00222 #else
00223 # define lc_mem_cpy(dst, src, size) memcpy(dst, src, (size_t)size)
00224 #endif
00225
00226 #if LC_SIZE_MAX > SIZE_MAX
00227 void *lc_mem_cpy_huge(void *dst, const void *src, lc_size size);
00228 #endif
00229 void lc_reverse(void *out_arg, const void *in_arg, unsigned int len);
00230 char *lc_hex(const void *in, lc_size in_size, void *out);
00231
00232 #endif