picox
0.1
|
低レベルなあれこれ雑多なユーティリティ集 [詳解]
マクロ定義 | |
#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()の符号なし版です。 | |
低レベルなあれこれ雑多なユーティリティ集