fixed hex-mode bug and added symbolic editing

--HG--
branch : pmacs2
This commit is contained in:
moculus 2008-04-19 23:08:40 +00:00
parent 9b6659c7b9
commit 298d011154
2 changed files with 52 additions and 5 deletions

View File

@ -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):

View File

@ -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):
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_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