forked from facelessuser/HexViewer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhex_common.py
executable file
·95 lines (76 loc) · 2.76 KB
/
hex_common.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
'''
Hex Viewer
Licensed under MIT
Copyright (c) 2011 Isaac Muse <[email protected]>
'''
import sublime
from os.path import basename
ADDRESS_OFFSET = 11
ASCII_OFFSET = 3
BITS_PER_BYTE = 8
hv_settings = sublime.load_settings('hex_viewer.sublime-settings')
hv_inspector_enable = hv_settings.get("inspector", False)
def is_enabled():
window = sublime.active_window()
if window == None:
return False
view = window.active_view()
if view == None:
return False
syntax = view.settings().get('syntax')
language = basename(syntax).replace('.tmLanguage', '').lower() if syntax != None else "plain text"
return (language == "hex")
def clear_edits(view):
view.add_regions(
"hex_edit",
[],
""
)
def is_hex_dirty(view):
return True if len(view.get_regions("hex_edit")) != 0 else False
def get_hex_char_range(group_size, bytes_wide):
return int((group_size * 2) * bytes_wide / (group_size) + bytes_wide / (group_size)) - 1
def get_byte_count(start, end, group_size):
return int((end - start - 1) / (group_size * 2 + 1)) * int(group_size) + int(((end - start - 1) % (group_size * 2 + 1)) / 2 + 1)
def ascii_to_hex_col(index, group_size):
# Calculate byte number Account for address
#
# current_char wanted_byte
# ------------ = ----------- => wanted_byte + offset = start_column
# total_chars total_bytes
#
start_column = int(ADDRESS_OFFSET + (group_size * 2) * index / (group_size) + index / (group_size))
# Convert byte column position to test point
return start_column
def adjust_hex_sel(view, start, end, group_size):
bytes = 0
size = end - start
if view.score_selector(start, 'raw.nibble.upper') == 0:
if view.score_selector(start, 'raw.nibble.lower'):
start -= 1
elif view.score_selector(start + 1, 'raw.nibble.upper') and size > 0:
start += 1
else:
start = None
# Adjust ending of selection to end of last selected byte
if size == 0 and start != None:
end = start + 1
bytes = 1
elif view.score_selector(end, 'raw.nibble.lower') == 0:
if view.score_selector(end - 1, 'raw.nibble.lower'):
end -= 1
else:
end -= 2
if start != None and end != None:
bytes = get_byte_count(start, end, group_size)
return start, end, bytes
def underline(selected_bytes):
# Convert to empty regions
new_regions = []
for region in selected_bytes:
start = region.begin()
end = region.end()
while start < end:
new_regions.append(sublime.Region(start))
start += 1
return new_regions