picox  0.1
xutils.h ファイル

低レベルなあれこれ雑多なユーティリティ集 [詳解]

被依存関係図:

[ソースコード]

マクロ定義

#define X_ASSIGN_AND_GOTO_IF(cond, x, v, label)   if(cond) { (x) = (v); goto label; }
 cond == trueの時、xにvを代入してlabelにジャンプします
 
#define X_ASSIGN_IF(cond, x, v)    if(cond) x = (v)
 cond == trueの時、x に vを代入します。
 
#define X_ASSIGN_NOT_NULL(x, v)   if (x) *(x) = (v)
 ポインタ変数xがNULLでなければvを代入します
 
#define X_BIT(x)    (1UL << (x))
 bit xを返します。
 
#define X_BIT64(x)    (1ULL << (x))
 X_BIT()の64ビット版です
 
#define X_BIT_MASK(n)   ((1UL << (n)) - 1)
 n bit未満のbitを切り捨てるマスクを返します
 
#define X_BREAK_IF(cond)    if(cond) break
 cond == trueの時、break文を実行します。
 
#define X_BYTE_ORDER   X_CONF_BYTE_ORDER
 
#define X_CONSTRAIN(x, a, b)    (((x) < (a)) ? (a) : ((b) < (x)) ? (b) : (x))
 xをa, bの範囲内に収めます。 [詳解]
 
#define X_CONTINUE_IF(cond)    if(cond) continue
 cond == trueの時、continue文を実行します。
 
#define X_DIV_ROUNDUP(dividend, divisor)   (((dividend) + (divisor) - 1) / (divisor))
 あまりの切り上げを行う整数除算です
 
#define X_EVEN_BITS16(x)   (((uint16_t)(x)) & 0xaaaa)
 xの下位16bitを偶数ビットでマスクした値を返します。
 
#define X_EVEN_BITS32(x)   (((uint32_t)(x)) & 0xaaaaaaaa)
 xの下位32bitを偶数ビットでマスクした値を返します。
 
#define X_EVEN_BITS8(x)   (((uint8_t)(x)) & 0xaa)
 xの下位8bitを偶数ビットでマスクした値を返します。
 
#define X_EXPR_IF(cond, expr)    if(cond) expr
 cond == trueの時、式exprを実行します。
 
#define X_FOREVER()    for (;;)
 無限ループを表現するマクロです。
 
#define X_GOTO_IF(cond, label)    if(cond) goto label
 cond == trueの時、labelへジャンプするgoto文を実行します。
 
#define X_HIGH_BYTE(x)   ((uint8_t)((x) >> 8))
 xの上位8bitの値を返します。
 
#define X_HIGH_NIBBLE(x)   (((uint8_t)(x)) >> 4)
 xの上位4bitの値を返します。
 
#define X_HIGH_WORD(x)   ((uint16_t)((x) >> 16))
 xの上位16bitの値を返します。
 
#define X_IS_ALIGNED(x, a)   (X_ROUNDUP_ALIGNMENT_PTR((x), (a)) == (x))
 xがアライメントの倍数かどうかをBool値で返します。
 
#define X_IS_ALIGNMENT(x)    (((uint32_t)(x) > 0) && (((uint32_t)(x) & ((uint32_t)(x) - 1)) == 0))
 xが1または2のべき乗かどうかをBool値で返します。
 
#define X_IS_MULTIPLE(x, m)   (X_ROUNDUP_MULTIPLE(x, m) == (x))
 xがmの倍数かどうかをBool値で返します。
 
#define X_IS_MULTIPLE_PTR(x, m)   (X_ROUNDUP_MULTIPLE_PTR(x, m) == (x))
 X_IS_MULTIPLE()のポインタ版です。
 
#define X_IS_POWER_OF_TWO(x)    (((x) & -(x)) == (x))
 xが2のべき乗かどうかをBool値で返します。
 
#define X_IS_POWER_OF_TWO_PTR(x)    ((((intptr_t)(x)) & -((intptr_t)(x))) == ((intptr_t)(x)))
 X_IS_POWER_OF_TWO()のポインタ版です。
 
#define X_LOAD_U16_BIG(ptr)   (uint16_t)(((uint16_t)(*((uint8_t*)(ptr)))<<8)|(uint16_t)*((uint8_t*)(ptr) + 1))
 ポインタから符号なし2Byteをビッグエンディアンからホスト形式で取得して返します。
 
#define X_LOAD_U16_LIT(ptr)   ((uint16_t)(((uint16_t)*((uint8_t*)(ptr)+1)<<8)|(uint16_t)*(uint8_t*)(ptr)))
 ポインタから符号なし2Byteをリトルエンディアンからホスト形式で取得して返します。
 
#define X_LOAD_U32_BIG(ptr)
 ポインタから符号なし4Byteをビッグエンディアンからホスト形式で取得して返します。 [詳解]
 
#define X_LOAD_U32_LIT(ptr)
 ポインタから符号なし4Byteをリトルエンディアンからホスト形式で取得して返します。 [詳解]
 
#define X_LOAD_U8(ptr)   (*(uint8_t*)(ptr))
 ポインタから符号なし1バイトを取得して返します。
 
#define X_LOW_BYTE(x)   ((uint8_t)(x))
 xの下位8bitの値を返します。
 
#define X_LOW_NIBBLE(x)   (((uint8_t)(x)) & 0x0f)
 xの下位4bitの値を返します。
 
#define X_LOW_WORD(x)   ((uint16_t)(x))
 xの下位16bitの値を返します。
 
#define X_MAX(a, b)    (((a)>(b))?(a):(b))
 a,bを比較し、大きい方を返します。
 
#define X_MIN(a, b)    (((a)<(b))?(a):(b))
 a,bを比較し、小さい方を返します。
 
#define X_ODD_BITS16(x)   (((uint16_t)(x)) & 0x5555)
 xの下位16bitを奇数ビットでマスクした値を返します。
 
#define X_ODD_BITS32(x)   (((uint32_t)(x)) & 0x55555555)
 xの下位32bitを奇数ビットでマスクした値を返します。
 
#define X_ODD_BITS8(x)   (((uint8_t)(x)) & 0x55)
 xの下位8bitを奇数ビットでマスクした値を返します。
 
#define X_RETURN_IF(cond)    if(cond) return
 cond == trueの時、return文を実行します。
 
#define X_RETURN_VALUE_IF(cond, x)    if(cond) return x
 cond == trueの時、xを返すreturn文を実行します。
 
#define X_REVERSE_BITS16(x)
 xの下位16bitを逆転した値を返します。 [詳解]
 
#define X_REVERSE_BITS32(x)
 xの下位32bitを逆転した値を返します。 [詳解]
 
#define X_REVERSE_BITS8(x)
 xの下位8bitを逆転した値を返します。 [詳解]
 
#define X_REVERSE_ENDIAN16(x)   ((((uint16_t)(x)) << 8) | (((uint16_t)(x) >> 8) & 0x00ff))
 xの下位2バイトのバイトオーダーを逆転した値を返します。
 
#define X_REVERSE_ENDIAN32(x)
 xの下位4バイトのバイトオーダーを逆転した値を返します。 [詳解]
 
#define X_ROUNDDOWN_ALIGNMENT(x, a)   (X_ROUNDUP_ALIGNMENT((x) - (a) + 1, a))
 xをアライメントの倍数に切り下げた値を返します。 [詳解]
 
#define X_ROUNDDOWN_ALIGNMENT_PTR(x, a)   (X_ROUNDUP_ALIGNMENT_PTR(((uintptr_t)(x)) - (a) + 1, a))
 X_ROUNDDOWN_ALIGNMENT()のポインタ版です。
 
#define X_ROUNDDOWN_MULTIPLE(x, m)    (((m) == 0) ? (x) : ((uint32_t)(x) - ((x) % (m))))
 xをmの倍数に切り下げた値を返します。
 
#define X_ROUNDDOWN_MULTIPLE_PTR(x, m)    (((m) == 0) ? (void*)(x) : (void*)((uintptr_t)(x) - (((uintptr_t)(x)) % (m))))
 xをmの倍数に切り下げた値を返します。
 
#define X_ROUNDDOWN_POWER_OF_TWO(x)    X_ROUNDDOWN_POWER_OF_TWO_1(((uint32_t)(x)) | (((uint32_t)(x)) >> 1))
 xを最も近い2のべき乗に切り下げた値を返します。
 
#define X_ROUNDDOWN_POWER_OF_TWO_PTR(x)    ((void*)X_ROUNDDOWN_POWER_OF_TWO_1(((uintptr_t)(x)) | (((uintptr_t)(x)) >> 1)))
 X_ROUNDDOWN_POWER_OF_TWO()のポインタ版です。
 
#define X_ROUNDUP_ALIGNMENT(x, a)   ((((uint32_t)(x)) + (a) - 1) & ((uint32_t)0 - (a)))
 xをアライメントの倍数に切り上げた値を返します。 [詳解]
 
#define X_ROUNDUP_ALIGNMENT_PTR(x, a)   ((void*)((((uintptr_t)(x)) + (a) - 1) & ((uintptr_t)0 - (a))))
 X_ROUNDUP_ALIGNMENT()のポインタ版です。
 
#define X_ROUNDUP_MULTIPLE(x, m)    (((m) == 0) ? (x) : (((uint32_t)(x) + (m) - 1) / (m)) * (m))
 xをmの倍数に切り上げた値を返します。
 
#define X_ROUNDUP_MULTIPLE_PTR(x, m)    (((m) == 0) ? (void*)(x) : (void*)((((uintptr_t)(x) + (m) - 1) / (m)) * (m)))
 X_ROUNDUP_MULTIPLE()のポインタ版です。
 
#define X_ROUNDUP_POWER_OF_TWO(x)    X_ROUNDUP_POWER_OF_TWO_1((uint32_t)(x) - 1)
 xを最も近い2のべき乗に切り上げた値を返します。
 
#define X_ROUNDUP_POWER_OF_TWO_PTR(x)    ((void*)X_ROUNDUP_POWER_OF_TWO_1((uintptr_t)(x) - 1))
 X_ROUNDUP_POWER_OF_TWO()のポインタ版です。
 
#define X_STORE_U16_BIG(ptr, val)
 符号なし2Byteをポインタ参照先にホスト形式からビッグエンディアンでセットします。 [詳解]
 
#define X_STORE_U16_LIT(ptr, val)
 符号なし2Byteをポインタ参照先にホスト形式からリトルエンディアンでセットします。 [詳解]
 
#define X_STORE_U32_BIG(ptr, val)
 符号なし4Byteをポインタ参照先にホスト形式からビッグエンディアンでセットします。 [詳解]
 
#define X_STORE_U32_LIT(ptr, val)
 符号なし4Byteをポインタ参照先にホスト形式からリトルエンディアンでセットします。 [詳解]
 
#define X_STORE_U8(ptr, val)    (*(uint8_t*)(ptr)=(uint8_t)(val))
 符号なし1Byteをポインタ参照先にセットします。
 
#define X_SWAP(x, y, T)   do { T tmp = x; x = y; y = tmp; } while (0)
 型Tの変数として、x, yを交換します。
 
#define X_SWAP_ADJACENT_BITS16(x)   ((X_ODD_BITS16(x) << 1) | ((X_EVEN_BITS16(x)) >> 1))
 xの下位16bitの隣り合ったビットを交換した値を返します。
 
#define X_SWAP_ADJACENT_BITS32(x)   ((X_ODD_BITS32(x) << 1) | ((X_EVEN_BITS32(x)) >> 1))
 xの下位32bitの隣り合ったビットを交換した値を返します。
 
#define X_SWAP_ADJACENT_BITS8(x)   ((X_ODD_BITS8(x) << 1) | ((X_EVEN_BITS8(x)) >> 1))
 xの下位8bitの隣り合ったビットを交換した値を返します。
 
#define X_UNUSED(x)    (void)(x)
 コンパイラによる未使用変数の警告を抑制するマクロです。
 

関数

static uint16_t x_big_to_host16 (uint16_t x)
 2Byteビッグエンディアンデータをホストのエンディアンにして返します。
 
static uint32_t x_big_to_host32 (uint32_t x)
 4Byteビッグエンディアンデータをホストのエンディアンにして返します。
 
static int x_count_bits16 (uint16_t x)
 x_count_bits8()の16bit版です
 
static int x_count_bits32 (uint32_t x)
 x_count_bits8()の32bit版です
 
static IGNORE int x_count_bits8 (uint8_t x)
 8bit符号なし変数のセットされたビット数を返します
 
static ptrdiff_t x_distance_ptr (const void *begin, const void *end)
 void*引数end, beginのバイト単位のアドレス差を返します。
 
static uint16_t x_find_lsb16 (uint16_t x)
 x_find_lsb8()の16bit版です
 
static uint32_t x_find_lsb32 (uint32_t x)
 x_find_lsb8()の32bit版です
 
static uint8_t x_find_lsb8 (uint8_t x)
 8bit符号なし整数の下位から最も近くにセットされたビットを返します。 [詳解]
 
static int x_find_lsb_pos16 (uint16_t x)
 x_find_lsb8()の16bit版です
 
static int x_find_lsb_pos32 (uint32_t x)
 x_find_lsb8()の32bit版です
 
static IGNORE int x_find_lsb_pos8 (uint8_t x)
 8bit符号なし整数の下位から最も近くにセットされたビット位置を返します。 [詳解]
 
static uint16_t x_find_msb16 (uint16_t x)
 x_find_msb8()の16bit版です
 
static uint32_t x_find_msb32 (uint32_t x)
 x_find_msb8()の32bit版です
 
static uint8_t x_find_msb8 (uint8_t x)
 8bit符号なし整数の上位から最も近くにセットされたビットを返します。 [詳解]
 
static int x_find_msb_pos16 (uint16_t x)
 x_find_msb8()の16bit版です
 
static int x_find_msb_pos32 (uint32_t x)
 x_find_msb8()の32bit版です
 
static IGNORE int x_find_msb_pos8 (uint8_t x)
 8bit符号なし整数の上位から最も近くにセットされたビット位置を返します。 [詳解]
 
static uint16_t x_host_to_big16 (uint16_t x)
 2Byteホストエンディアンデータをビッグエンディアンにして返します。
 
static uint32_t x_host_to_big32 (uint32_t x)
 4Byteホストエンディアンデータをビッグエンディアンにして返します。
 
static uint16_t x_host_to_little16 (uint16_t x)
 2Byteホストエンディアンデータをリトルエンディアンにして返します。
 
static uint32_t x_host_to_little32 (uint32_t x)
 4Byteホストエンディアンデータをリトルエンディアンにして返します。
 
static bool x_is_aligned (const void *ptr, size_t alignment)
 ptrが指すアドレスがalignmentの倍数かどうかをBool値で返します。
 
static bool x_is_alignment (uint32_t x)
 X_IS_ALIGNMENT()の関数版です。
 
static bool x_is_big_endian (void)
 バイトオーダーがビッグエンディアンかどうかを返します。
 
static bool x_is_little_endian (void)
 バイトオーダーがリトルエンディアンかどうかを返します。
 
static bool x_is_multiple (uint32_t x, uint32_t m)
 X_IS_MULTIPLE()の関数版です。
 
static bool x_is_multiple_ptr (const void *x, uint32_t m)
 X_IS_MULTIPLE_PTR()の関数版です。
 
static bool x_is_power_of_two (uint32_t x)
 X_IS_POWER_OF_TWO()の関数版です。
 
static bool x_is_power_of_two_ptr (const void *x)
 X_IS_POWER_OF_TWO_PTR()の関数版です。
 
static bool x_is_uwithin (uint32_t x, uint32_t begin, uint32_t end)
 (begin <= x) && (x < end)を判定します。
 
static bool x_is_within (int32_t x, int32_t begin, int32_t end)
 (begin <= x) && (x < end)を判定します。
 
static bool x_is_within_ptr (const void *ptr, const void *begin, const void *end)
 ptrが指すアドレスがbegin とendの範囲内かどうかをBool値で返します。
 
static bool x_is_within_uptr (uintptr_t x, uintptr_t begin, uintptr_t end)
 (begin <= x) && (x < end)を判定します。
 
static uint16_t x_little_to_host16 (uint16_t x)
 2Byteリトルエンディアンデータをホストのエンディアンにして返します。
 
static uint32_t x_little_to_host32 (uint32_t x)
 4Byteリトルエンディアンデータをホストのエンディアンにして返します。
 
static int32_t x_map (int32_t x, int32_t in_min, int32_t in_max, int32_t out_min, int32_t out_max)
 数値をある範囲から別の範囲に変換します [詳解]
 
static void x_reverse_2byte (void *x)
 xが指す先頭2バイトを逆転します [詳解]
 
static void x_reverse_4byte (void *x)
 xが指す先頭4バイトを逆転します [詳解]
 
static uint16_t x_reverse_bits16 (uint16_t x)
 X_REVERSE_BITS16()の関数版です。
 
static uint32_t x_reverse_bits32 (register uint32_t x)
 X_REVERSE_BITS32()の関数版です。
 
static IGNORE uint8_t x_reverse_bits8 (uint8_t x)
 X_REVERSE_BITS8()の関数版です。
 
static uint16_t x_reverse_endian16 (register uint16_t x)
 X_REVERSE_ENDIAN16()の関数版です。
 
static uint32_t x_reverse_endian32 (uint32_t x)
 X_REVERSE_ENDIAN32()の関数版です。
 
static uint32_t x_rounddown_alignment (uint32_t x, uint32_t a)
 X_ROUNDDOWN_ALIGNMENT()の関数版です。
 
static void * x_rounddown_alignment_ptr (const void *x, uint32_t a)
 X_ROUNDDOWN_ALIGNMENT_PTR()の関数版です。
 
static uint32_t x_rounddown_multiple (uint32_t x, uint32_t m)
 X_ROUNDDOWN_MULTIPLE()の関数版です。
 
static void * x_rounddown_multiple_ptr (const void *x, uintptr_t m)
 X_ROUNDDOWN_MULTIPLE()の関数版です。
 
static uint32_t x_rounddown_power_of_two (uint32_t x)
 X_ROUNDDOWN_POWER_OF_TWO()の関数版です。
 
static void * x_rounddown_power_of_two_ptr (const void *x)
 X_ROUNDDOWN_POWER_OF_TWO_PTR()の関数版です。
 
static uint32_t x_roundup_alignment (uint32_t x, uint32_t a)
 X_ROUNDUP_ALIGNMENT()の関数版です。
 
static void * x_roundup_alignment_ptr (const void *x, size_t a)
 X_ROUNDUP_ALIGNMENT_PTR()の関数版です。
 
static uint32_t x_roundup_multiple (uint32_t x, uint32_t m)
 X_ROUNDUP_MULTIPLE()の関数版です。
 
static void * x_roundup_multiple_ptr (const void *x, uint32_t m)
 X_ROUNDUP_MULTIPLE_PTR()の関数版です。
 
static uint32_t x_roundup_power_of_two (uint32_t x)
 X_ROUNDUP_POWER_OF_TWO()の関数版です。
 
static void * x_roundup_power_of_two_ptr (const void *x)
 X_ROUNDUP_POWER_OF_TWO_PTR()の関数版です。
 
static uint32_t x_umap (uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max)
 x_map()の符号なし版です。
 

詳解

低レベルなあれこれ雑多なユーティリティ集

著者
MaskedW