diff --git a/buffer.py b/buffer.py index 988dfdc..3607741 100644 --- a/buffer.py +++ b/buffer.py @@ -568,7 +568,7 @@ class Binary32Buffer(FileBuffer): groupsize = (((2 + self.bytepad) * self.groupsize) + self.grouppad) maxsize = groupsize * self.numgroups - self.grouppad if ix < maxsize: - return (ix // self.groupsize) * self.grouppad + ix * (2 + self.bytepad) + return (ix // self.groupsize) * (self.grouppad - 1) + ix * (2 + self.bytepad) else: return None def datax_to_cursory(self, ix): diff --git a/mode/hex.py b/mode/hex.py index 6842345..cf698eb 100644 --- a/mode/hex.py +++ b/mode/hex.py @@ -99,11 +99,53 @@ class HexOverwriteChar(Method): self.args = [] self.help = "Overwrite %r into the current hex buffer." % c self.char = c + self.part1, self.part2 = '%02x' % ord(self.char) def _execute(self, w, **vargs): - w.overwrite_char_at_cursor(self.char) + if w.mode.symbolic_edit: + b = w.buffer + hb = w.application.methods['hex-backward'] + (cx, cy) = w.cursor.xy() + ix = b.cursorx_to_datax(cy, cx) + cx2 = w.buffer.datax_to_cursorx(ix) + w.goto(Point(cx2, cy)) + w.overwrite_char_at_cursor(self.part1) + w.overwrite_char_at_cursor(self.part2) + elif self.char not in string.hexdigits: + return + else: + w.overwrite_char_at_cursor(self.char) end = w.buffer.get_buffer_end() while w.cursor_char().isspace() and w.cursor < end: w.forward() +class HexOverwriteSpace(HexOverwriteChar): + def __init__(self): + self.name = 'hex-overwrite-space' + self.args = [] + self.help = "Overwrite SPACE into the current hex buffer." + self.char = ' ' + self.part1, self.part2 = '%02x' % ord(self.char) +class HexOverwriteTab(HexOverwriteChar): + def __init__(self): + self.name = 'hex-overwrite-tab' + self.args = [] + self.help = "Overwrite TAB into the current hex buffer." + self.char = '\t' + self.part1, self.part2 = '%02x' % ord(self.char) +class HexOverwriteNewline(HexOverwriteChar): + def __init__(self): + self.name = 'hex-overwrite-newline' + self.args = [] + self.help = "Overwrite NEWLINE into the current hex buffer." + self.char = '\n' + self.part1, self.part2 = '%02x' % ord(self.char) + +class HexToggleSymbolic(Method): + def _execute(self, w, **vargs): + w.mode.symbolic_edit = not w.mode.symbolic_edit + if w.mode.symbolic_edit: + w.set_error("Symbolic editing enabled") + else: + w.set_error("Symbolic editing disabled") class ShowX86Instruction(Method): '''''' @@ -170,7 +212,8 @@ class Hex(mode.Fundamental): ctrans = ''.join(_ctrans) actions = [HexForward, HexBackward, HexForwardWord, HexBackwardWord, HexStartOfLine, HexEndOfLine, ShowAddress, ShowX86Instruction, - GotoAddress, HexSetByteOrder] + GotoAddress, HexSetByteOrder, HexToggleSymbolic, + HexOverwriteSpace, HexOverwriteTab, HexOverwriteNewline] def __init__(self, w): mode.Fundamental.__init__(self, w) self.bindings = {} @@ -257,8 +300,12 @@ class Hex(mode.Fundamental): # create all the insert actions for the basic text input for c in string.letters + string.digits + string.punctuation: - if c in string.hexdigits: - self.add_action_and_bindings(HexOverwriteChar(c), (c,)) + self.add_action_and_bindings(HexOverwriteChar(c), (c,)) + self.add_bindings('hex-overwrite-space', ('SPACE',)) + self.add_bindings('hex-overwrite-tab', ('TAB',)) + self.add_bindings('hex-overwrite-newline', ('RETURN',)) + + self.symbolic_edit = False def get_address(self, y, x): return (y * 16) + x