diff --git a/over/misc.py b/over/misc.py index af8e526..1273090 100644 --- a/over/misc.py +++ b/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`. @@ -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 are replaced with a dot. 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 """ @@ -153,13 +154,10 @@ def hexdump(data, indent=0, width=16, show_header=True, show_offsets=True, show_ output_io.write(" ".join(line) + "\n") + skip_cnt = 0 + last_hex_bytes = None + while data[ptr:]: - if indent: - output_io.write(" " * indent) - - if show_offsets: - output_io.write(format_str %(initial_offset + ptr)) - hex_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): 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("")) output_io.write(" ".join(hex_bytes)) 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("\n") - - ptr += width + + if skip_cnt: + output_io.write("(skipped %d lines, %d B)\n" %(skip_cnt, skip_cnt * width)) if not output: output_io.seek(0) diff --git a/over/version.py b/over/version.py index e60543e..c9378ec 100644 --- a/over/version.py +++ b/over/version.py @@ -4,5 +4,5 @@ major = 2 # VERSION_MAJOR_IDENTIFIER minor = 1 # VERSION_MINOR_IDENTIFIER # VERSION_LAST_MM 2.1 -patch = 0 # VERSION_PATCH_IDENTIFIER -str = "2.1.0" # VERSION_STRING_IDENTIFIER +patch = 1 # VERSION_PATCH_IDENTIFIER +str = "2.1.1" # VERSION_STRING_IDENTIFIER