2007-07-20 19:48:39 +04:00
/*
* Copyright ( C ) 2007 Red Hat , Inc . All rights reserved .
*
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2007-07-20 19:48:39 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2007-07-20 19:48:39 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2007-07-20 19:48:39 +04:00
*/
# ifndef _LVM_UTIL_H
# define _LVM_UTIL_H
2015-07-06 17:09:17 +03:00
# include <inttypes.h>
2007-09-21 01:39:08 +04:00
# define min(a, b) ({ typeof(a) _a = (a); \
typeof ( b ) _b = ( b ) ; \
( void ) ( & _a = = & _b ) ; \
_a < _b ? _a : _b ; } )
# define max(a, b) ({ typeof(a) _a = (a); \
typeof ( b ) _b = ( b ) ; \
( void ) ( & _a = = & _b ) ; \
_a > _b ? _a : _b ; } )
2016-06-29 01:44:15 +03:00
# define is_power_of_2(n) ((n) && !((n) & ((n) - 1)))
2011-04-08 18:11:40 +04:00
# if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6)
2010-10-26 14:04:34 +04:00
# define uninitialized_var(x) x
# else
2008-06-23 23:04:34 +04:00
# define uninitialized_var(x) x = x
2010-10-26 14:04:34 +04:00
# endif
2008-06-23 23:04:34 +04:00
2016-12-12 15:03:50 +03:00
/*
* GCC 3.4 adds a __builtin_clz , which uses the count leading zeros ( clz )
* instruction on arches that have one . Provide a fallback using shifts
* and comparisons for older compilers .
*/
# ifdef HAVE___BUILTIN_CLZ
# define clz(x) __builtin_clz((x))
# else /* ifdef HAVE___BUILTIN_CLZ */
2018-06-19 20:35:48 +03:00
static unsigned _dm_clz ( unsigned x )
2016-12-12 15:03:50 +03:00
{
int n ;
if ( ( int ) x < = 0 ) return ( ~ x > > 26 ) & 32 ;
n = 1 ;
if ( ( x > > 16 ) = = 0 ) {
n = n + 16 ;
x = x < < 16 ;
}
if ( ( x > > 24 ) = = 0 ) {
n = n + 8 ;
x = x < < 8 ;
}
if ( ( x > > 28 ) = = 0 ) {
n = n + 4 ;
x = x < < 4 ;
}
if ( ( x > > 30 ) = = 0 ) {
n = n + 2 ;
x = x < < 2 ;
}
n = n - ( x > > 31 ) ;
return n ;
}
# define clz(x) _dm_clz((x))
# endif /* ifdef HAVE___BUILTIN_CLZ */
2018-06-19 20:35:48 +03:00
# ifdef HAVE___BUILTIN_CLZLL
# define clzll(x) __builtin_clzll((x))
# else /* ifdef HAVE___BUILTIN_CLZ */
static unsigned _dm_clzll ( unsigned long long x )
{
if ( x < = 0xffffffff )
return 32 + clz ( ( unsigned ) ( x & 0xffffffff ) ) ;
return clz ( x > > 32 ) ;
}
# define clzll(x) _dm_clzll((x))
# endif /* ifdef HAVE___BUILTIN_CLZLL */
2021-09-24 22:43:30 +03:00
# ifndef HAVE_FFS
# ifdef HAVE___BUILTIN_FFS
# define ffs(x) __builtin_ffs((x))
# else
# error ffs() not implemented!
# endif /* ifdef HAVE___BUILTIN_FFS */
# endif /* ifndef HAVE_FFS */
2010-05-25 03:11:34 +04:00
# define KERNEL_VERSION(major, minor, release) (((major) << 16) + ((minor) << 8) + (release))
2015-07-06 17:09:17 +03:00
/* Define some portable printing types */
# define PRIsize_t "zu"
2015-08-18 13:59:13 +03:00
# define PRIssize_t "zd"
2015-07-06 17:09:17 +03:00
# define PRIptrdiff_t "td"
# define PRIpid_t PRId32
/* For convenience */
# define FMTsize_t "%" PRIsize_t
2015-08-18 13:59:13 +03:00
# define FMTssize_t "%" PRIssize_t
2015-07-06 17:09:17 +03:00
# define FMTptrdiff_t "%" PRIptrdiff_t
# define FMTpid_t "%" PRIpid_t
# define FMTd8 "%" PRId8
# define FMTd16 "%" PRId16
# define FMTd32 "%" PRId32
# define FMTd64 "%" PRId64
# define FMTi8 "%" PRIi8
# define FMTi16 "%" PRIi16
# define FMTi32 "%" PRIi32
# define FMTi64 "%" PRIi64
# define FMTo8 "%" PRIo8
# define FMTo16 "%" PRIo16
# define FMTo32 "%" PRIo32
# define FMTo64 "%" PRIo64
# define FMTu8 "%" PRIu8
# define FMTu16 "%" PRIu16
# define FMTu32 "%" PRIu32
# define FMTu64 "%" PRIu64
# define FMTx8 "%" PRIx8
# define FMTx16 "%" PRIx16
# define FMTx32 "%" PRIx32
# define FMTx64 "%" PRIx64
2016-04-12 14:06:16 +03:00
# define FMTVGID "%." DM_TO_STRING(ID_LEN) "s"
2007-07-20 19:48:39 +04:00
# endif