morphisms: add posint to u64 and vice-versa

This commit is contained in:
Michael Sippel 2025-02-20 02:23:58 +01:00
parent 24e28e7bb5
commit d6107601a6
Signed by: senvas
GPG key ID: F96CF119C34B64A6

View file

@ -1,3 +1,27 @@
morph_nat_as_u64_to_pos ()
~ x86.UInt64
-->
~ <PosInt 0 LittleEndian>
~ <Seq~<LengthPrefix x86.UInt64> <Digit 0>~x86.UInt64>
```
dst->len = 1;
dst->items[0] = *src;
return 0;
```
morph_nat_as_u64_to_pos ()
~ <PosInt 0 LittleEndian>
~ <Seq~<LengthPrefix x86.UInt64> <Digit 0>~x86.UInt64>
-->
~ x86.UInt64
```
*dst = src->items[0];
return 0;
```
morph_posint_radix_le (SrcRadix:, DstRadix:)
~ <PosInt SrcRadix LittleEndian>
@ -15,9 +39,13 @@ morph_posint_radix_le (SrcRadix:, DstRadix:)
length_prefix_uint64_array_clear( dst );
while( value > 0 ) {
length_prefix_uint64_array_push( dst, value % DstRadix );
value /= DstRadix;
if( DstRadix == 0 ) {
length_prefix_uint64_array_push( dst, value );
} else if( DstRadix > 0 ) {
while( value > 0 ) {
length_prefix_uint64_array_push( dst, value % DstRadix );
value /= DstRadix;
}
}
return 0;
@ -38,17 +66,22 @@ morph_posint_radix_be (SrcRadix:, DstRadix:)
value += src->items[i];
}
uint64_t v = value;
dst->len = 0;
while( v ) {
dst->len++;
v /= DstRadix;
}
if( DstRadix == 0 ) {
dst->len = 1;
dst->items[0] = value;
} else {
uint64_t v = value;
dst->len = 0;
while( v ) {
dst->len++;
v /= DstRadix;
}
uint64_t i = dst->len;
while( value > 0 ) {
dst->items[--i] = ( dst, value % DstRadix );
value /= DstRadix;
uint64_t i = dst->len;
while( value > 0 ) {
dst->items[--i] = value % DstRadix;
value /= DstRadix;
}
}
return 0;