hexdump: skip lines if the content is the same
This commit is contained in:
parent
f31e2137ac
commit
430ed6e34d
2 changed files with 33 additions and 11 deletions
40
over/misc.py
40
over/misc.py
|
@ -110,7 +110,7 @@ def debugger():
|
||||||
|
|
||||||
# --------------------------------------------------
|
# --------------------------------------------------
|
||||||
|
|
||||||
def hexdump(data, indent=0, width=16, show_header=True, show_offsets=True, show_ascii=True, use_colors=True, initial_offset=0, output=sys.stdout):
|
def hexdump(data, indent=0, width=16, show_header=True, show_offsets=True, show_ascii=True, use_colors=True, initial_offset=0, output=sys.stdout, skip_same=True):
|
||||||
"""
|
"""
|
||||||
Writes a hex dump of `data` to `output`.
|
Writes a hex dump of `data` to `output`.
|
||||||
|
|
||||||
|
@ -120,6 +120,7 @@ def hexdump(data, indent=0, width=16, show_header=True, show_offsets=True, show_
|
||||||
If `show_ascii` is True, each line is suffixed with its ASCII representation. Unprintable characters
|
If `show_ascii` is True, each line is suffixed with its ASCII representation. Unprintable characters
|
||||||
are replaced with a dot.
|
are replaced with a dot.
|
||||||
The `output` must implement a .write(str x) method. If `output` is None, the string is returned instead.
|
The `output` must implement a .write(str x) method. If `output` is None, the string is returned instead.
|
||||||
|
If `skip_same` is True, lines with identical content are abbreviated (omitted).
|
||||||
|
|
||||||
@while creating a hex dump
|
@while creating a hex dump
|
||||||
"""
|
"""
|
||||||
|
@ -153,13 +154,10 @@ def hexdump(data, indent=0, width=16, show_header=True, show_offsets=True, show_
|
||||||
|
|
||||||
output_io.write(" ".join(line) + "\n")
|
output_io.write(" ".join(line) + "\n")
|
||||||
|
|
||||||
|
skip_cnt = 0
|
||||||
|
last_hex_bytes = None
|
||||||
|
|
||||||
while data[ptr:]:
|
while data[ptr:]:
|
||||||
if indent:
|
|
||||||
output_io.write(" " * indent)
|
|
||||||
|
|
||||||
if show_offsets:
|
|
||||||
output_io.write(format_str %(initial_offset + ptr))
|
|
||||||
|
|
||||||
hex_bytes = []
|
hex_bytes = []
|
||||||
ascii_bytes = []
|
ascii_bytes = []
|
||||||
|
|
||||||
|
@ -175,6 +173,29 @@ def hexdump(data, indent=0, width=16, show_header=True, show_offsets=True, show_
|
||||||
elif i == len(data):
|
elif i == len(data):
|
||||||
hex_bytes.extend([" "] * (width - local_i))
|
hex_bytes.extend([" "] * (width - local_i))
|
||||||
|
|
||||||
|
ptr += width
|
||||||
|
|
||||||
|
# the rest is just rendering
|
||||||
|
if skip_same:
|
||||||
|
if hex_bytes == last_hex_bytes:
|
||||||
|
skip_cnt += 1
|
||||||
|
else:
|
||||||
|
if skip_cnt:
|
||||||
|
output_io.write("(skipped %d lines, %d B)\n" %(skip_cnt, skip_cnt * width))
|
||||||
|
|
||||||
|
skip_cnt = 0
|
||||||
|
|
||||||
|
last_hex_bytes = hex_bytes
|
||||||
|
|
||||||
|
if skip_cnt:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if indent:
|
||||||
|
output_io.write(" " * indent)
|
||||||
|
|
||||||
|
if show_offsets:
|
||||||
|
output_io.write(format_str %(initial_offset + ptr))
|
||||||
|
|
||||||
if use_colors: output_io.write(text.render("<W>"))
|
if use_colors: output_io.write(text.render("<W>"))
|
||||||
output_io.write(" ".join(hex_bytes))
|
output_io.write(" ".join(hex_bytes))
|
||||||
if use_colors: output_io.write(text.render("<.>"))
|
if use_colors: output_io.write(text.render("<.>"))
|
||||||
|
@ -185,8 +206,9 @@ def hexdump(data, indent=0, width=16, show_header=True, show_offsets=True, show_
|
||||||
output_io.write(text.render("<.>|") if use_colors else "|")
|
output_io.write(text.render("<.>|") if use_colors else "|")
|
||||||
|
|
||||||
output_io.write("\n")
|
output_io.write("\n")
|
||||||
|
|
||||||
ptr += width
|
if skip_cnt:
|
||||||
|
output_io.write("(skipped %d lines, %d B)\n" %(skip_cnt, skip_cnt * width))
|
||||||
|
|
||||||
if not output:
|
if not output:
|
||||||
output_io.seek(0)
|
output_io.seek(0)
|
||||||
|
|
|
@ -4,5 +4,5 @@
|
||||||
major = 2 # VERSION_MAJOR_IDENTIFIER
|
major = 2 # VERSION_MAJOR_IDENTIFIER
|
||||||
minor = 1 # VERSION_MINOR_IDENTIFIER
|
minor = 1 # VERSION_MINOR_IDENTIFIER
|
||||||
# VERSION_LAST_MM 2.1
|
# VERSION_LAST_MM 2.1
|
||||||
patch = 0 # VERSION_PATCH_IDENTIFIER
|
patch = 1 # VERSION_PATCH_IDENTIFIER
|
||||||
str = "2.1.0" # VERSION_STRING_IDENTIFIER
|
str = "2.1.1" # VERSION_STRING_IDENTIFIER
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue