From 055117dc5f154cc331a9ba7277081d540936c60f Mon Sep 17 00:00:00 2001 From: Duarte Roso Date: Sat, 1 Aug 2020 23:06:08 +0200 Subject: [PATCH] builtin: make byte.hex() two digits format (#5886) --- vlib/builtin/int.v | 136 +++++++++++++--------------------------- vlib/builtin/int_test.v | 6 +- 2 files changed, 46 insertions(+), 96 deletions(-) diff --git a/vlib/builtin/int.v b/vlib/builtin/int.v index 8e73b2168a..e254bf0dac 100644 --- a/vlib/builtin/int.v +++ b/vlib/builtin/int.v @@ -268,35 +268,53 @@ pub fn (n int) hex1() string { } */ -pub fn (nn byte) hex() string { - if nn == 0 { - return '0' - } - +[inline] +fn u64_to_hex(nn u64, len byte) string { mut n := nn - max := 2 - mut buf := malloc(max + 1) - - mut index := max - unsafe { - buf[index--] = `\0` - } - for n > 0 { - d := n & 0xF + mut buf := [256]byte + buf[len] = `\0` + mut i := 0 + for i=len-1; i>=0; i-- { + d := byte(n & 0xF) + x := if d < 10 { d + `0` } else { d + 87 } + buf[i] = x n = n >> 4 - unsafe { - buf[index--] = if d < 10 { d + `0` } else { d + 87 } + } + return string{ + str: memdup(buf, len + 1) + len: len + } +} + +[inline] +fn u64_to_hex_no_leading_zeros(nn u64, len byte) string { + mut n := nn + mut buf := [256]byte + buf[len] = `\0` + mut i := 0 + for i=len-1; i>=0; i-- { + d := byte(n & 0xF) + x := if d < 10 { d + `0` } else { d + 87 } + buf[i] = x + n = n >> 4 + if n == 0 { + break } } - //buf[index--] = `x` - //buf[index] = `0` - index++ - - unsafe { - return tos(buf + index, (max - index)) + res_len := len - i + return string{ + str: memdup(&buf[i], res_len + 1) + len: res_len } } +pub fn (nn byte) hex() string { + if nn == 0 { + return '00' + } + return u64_to_hex(nn, 2) +} + pub fn (nn i8) hex() string { return byte(nn).hex() } @@ -305,29 +323,7 @@ pub fn (nn u16) hex() string { if nn == 0 { return '0' } - - mut n := nn - max := 5 - mut buf := malloc(max + 1) - - mut index := max - unsafe { - buf[index--] = `\0` - } - for n > 0 { - d := byte(n & 0xF) - n = n >> 4 - unsafe { - buf[index--] = if d < 10 { d + `0` } else { d + 87 } - } - } - //buf[index--] = `x` - //buf[index] = `0` - index++ - - unsafe { - return tos(buf + index, (max - index)) - } + return u64_to_hex_no_leading_zeros(nn, 4) } pub fn (nn i16) hex() string { @@ -338,29 +334,7 @@ pub fn (nn u32) hex() string { if nn == 0 { return '0' } - - mut n := nn - max := 10 - mut buf := malloc(max + 1) - - mut index := max - unsafe { - buf[index--] = `\0` - } - for n > 0 { - d := byte(n & 0xF) - n = n >> 4 - unsafe { - buf[index--] = if d < 10 { d + `0` } else { d + 87 } - } - } - //buf[index--] = `x` - //buf[index] = `0` - index++ - - unsafe { - return tos(buf + index, (max - index)) - } + return u64_to_hex_no_leading_zeros(nn, 8) } pub fn (nn int) hex() string { @@ -375,31 +349,7 @@ pub fn (nn u64) hex() string { if nn == 0 { return '0' } - - mut n := nn - max := 18 - mut buf := malloc(max + 1) - - mut index := max - unsafe { - buf[index--] = `\0` - } - for n > 0 { - d := byte(n & 0xF) - n = n >> 4 - unsafe { - buf[index--] = if d < 10 { d + `0` } else { d + 87 } - } - } - //buf[index--] = `x` - //buf[index] = `0` - index++ - - unsafe { - C.memmove(buf,buf+index, (max-index)+1 ) - return tos(buf, (max-index)) - } - //return tos(buf + index, (max-index)) + return u64_to_hex_no_leading_zeros(nn, 16) } pub fn (nn i64) hex() string { diff --git a/vlib/builtin/int_test.v b/vlib/builtin/int_test.v index f22d0b4ef7..cdfa436300 100644 --- a/vlib/builtin/int_test.v +++ b/vlib/builtin/int_test.v @@ -196,9 +196,9 @@ fn test_int_to_hex() { // --- int to hex tests c0 := 12 // 8Bit - assert byte(0).hex() == '0' - assert byte(c0).hex() == 'c' - assert i8(c0).hex() == 'c' + assert byte(0).hex() == '00' + assert byte(c0).hex() == '0c' + assert i8(c0).hex() == '0c' assert byte(127).hex() == '7f' assert i8(127).hex() == '7f' assert byte(255).hex() == 'ff'