From 1ba8071c553bc992acf2c581d9c0638028731fab Mon Sep 17 00:00:00 2001 From: Yuxiao Mao Date: Fri, 9 Aug 2024 10:16:45 +0200 Subject: [PATCH] Let bin/hex hint display as 2's complement and full length Also allow bin display for Int64 --- hld/Eval.hx | 3 ++- hld/Value.hx | 37 ++++++++++++++++++++----------------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/hld/Eval.hx b/hld/Eval.hx index 580e098..82baf49 100644 --- a/hld/Eval.hx +++ b/hld/Eval.hx @@ -897,7 +897,8 @@ class Eval { } case VInt64(i): switch( v.hint ) { - case HHex: Value.int64Hex(i); + case HBin: Value.int64Str(i, 2); + case HHex: Value.int64Str(i, 16); default: "" + i; } case VFloat(i): diff --git a/hld/Value.hx b/hld/Value.hx index d2cb40b..c65b9ad 100644 --- a/hld/Value.hx +++ b/hld/Value.hx @@ -77,28 +77,31 @@ enum Hint { static final INTBASE = "0123456789ABCDEF"; public static function intStr( value : Int, base : Int ) : String { - if( base < 2 || base > INTBASE.length ) - throw "Unsupported int base"; - var prefix = base == 2 ? "0b" : base == 16 ? "0x" : ""; - if( base == 10 || value == 0 ) - return prefix + value; - var s = ""; - var abs = value >= 0 ? value : -value; - while( abs > 0 ) { - s = INTBASE.charAt(abs % base) + s; - abs = Std.int(abs / base); - } - return (value < 0 ? "-" : "") + prefix + s; + return int64Str(value, base, true); } - public static function int64Hex( value : haxe.Int64 ) : String { + public static function int64Str( value : haxe.Int64, base : Int, is32bit : Bool = false ) : String { + if( base != 2 && base != 16 ) + throw "Unsupported int base " + base; + var prefix = base == 2 ? "0b" : "0x"; + if( value == haxe.Int64.make(0,0) ) + return prefix + "0"; + var mask = base - 1; + var shift = base == 2 ? 1 : 4; + var maxlen = base == 2 ? (is32bit ? 32 : 64) : (is32bit ? 8 : 16); var s = ""; - var abs = value >= haxe.Int64.make(0,0) ? value : -value; + var positive = value >= haxe.Int64.make(0,0); + var abs = positive ? value : -(value+1); // 2's complement while( abs > 0 ) { - s = INTBASE.charAt(abs.low & 15) + s; - abs = abs >> 4; + var cur = positive ? (abs.low & mask) : (mask - abs.low & mask); + s = INTBASE.charAt(cur) + s; + abs = abs >> shift; + } + if( s.length < maxlen ) { + var lchar = positive ? "0" : (base == 2 ? "1" : "F"); + s = StringTools.lpad(s, lchar, maxlen); } - return (value < 0 ? "-" : "") + "0x" + s; + return prefix + s; } public static function intEnumFlags( value : Int, eproto : format.hl.Data.EnumPrototype ) : String {