diff --git a/morphisms/posint.morphism-base b/morphisms/posint.morphism-base index 81ea945..8300e64 100644 --- a/morphisms/posint.morphism-base +++ b/morphisms/posint.morphism-base @@ -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;