add radix morphism for little and big endian

This commit is contained in:
Michael Sippel 2025-02-14 13:54:59 +01:00
parent 638bb690aa
commit c270efbb87
Signed by: senvas
GPG key ID: F96CF119C34B64A6
3 changed files with 64 additions and 7 deletions
morphisms
include/morphisms
morphism-base
src

View file

@ -27,7 +27,13 @@ int morph_posint_endianness(
struct LengthPrefixUInt64Array const * restrict src,
struct LengthPrefixUInt64Array * restrict dst
);
int morph_posint_radix(
int morph_posint_radix_le(
uint64_t const src_radix,
uint64_t const dst_radix,
struct LengthPrefixUInt64Array const * restrict src,
struct LengthPrefixUInt64Array * restrict dst
);
int morph_posint_radix_be(
uint64_t const src_radix,
uint64_t const dst_radix,
struct LengthPrefixUInt64Array const * restrict src,

View file

@ -1,14 +1,24 @@
morph_digit_as_char_to_uint8 (Radix:_16)
<Digit Radix> ~ Char ~ Ascii ~ Byte
--> <Digit Radix> ~ x86.UInt8 ~ Byte
<Digit Radix> ~ Char ~ Ascii ~ x86.UInt8
--> <Digit Radix> ~ x86.UInt8
@lib/libmorph-posint.so:src/posint.c
morph_digit_as_uint8_to_char (Radix:_16)
<Digit Radix> ~ x86.UInt8 ~ Byte
--> <Digit Radix> ~ Char ~ Ascii ~ Byte
<Digit Radix> ~ x86.UInt8
--> <Digit Radix> ~ Char ~ Ascii ~ x86.UInt8
@lib/libmorph-posint.so:src/posint.c
morph_posint_radix (SrcRadix:, DstRadix:)
morph_digit_as_char_to_uint64 (Radix:_16)
<Digit Radix> ~ Char ~ Ascii ~ x86.UInt8
--> <Digit Radix> ~ x86.UInt64
@lib/libmorph-posint.so:src/posint.c
morph_digit_as_uint64_to_char (Radix:_16)
<Digit Radix> ~ x86.UInt64
--> <Digit Radix> ~ Char ~ Ascii ~ x86.UInt8
@lib/libmorph-posint.so:src/posint.c
morph_posint_radix_le (SrcRadix:, DstRadix:)
~ <PosInt SrcRadix LittleEndian>
~ <Seq~<LengthPrefix x86.UInt64> <Digit SrcRadix>~x86.UInt64>
@ -17,6 +27,15 @@ morph_posint_radix (SrcRadix:, DstRadix:)
~ <Seq~<LengthPrefix x86.UInt64> <Digit DstRadix>~x86.UInt64>
@lib/libmorph-posint.so:src/posint.c
morph_posint_radix_be (SrcRadix:, DstRadix:)
~ <PosInt SrcRadix BigEndian>
~ <Seq~<LengthPrefix x86.UInt64> <Digit SrcRadix>~x86.UInt64>
-->
~ <PosInt DstRadix BigEndian>
~ <Seq~<LengthPrefix x86.UInt64> <Digit DstRadix>~x86.UInt64>
@lib/libmorph-posint.so:src/posint.c
morph_posint_endianness (Radix:)
~ <PosInt Radix LittleEndian>

View file

@ -62,7 +62,7 @@ int morph_posint_endianness(
/* morph radix in little endian
*/
int morph_posint_radix(
int morph_posint_radix_le(
uint64_t const src_radix,
uint64_t const dst_radix,
@ -85,3 +85,35 @@ int morph_posint_radix(
return 0;
}
/* morph radix in little endian
*/
int morph_posint_radix_be(
uint64_t const src_radix,
uint64_t const dst_radix,
struct LengthPrefixUInt64Array const * restrict src,
struct LengthPrefixUInt64Array * restrict dst
) {
uint64_t value = 0;
for( uint64_t i = 0; i < src->len; ++i ) {
value *= src_radix;
value += src->items[i];
}
uint64_t v = value;
dst->len = 0;
while( v ) {
dst->len++;
v /= dst_radix;
}
uint64_t i = dst->len;
while( value > 0 ) {
dst->items[--i] = ( dst, value % dst_radix );
value /= dst_radix;
}
return 0;
}