branch : pmacs2
This commit is contained in:
moculus 2008-04-11 13:50:13 +00:00
parent fee6b2026a
commit 50cc5a4bc7
2 changed files with 90 additions and 58 deletions

View File

@ -2,8 +2,6 @@ import datetime, grp, md5, os, pwd, re, sets, shutil, stat, string
import aes, dirutil, regex, highlight, lex import aes, dirutil, regex, highlight, lex
from point import Point from point import Point
#from point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Pointfrom point import Point
# undo/redo stack constants # undo/redo stack constants
ACT_NORM = 0 ACT_NORM = 0
ACT_UNDO = 1 ACT_UNDO = 1
@ -261,8 +259,6 @@ class Buffer(object):
# insertion into buffer # insertion into buffer
def insert_lines(self, p, lines, act=ACT_NORM, force=False): def insert_lines(self, p, lines, act=ACT_NORM, force=False):
#if lines == ['(']:
# raise Exception, "damn"
llen = len(lines) llen = len(lines)
assert llen > 0 assert llen > 0
if not force and self.readonly(): if not force and self.readonly():
@ -436,7 +432,6 @@ class FileBuffer(Buffer):
# methods for dealing with the underlying resource, etc. # methods for dealing with the underlying resource, etc.
def name(self): def name(self):
#return self.path
return self._name return self._name
def path_exists(self): def path_exists(self):
return os.path.exists(self.path) return os.path.exists(self.path)
@ -522,6 +517,7 @@ class Binary32Buffer(FileBuffer):
numgroups = 2 numgroups = 2
bytepad = 1 bytepad = 1
data = None data = None
wordsize = 4
def __init__(self, path, nl='\n', name=None): def __init__(self, path, nl='\n', name=None):
'''fb = FileBuffer(path)''' '''fb = FileBuffer(path)'''
FileBuffer.__init__(self, path, nl, name) FileBuffer.__init__(self, path, nl, name)
@ -565,6 +561,7 @@ class Binary32Buffer(FileBuffer):
c = chr(int(self.lines[p.y][cx:cx + 2], 16)) c = chr(int(self.lines[p.y][cx:cx + 2], 16))
rawline = self.rawdata[p.y] rawline = self.rawdata[p.y]
self.rawdata[p.y] = rawline[0:ix] + c + rawline[ix + 1:] self.rawdata[p.y] = rawline[0:ix] + c + rawline[ix + 1:]
def read_filter(self, data): def read_filter(self, data):
bytepad = ' ' * self.bytepad bytepad = ' ' * self.bytepad
grouppad = ' ' * self.grouppad grouppad = ' ' * self.grouppad

View File

@ -1,4 +1,4 @@
import string import string, struct
import color, mode import color, mode
from lex import Grammar, PatternRule, RegionRule from lex import Grammar, PatternRule, RegionRule
from method import Method, Argument from method import Method, Argument
@ -6,9 +6,12 @@ from point import Point
class Hex(mode.Fundamental): class Hex(mode.Fundamental):
modename = 'Hex' modename = 'Hex'
lmargin = 12 lmargin = 12
rmargin = 18 rmargin = 18
_ctrans = ['.'] * 256 _ctrans = ['.'] * 256
cgreen = color.build('green', 'default', 'bold')
ccyan = color.build('cyan', 'default', 'bold')
ccursor = color.build('default', 'default', 'bold', 'reverse')
for c in string.letters + string.digits + string.punctuation + ' ': for c in string.letters + string.digits + string.punctuation + ' ':
_ctrans[ord(c)] = c _ctrans[ord(c)] = c
ctrans = ''.join(_ctrans) ctrans = ''.join(_ctrans)
@ -16,10 +19,6 @@ class Hex(mode.Fundamental):
mode.Fundamental.__init__(self, w) mode.Fundamental.__init__(self, w)
self.bindings = {} self.bindings = {}
self.add_bindings('start-of-line', ('C-a', 'HOME',))
self.add_bindings('end-of-line', ('C-e', 'END',))
#self.add_bindings('backward', ('C-b', 'L_ARROW',))
#self.add_bindings('forward', ('C-f', 'R_ARROW',))
self.add_bindings('center-view', ('C-l',)) self.add_bindings('center-view', ('C-l',))
self.add_bindings('next-line', ('C-n', 'D_ARROW',)) self.add_bindings('next-line', ('C-n', 'D_ARROW',))
self.add_bindings('previous-line', ('C-p', 'U_ARROW',)) self.add_bindings('previous-line', ('C-p', 'U_ARROW',))
@ -29,16 +28,6 @@ class Hex(mode.Fundamental):
self.add_bindings('page-up', ('M-v', 'PG_UP',)) self.add_bindings('page-up', ('M-v', 'PG_UP',))
self.add_bindings('goto-beginning', ('M-<',)) self.add_bindings('goto-beginning', ('M-<',))
self.add_bindings('goto-end', ('M->',)) self.add_bindings('goto-end', ('M->',))
#self.add_bindings('delete-left', ('DELETE', 'BACKSPACE',))
#self.add_bindings('delete-left-word', ('M-DELETE', 'M-BACKSPACE',))
#self.add_bindings('delete-right', ('C-d',))
#self.add_bindings('delete-right-word', ('M-d',))
#self.add_bindings('kill-region', ('C-w',))
#self.add_bindings('copy-region', ('M-w',))
#self.add_bindings('kill', ('C-k',))
#self.add_bindings('copy', ('M-k',))
#self.add_bindings('yank', ('C-y',))
#self.add_bindings('pop-kill', ('M-y',))
self.add_bindings('right-word', ('M-f',)) self.add_bindings('right-word', ('M-f',))
self.add_bindings('left-word', ('M-b',)) self.add_bindings('left-word', ('M-b',))
self.add_bindings('set-mark', ('C-@',)) self.add_bindings('set-mark', ('C-@',))
@ -54,34 +43,16 @@ class Hex(mode.Fundamental):
self.add_bindings('regex-search', ('M-C-s',)) self.add_bindings('regex-search', ('M-C-s',))
self.add_bindings('regex-reverse-search', ('M-C-r',)) self.add_bindings('regex-reverse-search', ('M-C-r',))
self.add_bindings('toggle-margins', ('M-m',)) self.add_bindings('toggle-margins', ('M-m',))
#self.add_bindings('replace', ('M-%',))
#self.add_bindings('regex-replace', ('M-$',))
self.add_bindings('open-file', ('C-x C-f',)) self.add_bindings('open-file', ('C-x C-f',))
self.add_bindings('kill-buffer', ('C-x k',)) self.add_bindings('kill-buffer', ('C-x k',))
self.add_bindings('list-buffers', ('C-x C-b',)) self.add_bindings('list-buffers', ('C-x C-b',))
self.add_bindings('meta-x', ('M-x',)) self.add_bindings('meta-x', ('M-x',))
#self.add_bindings('wrap-line', ('M-q',))
#self.add_bindings('transpose-words', ('M-t',))
self.add_bindings('save-buffer', ('C-x C-s',)) self.add_bindings('save-buffer', ('C-x C-s',))
self.add_bindings('save-buffer-as', ('C-x C-w',)) self.add_bindings('save-buffer-as', ('C-x C-w',))
#self.add_bindings('relex-buffer', ('M-r',))
self.add_bindings('exit', ('C-x C-c',)) self.add_bindings('exit', ('C-x C-c',))
self.add_bindings('split-window', ('C-x s', 'C-x 2',)) self.add_bindings('split-window', ('C-x s', 'C-x 2',))
self.add_bindings('unsplit-window', ('C-u s', 'C-x 1',)) self.add_bindings('unsplit-window', ('C-u s', 'C-x 1',))
self.add_bindings('toggle-window', ('C-x o',)) self.add_bindings('toggle-window', ('C-x o',))
#self.add_bindings('delete-left-whitespace', ('C-c DELETE', 'C-c BACKSPACE',))
#self.add_bindings('delete-right-whitespace', ('C-c d',))
#self.add_bindings('insert-space', ('SPACE',))
#self.add_bindings('insert-tab', ('TAB',))
#self.add_bindings('insert-newline', ('RETURN',))
#self.add_bindings('comment-region', ('C-c #',))
#self.add_bindings('uncomment-region', ('C-u C-c #',))
#self.add_bindings('justify-right', ('C-c f',))
#self.add_bindings('justify-left', ('C-c b',))
#self.add_bindings('indent-block', ('C-c >',))
#self.add_bindings('unindent-block', ('C-c <',))
#self.add_bindings('token-complete', ('M-c', 'C-c c', 'C-c TAB',))
#self.add_bindings('open-aes-file', ('C-c a',))
self.add_bindings('open-console', ('M-e',)) self.add_bindings('open-console', ('M-e',))
self.add_bindings('show-bindings-buffer', ('C-c M-h',)) self.add_bindings('show-bindings-buffer', ('C-c M-h',))
self.add_bindings('show-functions-buffer', ('C-c M-?',)) self.add_bindings('show-functions-buffer', ('C-c M-?',))
@ -93,16 +64,21 @@ class Hex(mode.Fundamental):
self.add_bindings('grep', ('C-c g',)) self.add_bindings('grep', ('C-c g',))
self.add_bindings('pipe', ('C-c p', 'C-c |')) self.add_bindings('pipe', ('C-c p', 'C-c |'))
self.add_bindings('view-buffer-parent', ('C-c .',)) self.add_bindings('view-buffer-parent', ('C-c .',))
#self.add_bindings('insert-squotes', ('M-\'',))
#self.add_bindings('insert-dquotes', ('M-"',))
self.add_bindings('get-token', ('C-c t',)) self.add_bindings('get-token', ('C-c t',))
#self.add_bindings('insert-text', ('C-c i',))
#self.add_bindings('insert-text2', ('C-c M-i',))
#self.add_bindings('insert-multiline-text', ('C-c m',))
self.add_action_and_bindings(HexForward(), ('C-f', 'R_ARROW',)) self.add_action_and_bindings(HexForward(), ('C-f', 'R_ARROW',))
self.add_action_and_bindings(HexBackward(), ('C-b', 'L_ARROW',)) self.add_action_and_bindings(HexBackward(), ('C-b', 'L_ARROW',))
self.add_action_and_bindings(HexForwardWord(), ('M-f', 'M-R_ARROW',))
self.add_action_and_bindings(HexBackwardWord(), ('M-b', 'M-L_ARROW',))
self.add_action_and_bindings(HexStartOfLine(), ('C-a', 'HOME',))
self.add_action_and_bindings(HexEndOfLine(), ('C-e', 'END',))
self.add_action_and_bindings(GotoWord(), ('M-g',)) self.add_action_and_bindings(GotoWord(), ('M-g',))
self.add_action_and_bindings(HexReadAligned('int', 'i'), ('C-c i',))
self.add_action_and_bindings(HexReadAligned('uint', 'I'), ('C-c I',))
self.add_action_and_bindings(HexReadAligned('long', 'l'), ('C-c l',))
self.add_action_and_bindings(HexReadAligned('ulong', 'L'), ('C-c L',))
self.add_action_and_bindings(HexReadAligned('float', 'f'), ('C-c f',))
self.add_action_and_bindings(HexReadAligned('double', 'd'), ('C-c d',))
self.add_action(FindStrings()) self.add_action(FindStrings())
self.add_action(WhichWord()) self.add_action(WhichWord())
@ -110,13 +86,19 @@ class Hex(mode.Fundamental):
for c in string.letters + string.digits + string.punctuation: for c in string.letters + string.digits + string.punctuation:
if c in string.hexdigits: if c in string.hexdigits:
self.add_action_and_bindings(HexOverwriteChar(c), (c,)) self.add_action_and_bindings(HexOverwriteChar(c), (c,))
def get_address(self, y, x):
return (y * 16) + x
def get_lmargin(self, y, x=0, ended=False, cont=False): def get_lmargin(self, y, x=0, ended=False, cont=False):
lm = self.lmargin lm = self.lmargin
if ended: if ended:
s = ' -------- ' s = ' -------- '
elif x == 0: else:
s = '0x%08x ' % (y * 16) addr = self.get_address(y, x)
return ((0, s, color.build('cyan', 'default', 'bold')),) s = '0x%08x ' % addr
return ((0, s, self.ccyan),)
def get_rmargin(self, y, x=0, ended=False, cont=False): def get_rmargin(self, y, x=0, ended=False, cont=False):
if ended: if ended:
return ((0, '', 0),) return ((0, '', 0),)
@ -127,16 +109,17 @@ class Hex(mode.Fundamental):
i = self.window.buffer.cursorx_to_datax(cy, cx) i = self.window.buffer.cursorx_to_datax(cy, cx)
if i is None: if i is None:
return ((0, s, color.build('green', 'default', 'bold')),) rmargins = ((0, s, self.cgreen),)
elif i < len(s) - 1: elif i < len(s):
return ((0, s[0:i], color.build('green', 'default', 'bold')), rmargins = ((0, s[0:i], self.cgreen),
(i, s[i], color.build('default', 'default', 'bold', 'reverse')), (i, s[i], self.ccursor),
(i + 1, s[i+1:], color.build('green', 'default', 'bold'))) (i + 1, s[i+1:], self.cgreen))
else: else:
return ((0, s[0:i], color.build('green', 'default', 'bold')), rmargins= ((0, s[0:i], self.cgreen),
(i, s[i], color.build('default', 'default', 'bold', 'reverse'))) (i, s[i], self.cgreen),)
return rmargins
else: else:
return ((0, s, color.build('green', 'default', 'bold')),) return ((0, s, self.cgreen),)
class HexForward(Method): class HexForward(Method):
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
@ -144,7 +127,6 @@ class HexForward(Method):
end = w.buffer.get_buffer_end() end = w.buffer.get_buffer_end()
while w.cursor_char().isspace() and w.cursor < end: while w.cursor_char().isspace() and w.cursor < end:
w.forward() w.forward()
class HexBackward(Method): class HexBackward(Method):
def _execute(self, w, **vargs): def _execute(self, w, **vargs):
w.backward() w.backward()
@ -152,6 +134,59 @@ class HexBackward(Method):
while w.cursor_char().isspace() and w.cursor > start: while w.cursor_char().isspace() and w.cursor > start:
w.backward() w.backward()
class HexForwardWord(Method):
def _execute(self, w, **vargs):
hf = w.application.methods['hex-forward']
for i in range(0, w.buffer.wordsize * 2):
hf.execute(w, **vargs)
class HexBackwardWord(Method):
def _execute(self, w, **vargs):
hb = w.application.methods['hex-backward']
for i in range(0, w.buffer.wordsize * 2):
hb.execute(w, **vargs)
class HexStartOfLine(Method):
'''Move the cursor to the start of the current hex line'''
def _execute(self, w, **vargs):
w.start_of_line()
class HexEndOfLine(Method):
'''Move the cursor to the end of the current hex line'''
def _execute(self, w, **vargs):
w.end_of_line()
if w.cursor_char() == '\n':
w.backward()
class HexReadAligned(Method):
_is_method = False
def __init__(self, type_, fmt):
self.name = 'hex-read-aligned-%s' % type_.lower()
self.type_ = type_
self.fmt = fmt
self.size = struct.calcsize(fmt)
self.args = []
self.help = "Read %r from word-aligned address in the current buffer." % self.type_
def _execute(self, w, **vargs):
b = w.buffer
hb = w.application.methods['hex-backward']
(cx, cy) = w.cursor.xy()
ix = b.cursorx_to_datax(cy, cx)
ix -= ix % b.wordsize
s = b.rawdata[cy][ix:]
if len(s) < self.size:
if cy < len(b.rawdata) - 1:
s += b.rawdata[cy + 1]
else:
w.set_error("not enough data to read %s" % self.type_)
return
s = s[:self.size]
try:
v = struct.unpack(self.fmt, s)[0]
addr = w.mode.get_address(cy, 0) + ix
w.set_error("%s at 0x%08x: %r" % (self.type_, addr, v))
except:
raise
w.set_error("%s could not be read" % self.type_)
class HexOverwriteChar(Method): class HexOverwriteChar(Method):
_is_method = False _is_method = False
def __init__(self, c): def __init__(self, c):