101 lines
3.2 KiB
Nix
101 lines
3.2 KiB
Nix
{ ... }:
|
|
let
|
|
inherit(builtins) bitAnd bitOr bitXor elemAt foldl' genList;
|
|
|
|
splitInteger
|
|
= value:
|
|
let
|
|
value0 = if value >= 0 then value else -value;
|
|
value1 = value0 / 256;
|
|
value2 = value1 / 256;
|
|
value3 = value2 / 256;
|
|
value4 = value3 / 256;
|
|
value5 = value4 / 256;
|
|
value6 = value5 / 256;
|
|
value7 = value6 / 256;
|
|
in
|
|
{
|
|
sign = value < 0;
|
|
|
|
byte0 = bitAnd value0 255;
|
|
byte1 = bitAnd value1 255;
|
|
byte2 = bitAnd value2 255;
|
|
byte3 = bitAnd value3 255;
|
|
byte4 = bitAnd value4 255;
|
|
byte5 = bitAnd value5 255;
|
|
byte6 = bitAnd value6 255;
|
|
byte7 = bitAnd value7 255;
|
|
|
|
word0 = bitAnd value0 65535;
|
|
word1 = bitAnd value2 65535;
|
|
word2 = bitAnd value4 65535;
|
|
word3 = bitAnd value6 65535;
|
|
|
|
dword0 = bitAnd value0 4294967295;
|
|
dword1 = bitAnd value4 4294967295;
|
|
};
|
|
in
|
|
{
|
|
unpackWord
|
|
= value:
|
|
{ inherit(splitInteger value) byte0 byte1; };
|
|
|
|
unpackDWord
|
|
= value:
|
|
{ inherit(splitInteger value) byte0 byte1 byte2 byte3; };
|
|
|
|
unpackQWord
|
|
= value:
|
|
{ inherit(splitInteger value) byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7; };
|
|
|
|
packWord
|
|
= {
|
|
byte0 ? 0,
|
|
byte1 ? 0,
|
|
}:
|
|
assert byte0 >= 0 && byte0 < 255;
|
|
assert byte1 >= 0 && byte1 < 255;
|
|
byte0 + byte1 * 256;
|
|
|
|
packDWord
|
|
= {
|
|
byte0 ? 0,
|
|
byte1 ? 0,
|
|
byte2 ? 0,
|
|
byte3 ? 0,
|
|
}:
|
|
assert byte0 >= 0 && byte0 < 255;
|
|
assert byte1 >= 0 && byte1 < 255;
|
|
assert byte2 >= 0 && byte2 < 255;
|
|
assert byte3 >= 0 && byte3 < 255;
|
|
fold'
|
|
(result: byte: result * 256 + byte)
|
|
byte3
|
|
[ byte2 byte1 byte0 ];
|
|
|
|
packQWord
|
|
= {
|
|
byte0 ? 0,
|
|
byte1 ? 0,
|
|
byte2 ? 0,
|
|
byte3 ? 0,
|
|
byte4 ? 0,
|
|
byte5 ? 0,
|
|
byte6 ? 0,
|
|
byte7 ? 0,
|
|
}:
|
|
assert byte0 >= 0 && byte0 < 255;
|
|
assert byte1 >= 0 && byte1 < 255;
|
|
assert byte2 >= 0 && byte2 < 255;
|
|
assert byte3 >= 0 && byte3 < 255;
|
|
assert byte4 >= 0 && byte4 < 255;
|
|
assert byte5 >= 0 && byte5 < 255;
|
|
assert byte6 >= 0 && byte6 < 255;
|
|
assert byte7 >= 0 && byte7 < 255;
|
|
fold'
|
|
(result: byte: result * 256 + byte)
|
|
byte7
|
|
[ byte6 byte5 byte4 byte3 byte2 byte1 byte0 ];
|
|
|
|
}
|