hex mode and binary mode

--HG--
branch : pmacs2
This commit is contained in:
moculus 2007-10-12 20:26:17 +00:00
parent 810bbce37c
commit 5694f12910
3 changed files with 75 additions and 7 deletions

View File

@ -13,7 +13,7 @@ import mode.console, mode.consolemini
import mode.c, mode.python, mode.perl, mode.nasm, mode.sh, mode.sql, mode.java import mode.c, mode.python, mode.perl, mode.nasm, mode.sh, mode.sql, mode.java
import mode.lisp, mode.elisp, mode.scheme, mode.ocaml import mode.lisp, mode.elisp, mode.scheme, mode.ocaml
import mode.blame, mode.diff, mode.dir import mode.blame, mode.diff, mode.dir
import mode.xml, mode.tt, mode.css, mode.javascript, mode.html import mode.xml, mode.tt, mode.css, mode.javascript, mode.html, mode.hex
import mode.text, mode.text2, mode.mutt import mode.text, mode.text2, mode.mutt
import mode.bds import mode.bds
import mode.rst import mode.rst
@ -111,6 +111,7 @@ class Application(object):
'bds': mode.bds.BDS, 'bds': mode.bds.BDS,
'rst': mode.rst.RST, 'rst': mode.rst.RST,
'java': mode.java.Java, 'java': mode.java.Java,
'hex': mode.hex.Hex,
'ocaml': mode.ocaml.Ocaml, 'ocaml': mode.ocaml.Ocaml,
@ -260,7 +261,7 @@ class Application(object):
return (slot.height, slot.width) return (slot.height, slot.width)
# files and stuff # files and stuff
def open_path(self, path, cipher=None, password=None): def open_path(self, path, binary=False, cipher=None, password=None):
path = os.path.abspath(os.path.realpath(util.expand_tilde(path))) path = os.path.abspath(os.path.realpath(util.expand_tilde(path)))
b = self.get_buffer_by_path(path) b = self.get_buffer_by_path(path)
if b is None: if b is None:
@ -276,6 +277,9 @@ class Application(object):
mode_name = None mode_name = None
if cipher is None: if cipher is None:
if not os.path.exists(path) or os.path.isfile(path): if not os.path.exists(path) or os.path.isfile(path):
if binary:
b = buffer2.BinaryBuffer(path, name=name)
else:
b = buffer2.FileBuffer(path, name=name) b = buffer2.FileBuffer(path, name=name)
elif os.path.isdir(path): elif os.path.isdir(path):
b = buffer2.DirBuffer(path, name=name) b = buffer2.DirBuffer(path, name=name)
@ -786,8 +790,11 @@ def open_aes_file(path, nl, name=None):
return buffer2.AesBuffer(path, p, nl, name) return buffer2.AesBuffer(path, p, nl, name)
else: else:
raise Exception, "can't open %r; unsupported file type" % path raise Exception, "can't open %r; unsupported file type" % path
def open_plain_file(path, nl, name=None): def open_plain_file(path, nl, name=None, binary=False):
if os.path.isfile(path) or not os.path.exists(path): if os.path.isfile(path) or not os.path.exists(path):
if binary:
return buffer2.BinaryBuffer(path, nl, name)
else:
return buffer2.FileBuffer(path, nl, name) return buffer2.FileBuffer(path, nl, name)
elif os.path.isdir(path): elif os.path.isdir(path):
return buffer2.DirBuffer(path, nl, name) return buffer2.DirBuffer(path, nl, name)
@ -806,7 +813,10 @@ if __name__ == "__main__":
parser.set_defaults(mode=None) parser.set_defaults(mode=None)
parser.set_defaults(cipher='none') parser.set_defaults(cipher='none')
parser.set_defaults(linetype='unix') parser.set_defaults(linetype='unix')
parser.set_defaults(binary=False)
parser.add_option('-b', '--binary', dest='binary', action='store_true',
help='open file(s) in hex binary mode')
parser.add_option('-d', '--debug', dest='debug', action='store_true', parser.add_option('-d', '--debug', dest='debug', action='store_true',
help='run in debug mode') help='run in debug mode')
parser.add_option('-e', '--encrypt', dest='cipher', metavar='CIPHER', parser.add_option('-e', '--encrypt', dest='cipher', metavar='CIPHER',
@ -863,7 +873,7 @@ if __name__ == "__main__":
i += 1 i += 1
auxname = '%s/%d' % (name, i) auxname = '%s/%d' % (name, i)
name = auxname name = auxname
b = f(path, nl, name) b = f(path, nl, name, opts.binary)
b.open() b.open()
buffers.append(b) buffers.append(b)
paths.add(path) paths.add(path)

View File

@ -1,4 +1,4 @@
import datetime, grp, md5, os, pwd, re, sets, shutil, stat import datetime, grp, md5, os, pwd, re, sets, shutil, stat, string
import aes, dirutil, regex, highlight2 import aes, dirutil, regex, highlight2
from point2 import Point from point2 import Point
@ -478,6 +478,43 @@ class AesBuffer(FileBuffer):
def write_filter(self, data): def write_filter(self, data):
return aes.encrypt_data(data, self.password) return aes.encrypt_data(data, self.password)
class BinaryBuffer(FileBuffer):
btype = 'binfile'
def __init__(self, path, nl='\n', name=None, numbytes=2):
'''fb = FileBuffer(path)'''
FileBuffer.__init__(self, path, nl, name)
self.numbytes = numbytes
def read_filter(self, data):
lines = []
i = 0
while i < len(data):
j = 0
words = []
while j < self.numbytes * 8 and i + j < len(data):
nibbles = []
for c in data[i + j:i + j + 8]:
nibbles.append(string.hexdigits[ord(c) / 16])
nibbles.append(string.hexdigits[ord(c) % 16])
words.append(''.join(nibbles))
j += 8
lines.append(' '.join(words))
i += self.numbytes * 8
return '\n'.join(lines)
def write_filter(self, data):
bytes = []
lastc = None
for c in data:
if c not in '0123456789abcdefABCDEF':
pass
elif lastc is None:
lastc = c
else:
bytes.append(chr(int(lastc + c, 16)))
lastc = None
if lastc is not None:
bytes.append(chr(int(lastc + '0', 16)))
return ''.join(bytes)
class DirBuffer(Buffer): class DirBuffer(Buffer):
btype = 'dir' btype = 'dir'
def __init__(self, path, nl='\n', name=None): def __init__(self, path, nl='\n', name=None):

21
mode/hex.py Normal file
View File

@ -0,0 +1,21 @@
import color, mode2
from lex3 import Grammar, PatternRule, RegionRule
class HexGrammar(Grammar):
rules = [
PatternRule(r'zero', r"00"),
PatternRule(r'printable', r"[2-7][0-9a-f]"),
PatternRule(r'byte', r'[0-f][0-f]'),
]
class Hex(mode2.Fundamental):
grammar = HexGrammar
colors = {
'zero': ('magenta', 'default'),
'printable': ('green', 'default'),
'byte': ('white', 'default'),
}
def __init__(self, w):
mode2.Fundamental.__init__(self, w)
def name(self):
return "Hex"