mirror of
https://github.com/AsahiLinux/m1n1
synced 2024-11-26 16:30:17 +00:00
m1n1.utils: Add chexdiff32()
Signed-off-by: Asahi Lina <lina@asahilina.net>
This commit is contained in:
parent
e3d5f70244
commit
9a39bf15ef
1 changed files with 52 additions and 0 deletions
|
@ -47,6 +47,58 @@ def chexdump(s, st=0, abbreviate=True, stride=16, indent="", print_fn=print):
|
||||||
last = val
|
last = val
|
||||||
skip = False
|
skip = False
|
||||||
|
|
||||||
|
def chexdiff32(prev, cur, ascii=True, offset=0, offset2=None):
|
||||||
|
assert len(cur) % 4 == 0
|
||||||
|
count = len(cur) // 4
|
||||||
|
words = struct.unpack("<%dI" % count, cur)
|
||||||
|
|
||||||
|
if prev is None:
|
||||||
|
last = None
|
||||||
|
else:
|
||||||
|
assert len(prev) == len(cur)
|
||||||
|
last = struct.unpack("<%dI" % count, prev)
|
||||||
|
|
||||||
|
row = 8
|
||||||
|
skipping = False
|
||||||
|
out = []
|
||||||
|
for i in range(0, count, row):
|
||||||
|
off_text = f"{offset + i * 4:016x}"
|
||||||
|
if offset2 is not None:
|
||||||
|
off_text += f"/{offset2 + i * 4:08x}"
|
||||||
|
if not last:
|
||||||
|
if i != 0 and words[i:i+row] == words[i-row:i]:
|
||||||
|
if not skipping:
|
||||||
|
out.append(f"{off_text} *\n")
|
||||||
|
skipping = True
|
||||||
|
else:
|
||||||
|
out.append(f"{off_text} ")
|
||||||
|
for new in words[i:i+row]:
|
||||||
|
out.append("%08x " % new)
|
||||||
|
if ascii:
|
||||||
|
out.append("| " + _ascii(cur[4*i:4*(i+row)]))
|
||||||
|
out.append("\n")
|
||||||
|
skipping = False
|
||||||
|
elif last[i:i+row] != words[i:i+row]:
|
||||||
|
out.append(f"{off_text} ")
|
||||||
|
for old, new in zip(last[i:i+row], words[i:i+row]):
|
||||||
|
so = "%08x" % old
|
||||||
|
sn = s = "%08x" % new
|
||||||
|
if old != new:
|
||||||
|
s = "\x1b[32m"
|
||||||
|
ld = False
|
||||||
|
for a,b in zip(so, sn):
|
||||||
|
d = a != b
|
||||||
|
if ld != d:
|
||||||
|
s += "\x1b[31;1;4m" if d else "\x1b[32m"
|
||||||
|
ld = d
|
||||||
|
s += b
|
||||||
|
s += "\x1b[m"
|
||||||
|
out.append(s + " ")
|
||||||
|
if ascii:
|
||||||
|
out.append("| " + _ascii(cur[4*i:4*(i+row)]))
|
||||||
|
out.append("\n")
|
||||||
|
return "".join(out)
|
||||||
|
|
||||||
_extascii_table_low = [
|
_extascii_table_low = [
|
||||||
"▪", "☺", "☻", "♥", "♦", "♣", "♠", "•",
|
"▪", "☺", "☻", "♥", "♦", "♣", "♠", "•",
|
||||||
"◘", "○", "◙", "♂", "♀", "♪", "♫", "☼",
|
"◘", "○", "◙", "♂", "♀", "♪", "♫", "☼",
|
||||||
|
|
Loading…
Reference in a new issue