mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Whitespace normalization.
This commit is contained in:
parent
a888540593
commit
70c4378dbc
57 changed files with 2434 additions and 2440 deletions
14
Lib/shlex.py
14
Lib/shlex.py
|
@ -1,14 +1,14 @@
|
||||||
"""A lexical analyzer class for simple shell-like syntaxes."""
|
"""A lexical analyzer class for simple shell-like syntaxes."""
|
||||||
|
|
||||||
# Module and documentation by Eric S. Raymond, 21 Dec 1998
|
# Module and documentation by Eric S. Raymond, 21 Dec 1998
|
||||||
# Input stacking and error message cleanup added by ESR, March 2000
|
# Input stacking and error message cleanup added by ESR, March 2000
|
||||||
# push_source() and pop_source() made explicit by ESR, January 2001.
|
# push_source() and pop_source() made explicit by ESR, January 2001.
|
||||||
|
|
||||||
import os.path
|
import os.path
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
class shlex:
|
class shlex:
|
||||||
"A lexical analyzer class for simple shell-like syntaxes."
|
"A lexical analyzer class for simple shell-like syntaxes."
|
||||||
def __init__(self, instream=None, infile=None):
|
def __init__(self, instream=None, infile=None):
|
||||||
if instream:
|
if instream:
|
||||||
self.instream = instream
|
self.instream = instream
|
||||||
|
@ -101,7 +101,7 @@ class shlex:
|
||||||
self.lineno = self.lineno + 1
|
self.lineno = self.lineno + 1
|
||||||
if self.debug >= 3:
|
if self.debug >= 3:
|
||||||
print "shlex: in state", repr(self.state), \
|
print "shlex: in state", repr(self.state), \
|
||||||
"I see character:", repr(nextchar)
|
"I see character:", repr(nextchar)
|
||||||
if self.state is None:
|
if self.state is None:
|
||||||
self.token = '' # past end of file
|
self.token = '' # past end of file
|
||||||
break
|
break
|
||||||
|
@ -136,14 +136,14 @@ class shlex:
|
||||||
if nextchar == self.state:
|
if nextchar == self.state:
|
||||||
self.state = ' '
|
self.state = ' '
|
||||||
break
|
break
|
||||||
elif not nextchar: # end of file
|
elif not nextchar: # end of file
|
||||||
if self.debug >= 2:
|
if self.debug >= 2:
|
||||||
print "shlex: I see EOF in quotes state"
|
print "shlex: I see EOF in quotes state"
|
||||||
# XXX what error should be raised here?
|
# XXX what error should be raised here?
|
||||||
raise ValueError, "No closing quotation"
|
raise ValueError, "No closing quotation"
|
||||||
elif self.state == 'a':
|
elif self.state == 'a':
|
||||||
if not nextchar:
|
if not nextchar:
|
||||||
self.state = None # end of file
|
self.state = None # end of file
|
||||||
break
|
break
|
||||||
elif nextchar in self.whitespace:
|
elif nextchar in self.whitespace:
|
||||||
if self.debug >= 2:
|
if self.debug >= 2:
|
||||||
|
@ -194,7 +194,7 @@ class shlex:
|
||||||
return "\"%s\", line %d: " % (infile, lineno)
|
return "\"%s\", line %d: " % (infile, lineno)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
if len(sys.argv) == 1:
|
if len(sys.argv) == 1:
|
||||||
lexer = shlex()
|
lexer = shlex()
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -28,7 +28,7 @@ class CallTip:
|
||||||
background="#ffffe0", relief=SOLID, borderwidth=1,
|
background="#ffffe0", relief=SOLID, borderwidth=1,
|
||||||
font = self.widget['font'])
|
font = self.widget['font'])
|
||||||
label.pack()
|
label.pack()
|
||||||
|
|
||||||
def hidetip(self):
|
def hidetip(self):
|
||||||
tw = self.tipwindow
|
tw = self.tipwindow
|
||||||
self.tipwindow = None
|
self.tipwindow = None
|
||||||
|
@ -53,7 +53,7 @@ class container: # Conceptually an editor_window
|
||||||
text.event_add("<<calltip-hide>>", ")")
|
text.event_add("<<calltip-hide>>", ")")
|
||||||
text.bind("<<calltip-show>>", self.calltip_show)
|
text.bind("<<calltip-show>>", self.calltip_show)
|
||||||
text.bind("<<calltip-hide>>", self.calltip_hide)
|
text.bind("<<calltip-hide>>", self.calltip_hide)
|
||||||
|
|
||||||
text.focus_set()
|
text.focus_set()
|
||||||
# root.mainloop() # not in idle
|
# root.mainloop() # not in idle
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ class CallTips:
|
||||||
if self.calltip:
|
if self.calltip:
|
||||||
self.calltip.hidetip()
|
self.calltip.hidetip()
|
||||||
self.calltip = None
|
self.calltip = None
|
||||||
|
|
||||||
def paren_open_event(self, event):
|
def paren_open_event(self, event):
|
||||||
self._remove_calltip_window()
|
self._remove_calltip_window()
|
||||||
arg_text = get_arg_text(self.get_object_at_cursor())
|
arg_text = get_arg_text(self.get_object_at_cursor())
|
||||||
|
@ -91,9 +91,9 @@ class CallTips:
|
||||||
namespace = sys.modules.copy()
|
namespace = sys.modules.copy()
|
||||||
namespace.update(__main__.__dict__)
|
namespace.update(__main__.__dict__)
|
||||||
try:
|
try:
|
||||||
return eval(word, namespace)
|
return eval(word, namespace)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
return None # Can't find an object.
|
return None # Can't find an object.
|
||||||
|
|
||||||
def _find_constructor(class_ob):
|
def _find_constructor(class_ob):
|
||||||
|
|
|
@ -92,7 +92,7 @@ class ModuleBrowserTreeItem(TreeItem):
|
||||||
|
|
||||||
def IsExpandable(self):
|
def IsExpandable(self):
|
||||||
return os.path.normcase(self.file[-3:]) == ".py"
|
return os.path.normcase(self.file[-3:]) == ".py"
|
||||||
|
|
||||||
def listclasses(self):
|
def listclasses(self):
|
||||||
dir, file = os.path.split(self.file)
|
dir, file = os.path.split(self.file)
|
||||||
name, ext = os.path.splitext(file)
|
name, ext = os.path.splitext(file)
|
||||||
|
|
|
@ -17,7 +17,7 @@ class Debugger(bdb.Bdb):
|
||||||
bdb.Bdb.__init__(self)
|
bdb.Bdb.__init__(self)
|
||||||
self.pyshell = pyshell
|
self.pyshell = pyshell
|
||||||
self.make_gui()
|
self.make_gui()
|
||||||
|
|
||||||
def canonic(self, filename):
|
def canonic(self, filename):
|
||||||
# Canonicalize filename -- called by Bdb
|
# Canonicalize filename -- called by Bdb
|
||||||
return os.path.normcase(os.path.abspath(filename))
|
return os.path.normcase(os.path.abspath(filename))
|
||||||
|
@ -299,10 +299,10 @@ class Debugger(bdb.Bdb):
|
||||||
import linecache # Import as late as possible
|
import linecache # Import as late as possible
|
||||||
line = linecache.getline(filename, lineno)
|
line = linecache.getline(filename, lineno)
|
||||||
if not line:
|
if not line:
|
||||||
return 'That line does not exist!'
|
return 'That line does not exist!'
|
||||||
if not self.breaks.has_key(filename):
|
if not self.breaks.has_key(filename):
|
||||||
self.breaks[filename] = []
|
self.breaks[filename] = []
|
||||||
list = self.breaks[filename]
|
list = self.breaks[filename]
|
||||||
if not lineno in list:
|
if not lineno in list:
|
||||||
list.append(lineno)
|
list.append(lineno)
|
||||||
bp = bdb.Breakpoint(filename, lineno, temporary, cond)
|
bp = bdb.Breakpoint(filename, lineno, temporary, cond)
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
class Delegator:
|
class Delegator:
|
||||||
|
|
||||||
# The cache is only used to be able to change delegates!
|
# The cache is only used to be able to change delegates!
|
||||||
|
|
|
@ -26,12 +26,12 @@ class FileList:
|
||||||
|
|
||||||
|
|
||||||
def goodname(self, filename):
|
def goodname(self, filename):
|
||||||
filename = self.canonize(filename)
|
filename = self.canonize(filename)
|
||||||
key = os.path.normcase(filename)
|
key = os.path.normcase(filename)
|
||||||
if self.dict.has_key(key):
|
if self.dict.has_key(key):
|
||||||
edit = self.dict[key]
|
edit = self.dict[key]
|
||||||
filename = edit.io.filename or filename
|
filename = edit.io.filename or filename
|
||||||
return filename
|
return filename
|
||||||
|
|
||||||
def open(self, filename):
|
def open(self, filename):
|
||||||
assert filename
|
assert filename
|
||||||
|
|
|
@ -28,10 +28,10 @@ class FormatParagraph:
|
||||||
keydefs = {
|
keydefs = {
|
||||||
'<<format-paragraph>>': ['<Alt-q>'],
|
'<<format-paragraph>>': ['<Alt-q>'],
|
||||||
}
|
}
|
||||||
|
|
||||||
unix_keydefs = {
|
unix_keydefs = {
|
||||||
'<<format-paragraph>>': ['<Meta-q>'],
|
'<<format-paragraph>>': ['<Meta-q>'],
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, editwin):
|
def __init__(self, editwin):
|
||||||
self.editwin = editwin
|
self.editwin = editwin
|
||||||
|
|
|
@ -10,24 +10,24 @@ class IdleConfParser(ConfigParser):
|
||||||
builtin_sections = {}
|
builtin_sections = {}
|
||||||
for section in ('EditorWindow', 'Colors'):
|
for section in ('EditorWindow', 'Colors'):
|
||||||
builtin_sections[section] = section
|
builtin_sections[section] = section
|
||||||
|
|
||||||
def getcolor(self, sec, name):
|
def getcolor(self, sec, name):
|
||||||
"""Return a dictionary with foreground and background colors
|
"""Return a dictionary with foreground and background colors
|
||||||
|
|
||||||
The return value is appropriate for passing to Tkinter in, e.g.,
|
The return value is appropriate for passing to Tkinter in, e.g.,
|
||||||
a tag_config call.
|
a tag_config call.
|
||||||
"""
|
"""
|
||||||
fore = self.getdef(sec, name + "-foreground")
|
fore = self.getdef(sec, name + "-foreground")
|
||||||
back = self.getdef(sec, name + "-background")
|
back = self.getdef(sec, name + "-background")
|
||||||
return {"foreground": fore,
|
return {"foreground": fore,
|
||||||
"background": back}
|
"background": back}
|
||||||
|
|
||||||
def getdef(self, sec, options, raw=0, vars=None, default=None):
|
def getdef(self, sec, options, raw=0, vars=None, default=None):
|
||||||
"""Get an option value for given section or return default"""
|
"""Get an option value for given section or return default"""
|
||||||
try:
|
try:
|
||||||
return self.get(sec, options, raw, vars)
|
return self.get(sec, options, raw, vars)
|
||||||
except (NoSectionError, NoOptionError):
|
except (NoSectionError, NoOptionError):
|
||||||
return default
|
return default
|
||||||
|
|
||||||
def getsection(self, section):
|
def getsection(self, section):
|
||||||
"""Return a SectionConfigParser object"""
|
"""Return a SectionConfigParser object"""
|
||||||
|
@ -37,10 +37,10 @@ class IdleConfParser(ConfigParser):
|
||||||
exts = []
|
exts = []
|
||||||
for sec in self.sections():
|
for sec in self.sections():
|
||||||
if self.builtin_sections.has_key(sec):
|
if self.builtin_sections.has_key(sec):
|
||||||
continue
|
continue
|
||||||
# enable is a bool, but it may not be defined
|
# enable is a bool, but it may not be defined
|
||||||
if self.getdef(sec, 'enable') != '0':
|
if self.getdef(sec, 'enable') != '0':
|
||||||
exts.append(sec)
|
exts.append(sec)
|
||||||
return exts
|
return exts
|
||||||
|
|
||||||
def reload(self):
|
def reload(self):
|
||||||
|
@ -69,10 +69,10 @@ class SectionConfigParser:
|
||||||
|
|
||||||
def getint(self, option):
|
def getint(self, option):
|
||||||
return self.config.getint(self.section, option)
|
return self.config.getint(self.section, option)
|
||||||
|
|
||||||
def getfloat(self, option):
|
def getfloat(self, option):
|
||||||
return self.config.getint(self.section, option)
|
return self.config.getint(self.section, option)
|
||||||
|
|
||||||
def getboolean(self, option):
|
def getboolean(self, option):
|
||||||
return self.config.getint(self.section, option)
|
return self.config.getint(self.section, option)
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ def load(dir):
|
||||||
genplatfile = os.path.join(dir, "config-mac.txt")
|
genplatfile = os.path.join(dir, "config-mac.txt")
|
||||||
else:
|
else:
|
||||||
genplatfile = os.path.join(dir, "config-unix.txt")
|
genplatfile = os.path.join(dir, "config-unix.txt")
|
||||||
|
|
||||||
platfile = os.path.join(dir, "config-%s.txt" % sys.platform)
|
platfile = os.path.join(dir, "config-%s.txt" % sys.platform)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -110,4 +110,3 @@ def load(dir):
|
||||||
os.path.join(homedir, ".idle")))
|
os.path.join(homedir, ".idle")))
|
||||||
|
|
||||||
idleconf = IdleConfParser()
|
idleconf = IdleConfParser()
|
||||||
|
|
||||||
|
|
|
@ -86,4 +86,3 @@ class History:
|
||||||
self.text.mark_set("insert", "end-1c")
|
self.text.mark_set("insert", "end-1c")
|
||||||
self.text.insert("insert", s)
|
self.text.insert("insert", s)
|
||||||
self.text.see("insert")
|
self.text.see("insert")
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ from Separator import HSeparator
|
||||||
from ScrolledList import ScrolledList
|
from ScrolledList import ScrolledList
|
||||||
|
|
||||||
class MultiScrolledLists:
|
class MultiScrolledLists:
|
||||||
|
|
||||||
def __init__(self, root, nlists=2):
|
def __init__(self, root, nlists=2):
|
||||||
assert nlists >= 1
|
assert nlists >= 1
|
||||||
self.root = root
|
self.root = root
|
||||||
|
@ -51,17 +51,17 @@ class MultiScrolledLists:
|
||||||
self.fill(0)
|
self.fill(0)
|
||||||
# XXX one after_idle isn't enough; two are...
|
# XXX one after_idle isn't enough; two are...
|
||||||
top.after_idle(self.call_pack_propagate_1)
|
top.after_idle(self.call_pack_propagate_1)
|
||||||
|
|
||||||
def call_pack_propagate_1(self):
|
def call_pack_propagate_1(self):
|
||||||
self.top.after_idle(self.call_pack_propagate)
|
self.top.after_idle(self.call_pack_propagate)
|
||||||
|
|
||||||
def call_pack_propagate(self):
|
def call_pack_propagate(self):
|
||||||
for frame in self.frames:
|
for frame in self.frames:
|
||||||
frame.pack_propagate(0)
|
frame.pack_propagate(0)
|
||||||
|
|
||||||
def close(self, event=None):
|
def close(self, event=None):
|
||||||
self.top.destroy()
|
self.top.destroy()
|
||||||
|
|
||||||
def settitle(self):
|
def settitle(self):
|
||||||
short = self.shorttitle()
|
short = self.shorttitle()
|
||||||
long = self.longtitle()
|
long = self.longtitle()
|
||||||
|
@ -80,23 +80,23 @@ class MultiScrolledLists:
|
||||||
def longtitle(self):
|
def longtitle(self):
|
||||||
# override this
|
# override this
|
||||||
return "Multi Scrolled Lists"
|
return "Multi Scrolled Lists"
|
||||||
|
|
||||||
def shorttitle(self):
|
def shorttitle(self):
|
||||||
# override this
|
# override this
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def width(self, i):
|
def width(self, i):
|
||||||
# override this
|
# override this
|
||||||
return 20
|
return 20
|
||||||
|
|
||||||
def height(self, i):
|
def height(self, i):
|
||||||
# override this
|
# override this
|
||||||
return 10
|
return 10
|
||||||
|
|
||||||
def subtitle(self, i):
|
def subtitle(self, i):
|
||||||
# override this
|
# override this
|
||||||
return "Column %d" % i
|
return "Column %d" % i
|
||||||
|
|
||||||
def fill(self, i):
|
def fill(self, i):
|
||||||
for k in range(i, self.nlists):
|
for k in range(i, self.nlists):
|
||||||
self.lists[k].clear()
|
self.lists[k].clear()
|
||||||
|
@ -105,14 +105,14 @@ class MultiScrolledLists:
|
||||||
l = self.items(i)
|
l = self.items(i)
|
||||||
for s in l:
|
for s in l:
|
||||||
list.append(s)
|
list.append(s)
|
||||||
|
|
||||||
def on_select(self, index, i):
|
def on_select(self, index, i):
|
||||||
item = self.lists[i].get(index)
|
item = self.lists[i].get(index)
|
||||||
del self.path[i:]
|
del self.path[i:]
|
||||||
self.path.append(item)
|
self.path.append(item)
|
||||||
if i+1 < self.nlists:
|
if i+1 < self.nlists:
|
||||||
self.fill(i+1)
|
self.fill(i+1)
|
||||||
|
|
||||||
def items(self, i):
|
def items(self, i):
|
||||||
# override this
|
# override this
|
||||||
l = []
|
l = []
|
||||||
|
@ -122,7 +122,7 @@ class MultiScrolledLists:
|
||||||
s = self.path[i-1] + "." + s
|
s = self.path[i-1] + "." + s
|
||||||
l.append(s)
|
l.append(s)
|
||||||
return l
|
return l
|
||||||
|
|
||||||
def on_double(self, index, i):
|
def on_double(self, index, i):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,32 @@
|
||||||
from Tkinter import *
|
from Tkinter import *
|
||||||
|
|
||||||
class MultiStatusBar(Frame):
|
class MultiStatusBar(Frame):
|
||||||
|
|
||||||
def __init__(self, master=None, **kw):
|
|
||||||
if master is None:
|
|
||||||
master = Tk()
|
|
||||||
apply(Frame.__init__, (self, master), kw)
|
|
||||||
self.labels = {}
|
|
||||||
|
|
||||||
def set_label(self, name, text='', side=LEFT):
|
def __init__(self, master=None, **kw):
|
||||||
if not self.labels.has_key(name):
|
if master is None:
|
||||||
label = Label(self, bd=1, relief=SUNKEN, anchor=W)
|
master = Tk()
|
||||||
label.pack(side=side)
|
apply(Frame.__init__, (self, master), kw)
|
||||||
self.labels[name] = label
|
self.labels = {}
|
||||||
else:
|
|
||||||
label = self.labels[name]
|
def set_label(self, name, text='', side=LEFT):
|
||||||
label.config(text=text)
|
if not self.labels.has_key(name):
|
||||||
|
label = Label(self, bd=1, relief=SUNKEN, anchor=W)
|
||||||
|
label.pack(side=side)
|
||||||
|
self.labels[name] = label
|
||||||
|
else:
|
||||||
|
label = self.labels[name]
|
||||||
|
label.config(text=text)
|
||||||
|
|
||||||
def _test():
|
def _test():
|
||||||
b = Frame()
|
b = Frame()
|
||||||
c = Text(b)
|
c = Text(b)
|
||||||
c.pack(side=TOP)
|
c.pack(side=TOP)
|
||||||
a = MultiStatusBar(b)
|
a = MultiStatusBar(b)
|
||||||
a.set_label("one", "hello")
|
a.set_label("one", "hello")
|
||||||
a.set_label("two", "world")
|
a.set_label("two", "world")
|
||||||
a.pack(side=BOTTOM, fill=X)
|
a.pack(side=BOTTOM, fill=X)
|
||||||
b.pack()
|
b.pack()
|
||||||
b.mainloop()
|
b.mainloop()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
_test()
|
_test()
|
||||||
|
|
|
@ -111,17 +111,17 @@ class OnDemandOutputWindow:
|
||||||
# XXX Should use IdlePrefs.ColorPrefs
|
# XXX Should use IdlePrefs.ColorPrefs
|
||||||
"stdout": {"foreground": "blue"},
|
"stdout": {"foreground": "blue"},
|
||||||
"stderr": {"foreground": "#007700"},
|
"stderr": {"foreground": "#007700"},
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, flist):
|
def __init__(self, flist):
|
||||||
self.flist = flist
|
self.flist = flist
|
||||||
self.owin = None
|
self.owin = None
|
||||||
|
|
||||||
def write(self, s, tags, mark):
|
def write(self, s, tags, mark):
|
||||||
if not self.owin:
|
if not self.owin:
|
||||||
self.setup()
|
self.setup()
|
||||||
self.owin.write(s, tags, mark)
|
self.owin.write(s, tags, mark)
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
self.owin = owin = OutputWindow(self.flist)
|
self.owin = owin = OutputWindow(self.flist)
|
||||||
text = owin.text
|
text = owin.text
|
||||||
|
|
|
@ -20,7 +20,7 @@ class ParenMatch:
|
||||||
"""Highlight matching parentheses
|
"""Highlight matching parentheses
|
||||||
|
|
||||||
There are three supported style of paren matching, based loosely
|
There are three supported style of paren matching, based loosely
|
||||||
on the Emacs options. The style is select based on the
|
on the Emacs options. The style is select based on the
|
||||||
HILITE_STYLE attribute; it can be changed used the set_style
|
HILITE_STYLE attribute; it can be changed used the set_style
|
||||||
method.
|
method.
|
||||||
|
|
||||||
|
@ -43,9 +43,9 @@ class ParenMatch:
|
||||||
to the right of a right paren. I don't know how to do that in Tk,
|
to the right of a right paren. I don't know how to do that in Tk,
|
||||||
so I haven't bothered.
|
so I haven't bothered.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
menudefs = []
|
menudefs = []
|
||||||
|
|
||||||
keydefs = {
|
keydefs = {
|
||||||
'<<flash-open-paren>>' : ('<KeyRelease-parenright>',
|
'<<flash-open-paren>>' : ('<KeyRelease-parenright>',
|
||||||
'<KeyRelease-bracketright>',
|
'<KeyRelease-bracketright>',
|
||||||
|
@ -146,7 +146,7 @@ class LastOpenBracketFinder:
|
||||||
indentwidth = AutoIndent.indentwidth
|
indentwidth = AutoIndent.indentwidth
|
||||||
tabwidth = AutoIndent.tabwidth
|
tabwidth = AutoIndent.tabwidth
|
||||||
context_use_ps1 = AutoIndent.context_use_ps1
|
context_use_ps1 = AutoIndent.context_use_ps1
|
||||||
|
|
||||||
def __init__(self, editwin):
|
def __init__(self, editwin):
|
||||||
self.editwin = editwin
|
self.editwin = editwin
|
||||||
self.text = editwin.text
|
self.text = editwin.text
|
||||||
|
@ -158,7 +158,7 @@ class LastOpenBracketFinder:
|
||||||
startatindex = `startat` + ".0"
|
startatindex = `startat` + ".0"
|
||||||
# rawtext needs to contain everything up to the last
|
# rawtext needs to contain everything up to the last
|
||||||
# character, which was the close paren. the parser also
|
# character, which was the close paren. the parser also
|
||||||
# requires that the last line ends with "\n"
|
# requires that the last line ends with "\n"
|
||||||
rawtext = self.text.get(startatindex, "insert")[:-1] + "\n"
|
rawtext = self.text.get(startatindex, "insert")[:-1] + "\n"
|
||||||
y.set_str(rawtext)
|
y.set_str(rawtext)
|
||||||
bod = y.find_good_parse_start(
|
bod = y.find_good_parse_start(
|
||||||
|
@ -175,7 +175,7 @@ class LastOpenBracketFinder:
|
||||||
lno = index2line(self.text.index("insert"))
|
lno = index2line(self.text.index("insert"))
|
||||||
i, buf = self._find_offset_in_buf(lno)
|
i, buf = self._find_offset_in_buf(lno)
|
||||||
if i is None \
|
if i is None \
|
||||||
or keysym_type(buf[i]) != right_keysym_type:
|
or keysym_type(buf[i]) != right_keysym_type:
|
||||||
return None
|
return None
|
||||||
lines_back = string.count(buf[i:], "\n") - 1
|
lines_back = string.count(buf[i:], "\n") - 1
|
||||||
# subtract one for the "\n" added to please the parser
|
# subtract one for the "\n" added to please the parser
|
||||||
|
@ -189,4 +189,3 @@ class LastOpenBracketFinder:
|
||||||
icis=self.editwin.is_char_in_string):
|
icis=self.editwin.is_char_in_string):
|
||||||
return icis(startindex + "%dc" % offset)
|
return icis(startindex + "%dc" % offset)
|
||||||
return inner
|
return inner
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ from TreeWidget import TreeItem
|
||||||
from ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
|
from ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
|
||||||
|
|
||||||
class PathBrowser(ClassBrowser):
|
class PathBrowser(ClassBrowser):
|
||||||
|
|
||||||
def __init__(self, flist):
|
def __init__(self, flist):
|
||||||
self.init(flist)
|
self.init(flist)
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,7 @@ class ModifiedColorDelegator(ColorDelegator):
|
||||||
"stderr": cconf.getcolor("stderr"),
|
"stderr": cconf.getcolor("stderr"),
|
||||||
"console": cconf.getcolor("console"),
|
"console": cconf.getcolor("console"),
|
||||||
"ERROR": cconf.getcolor("ERROR"),
|
"ERROR": cconf.getcolor("ERROR"),
|
||||||
None: cconf.getcolor("normal"),
|
None: cconf.getcolor("normal"),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ VERBOSE = None
|
||||||
class SocketProtocol:
|
class SocketProtocol:
|
||||||
"""A simple protocol for sending strings across a socket"""
|
"""A simple protocol for sending strings across a socket"""
|
||||||
BUF_SIZE = 8192
|
BUF_SIZE = 8192
|
||||||
|
|
||||||
def __init__(self, sock):
|
def __init__(self, sock):
|
||||||
self.sock = sock
|
self.sock = sock
|
||||||
self._buffer = ''
|
self._buffer = ''
|
||||||
|
@ -176,11 +176,11 @@ class CommandProtocol:
|
||||||
|
|
||||||
def decode_seqno(self, buf):
|
def decode_seqno(self, buf):
|
||||||
return struct.unpack("I", buf)[0]
|
return struct.unpack("I", buf)[0]
|
||||||
|
|
||||||
|
|
||||||
class StdioRedirector:
|
class StdioRedirector:
|
||||||
"""Redirect sys.std{in,out,err} to a set of file-like objects"""
|
"""Redirect sys.std{in,out,err} to a set of file-like objects"""
|
||||||
|
|
||||||
def __init__(self, stdin, stdout, stderr):
|
def __init__(self, stdin, stdout, stderr):
|
||||||
self.stdin = stdin
|
self.stdin = stdin
|
||||||
self.stdout = stdout
|
self.stdout = stdout
|
||||||
|
@ -292,7 +292,7 @@ class RIClient:
|
||||||
self._cmd.dispatch()
|
self._cmd.dispatch()
|
||||||
except EOFError:
|
except EOFError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def handle_stdout(self, buf):
|
def handle_stdout(self, buf):
|
||||||
sys.stdout.write(buf)
|
sys.stdout.write(buf)
|
||||||
## sys.stdout.flush()
|
## sys.stdout.flush()
|
||||||
|
@ -339,5 +339,4 @@ if __name__ == "__main__":
|
||||||
startRemoteInterp(id)
|
startRemoteInterp(id)
|
||||||
else:
|
else:
|
||||||
file = args[1]
|
file = args[1]
|
||||||
riExec(id, file)
|
riExec(id, file)
|
||||||
|
|
||||||
|
|
|
@ -34,13 +34,13 @@ To fix case 2, change all tabs to spaces by using Select All followed \
|
||||||
by Untabify Region (both in the Edit menu)."""
|
by Untabify Region (both in the Edit menu)."""
|
||||||
|
|
||||||
class ScriptBinding:
|
class ScriptBinding:
|
||||||
|
|
||||||
keydefs = {
|
keydefs = {
|
||||||
'<<check-module>>': ['<Alt-F5>', '<Meta-F5>'],
|
'<<check-module>>': ['<Alt-F5>', '<Meta-F5>'],
|
||||||
'<<import-module>>': ['<F5>'],
|
'<<import-module>>': ['<F5>'],
|
||||||
'<<run-script>>': ['<Control-F5>'],
|
'<<run-script>>': ['<Control-F5>'],
|
||||||
}
|
}
|
||||||
|
|
||||||
menudefs = [
|
menudefs = [
|
||||||
('edit', [None,
|
('edit', [None,
|
||||||
('Check module', '<<check-module>>'),
|
('Check module', '<<check-module>>'),
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from Tkinter import *
|
from Tkinter import *
|
||||||
|
|
||||||
class ScrolledList:
|
class ScrolledList:
|
||||||
|
|
||||||
default = "(None)"
|
default = "(None)"
|
||||||
|
|
||||||
def __init__(self, master, **options):
|
def __init__(self, master, **options):
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from Tkinter import *
|
from Tkinter import *
|
||||||
|
|
||||||
class Separator:
|
class Separator:
|
||||||
|
|
||||||
def __init__(self, master, orient, min=10, thickness=5, bg=None):
|
def __init__(self, master, orient, min=10, thickness=5, bg=None):
|
||||||
self.min = max(1, min)
|
self.min = max(1, min)
|
||||||
self.thickness = max(1, thickness)
|
self.thickness = max(1, thickness)
|
||||||
|
@ -10,14 +10,14 @@ class Separator:
|
||||||
self.dim = "width"
|
self.dim = "width"
|
||||||
self.dir = "x"
|
self.dir = "x"
|
||||||
self.cursor = "sb_h_double_arrow"
|
self.cursor = "sb_h_double_arrow"
|
||||||
elif orient in ("v", "vertical"):
|
elif orient in ("v", "vertical"):
|
||||||
self.side = "top"
|
self.side = "top"
|
||||||
self.dim = "height"
|
self.dim = "height"
|
||||||
self.dir = "y"
|
self.dir = "y"
|
||||||
self.cursor = "sb_v_double_arrow"
|
self.cursor = "sb_v_double_arrow"
|
||||||
else:
|
else:
|
||||||
raise ValueError, "Separator: orient should be h or v"
|
raise ValueError, "Separator: orient should be h or v"
|
||||||
self.winfo_dim = "winfo_" + self.dim
|
self.winfo_dim = "winfo_" + self.dim
|
||||||
self.master = master = Frame(master)
|
self.master = master = Frame(master)
|
||||||
master.pack(expand=1, fill="both")
|
master.pack(expand=1, fill="both")
|
||||||
self.f1 = Frame(master)
|
self.f1 = Frame(master)
|
||||||
|
|
|
@ -100,7 +100,7 @@ class VariablesTreeItem(ObjectTreeItem):
|
||||||
item = make_objecttreeitem(key + " =", value, setfunction)
|
item = make_objecttreeitem(key + " =", value, setfunction)
|
||||||
sublist.append(item)
|
sublist.append(item)
|
||||||
return sublist
|
return sublist
|
||||||
|
|
||||||
def get_stack(t=None, f=None):
|
def get_stack(t=None, f=None):
|
||||||
if t is None:
|
if t is None:
|
||||||
t = sys.last_traceback
|
t = sys.last_traceback
|
||||||
|
|
|
@ -81,7 +81,7 @@ def main():
|
||||||
b.pack()
|
b.pack()
|
||||||
root.update()
|
root.update()
|
||||||
tip = ListboxToolTip(b, ["Hello", "world"])
|
tip = ListboxToolTip(b, ["Hello", "world"])
|
||||||
|
|
||||||
# root.mainloop() # not in idle
|
# root.mainloop() # not in idle
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -39,7 +39,7 @@ class WindowList:
|
||||||
|
|
||||||
def unregister_callback(self, callback):
|
def unregister_callback(self, callback):
|
||||||
try:
|
try:
|
||||||
self.callbacks.remove(callback)
|
self.callbacks.remove(callback)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -12,46 +12,46 @@ from stat import *
|
||||||
|
|
||||||
# Use lstat() to stat files if it exists, else stat()
|
# Use lstat() to stat files if it exists, else stat()
|
||||||
try:
|
try:
|
||||||
statfunc = os.lstat
|
statfunc = os.lstat
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
statfunc = os.stat
|
statfunc = os.stat
|
||||||
|
|
||||||
# Parse options
|
# Parse options
|
||||||
if sys.argv[1] == '-m':
|
if sys.argv[1] == '-m':
|
||||||
itime = ST_MTIME
|
itime = ST_MTIME
|
||||||
del sys.argv[1]
|
del sys.argv[1]
|
||||||
elif sys.argv[1] == '-c':
|
elif sys.argv[1] == '-c':
|
||||||
itime = ST_CTIME
|
itime = ST_CTIME
|
||||||
del sys.argv[1]
|
del sys.argv[1]
|
||||||
elif sys.argv[1] == '-a':
|
elif sys.argv[1] == '-a':
|
||||||
itime = ST_CTIME
|
itime = ST_CTIME
|
||||||
del sys.argv[1]
|
del sys.argv[1]
|
||||||
else:
|
else:
|
||||||
itime = ST_MTIME
|
itime = ST_MTIME
|
||||||
|
|
||||||
secs_per_year = 365.0 * 24.0 * 3600.0 # Scale factor
|
secs_per_year = 365.0 * 24.0 * 3600.0 # Scale factor
|
||||||
now = time.time() # Current time, for age computations
|
now = time.time() # Current time, for age computations
|
||||||
status = 0 # Exit status, set to 1 on errors
|
status = 0 # Exit status, set to 1 on errors
|
||||||
|
|
||||||
# Compute max file name length
|
# Compute max file name length
|
||||||
maxlen = 1
|
maxlen = 1
|
||||||
for file in sys.argv[1:]:
|
for file in sys.argv[1:]:
|
||||||
if len(file) > maxlen: maxlen = len(file)
|
if len(file) > maxlen: maxlen = len(file)
|
||||||
|
|
||||||
# Process each argument in turn
|
# Process each argument in turn
|
||||||
for file in sys.argv[1:]:
|
for file in sys.argv[1:]:
|
||||||
try:
|
try:
|
||||||
st = statfunc(file)
|
st = statfunc(file)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
sys.stderr.write('can\'t stat ' + `file` + ': ' + `msg` + '\n')
|
sys.stderr.write('can\'t stat ' + `file` + ': ' + `msg` + '\n')
|
||||||
status = 1
|
status = 1
|
||||||
st = ()
|
st = ()
|
||||||
if st:
|
if st:
|
||||||
anytime = st[itime]
|
anytime = st[itime]
|
||||||
size = st[ST_SIZE]
|
size = st[ST_SIZE]
|
||||||
age = now - anytime
|
age = now - anytime
|
||||||
byteyears = float(size) * float(age) / secs_per_year
|
byteyears = float(size) * float(age) / secs_per_year
|
||||||
print string.ljust(file, maxlen),
|
print string.ljust(file, maxlen),
|
||||||
print string.rjust(`int(byteyears)`, 8)
|
print string.rjust(`int(byteyears)`, 8)
|
||||||
|
|
||||||
sys.exit(status)
|
sys.exit(status)
|
||||||
|
|
|
@ -8,58 +8,58 @@ from stat import ST_MTIME
|
||||||
import imp
|
import imp
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
silent = 0
|
silent = 0
|
||||||
verbose = 0
|
verbose = 0
|
||||||
if sys.argv[1:]:
|
if sys.argv[1:]:
|
||||||
if sys.argv[1] == '-v':
|
if sys.argv[1] == '-v':
|
||||||
verbose = 1
|
verbose = 1
|
||||||
elif sys.argv[1] == '-s':
|
elif sys.argv[1] == '-s':
|
||||||
silent = 1
|
silent = 1
|
||||||
MAGIC = imp.get_magic()
|
MAGIC = imp.get_magic()
|
||||||
if not silent:
|
if not silent:
|
||||||
print 'Using MAGIC word', `MAGIC`
|
print 'Using MAGIC word', `MAGIC`
|
||||||
for dirname in sys.path:
|
for dirname in sys.path:
|
||||||
try:
|
try:
|
||||||
names = os.listdir(dirname)
|
names = os.listdir(dirname)
|
||||||
except os.error:
|
except os.error:
|
||||||
print 'Cannot list directory', `dirname`
|
print 'Cannot list directory', `dirname`
|
||||||
continue
|
continue
|
||||||
if not silent:
|
if not silent:
|
||||||
print 'Checking', `dirname`, '...'
|
print 'Checking', `dirname`, '...'
|
||||||
names.sort()
|
names.sort()
|
||||||
for name in names:
|
for name in names:
|
||||||
if name[-3:] == '.py':
|
if name[-3:] == '.py':
|
||||||
name = os.path.join(dirname, name)
|
name = os.path.join(dirname, name)
|
||||||
try:
|
try:
|
||||||
st = os.stat(name)
|
st = os.stat(name)
|
||||||
except os.error:
|
except os.error:
|
||||||
print 'Cannot stat', `name`
|
print 'Cannot stat', `name`
|
||||||
continue
|
continue
|
||||||
if verbose:
|
if verbose:
|
||||||
print 'Check', `name`, '...'
|
print 'Check', `name`, '...'
|
||||||
name_c = name + 'c'
|
name_c = name + 'c'
|
||||||
try:
|
try:
|
||||||
f = open(name_c, 'r')
|
f = open(name_c, 'r')
|
||||||
except IOError:
|
except IOError:
|
||||||
print 'Cannot open', `name_c`
|
print 'Cannot open', `name_c`
|
||||||
continue
|
continue
|
||||||
magic_str = f.read(4)
|
magic_str = f.read(4)
|
||||||
mtime_str = f.read(4)
|
mtime_str = f.read(4)
|
||||||
f.close()
|
f.close()
|
||||||
if magic_str <> MAGIC:
|
if magic_str <> MAGIC:
|
||||||
print 'Bad MAGIC word in ".pyc" file',
|
print 'Bad MAGIC word in ".pyc" file',
|
||||||
print `name_c`
|
print `name_c`
|
||||||
continue
|
continue
|
||||||
mtime = get_long(mtime_str)
|
mtime = get_long(mtime_str)
|
||||||
if mtime == 0 or mtime == -1:
|
if mtime == 0 or mtime == -1:
|
||||||
print 'Bad ".pyc" file', `name_c`
|
print 'Bad ".pyc" file', `name_c`
|
||||||
elif mtime <> st[ST_MTIME]:
|
elif mtime <> st[ST_MTIME]:
|
||||||
print 'Out-of-date ".pyc" file',
|
print 'Out-of-date ".pyc" file',
|
||||||
print `name_c`
|
print `name_c`
|
||||||
|
|
||||||
def get_long(s):
|
def get_long(s):
|
||||||
if len(s) <> 4:
|
if len(s) <> 4:
|
||||||
return -1
|
return -1
|
||||||
return ord(s[0]) + (ord(s[1])<<8) + (ord(s[2])<<16) + (ord(s[3])<<24)
|
return ord(s[0]) + (ord(s[1])<<8) + (ord(s[2])<<16) + (ord(s[3])<<24)
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
#
|
#
|
||||||
# Fix Python source files to use the new class definition syntax, i.e.,
|
# Fix Python source files to use the new class definition syntax, i.e.,
|
||||||
# the syntax used in Python versions before 0.9.8:
|
# the syntax used in Python versions before 0.9.8:
|
||||||
# class C() = base(), base(), ...: ...
|
# class C() = base(), base(), ...: ...
|
||||||
# is changed to the current syntax:
|
# is changed to the current syntax:
|
||||||
# class C(base, base, ...): ...
|
# class C(base, base, ...): ...
|
||||||
#
|
#
|
||||||
# The script uses heuristics to find class definitions that usually
|
# The script uses heuristics to find class definitions that usually
|
||||||
# work but occasionally can fail; carefully check the output!
|
# work but occasionally can fail; carefully check the output!
|
||||||
|
@ -39,113 +39,113 @@ dbg = err
|
||||||
rep = sys.stdout.write
|
rep = sys.stdout.write
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
bad = 0
|
bad = 0
|
||||||
if not sys.argv[1:]: # No arguments
|
if not sys.argv[1:]: # No arguments
|
||||||
err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
|
err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
for arg in sys.argv[1:]:
|
for arg in sys.argv[1:]:
|
||||||
if os.path.isdir(arg):
|
if os.path.isdir(arg):
|
||||||
if recursedown(arg): bad = 1
|
if recursedown(arg): bad = 1
|
||||||
elif os.path.islink(arg):
|
elif os.path.islink(arg):
|
||||||
err(arg + ': will not process symbolic links\n')
|
err(arg + ': will not process symbolic links\n')
|
||||||
bad = 1
|
bad = 1
|
||||||
else:
|
else:
|
||||||
if fix(arg): bad = 1
|
if fix(arg): bad = 1
|
||||||
sys.exit(bad)
|
sys.exit(bad)
|
||||||
|
|
||||||
ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
|
ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
|
||||||
def ispython(name):
|
def ispython(name):
|
||||||
return ispythonprog.match(name) >= 0
|
return ispythonprog.match(name) >= 0
|
||||||
|
|
||||||
def recursedown(dirname):
|
def recursedown(dirname):
|
||||||
dbg('recursedown(' + `dirname` + ')\n')
|
dbg('recursedown(' + `dirname` + ')\n')
|
||||||
bad = 0
|
bad = 0
|
||||||
try:
|
try:
|
||||||
names = os.listdir(dirname)
|
names = os.listdir(dirname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(dirname + ': cannot list directory: ' + `msg` + '\n')
|
err(dirname + ': cannot list directory: ' + `msg` + '\n')
|
||||||
return 1
|
return 1
|
||||||
names.sort()
|
names.sort()
|
||||||
subdirs = []
|
subdirs = []
|
||||||
for name in names:
|
for name in names:
|
||||||
if name in (os.curdir, os.pardir): continue
|
if name in (os.curdir, os.pardir): continue
|
||||||
fullname = os.path.join(dirname, name)
|
fullname = os.path.join(dirname, name)
|
||||||
if os.path.islink(fullname): pass
|
if os.path.islink(fullname): pass
|
||||||
elif os.path.isdir(fullname):
|
elif os.path.isdir(fullname):
|
||||||
subdirs.append(fullname)
|
subdirs.append(fullname)
|
||||||
elif ispython(name):
|
elif ispython(name):
|
||||||
if fix(fullname): bad = 1
|
if fix(fullname): bad = 1
|
||||||
for fullname in subdirs:
|
for fullname in subdirs:
|
||||||
if recursedown(fullname): bad = 1
|
if recursedown(fullname): bad = 1
|
||||||
return bad
|
return bad
|
||||||
|
|
||||||
def fix(filename):
|
def fix(filename):
|
||||||
## dbg('fix(' + `filename` + ')\n')
|
## dbg('fix(' + `filename` + ')\n')
|
||||||
try:
|
try:
|
||||||
f = open(filename, 'r')
|
f = open(filename, 'r')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
err(filename + ': cannot open: ' + `msg` + '\n')
|
err(filename + ': cannot open: ' + `msg` + '\n')
|
||||||
return 1
|
return 1
|
||||||
head, tail = os.path.split(filename)
|
head, tail = os.path.split(filename)
|
||||||
tempname = os.path.join(head, '@' + tail)
|
tempname = os.path.join(head, '@' + tail)
|
||||||
g = None
|
g = None
|
||||||
# If we find a match, we rewind the file and start over but
|
# If we find a match, we rewind the file and start over but
|
||||||
# now copy everything to a temp file.
|
# now copy everything to a temp file.
|
||||||
lineno = 0
|
lineno = 0
|
||||||
while 1:
|
while 1:
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
if not line: break
|
if not line: break
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
while line[-2:] == '\\\n':
|
while line[-2:] == '\\\n':
|
||||||
nextline = f.readline()
|
nextline = f.readline()
|
||||||
if not nextline: break
|
if not nextline: break
|
||||||
line = line + nextline
|
line = line + nextline
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
newline = fixline(line)
|
newline = fixline(line)
|
||||||
if newline != line:
|
if newline != line:
|
||||||
if g is None:
|
if g is None:
|
||||||
try:
|
try:
|
||||||
g = open(tempname, 'w')
|
g = open(tempname, 'w')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
f.close()
|
f.close()
|
||||||
err(tempname+': cannot create: '+\
|
err(tempname+': cannot create: '+\
|
||||||
`msg`+'\n')
|
`msg`+'\n')
|
||||||
return 1
|
return 1
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
lineno = 0
|
lineno = 0
|
||||||
rep(filename + ':\n')
|
rep(filename + ':\n')
|
||||||
continue # restart from the beginning
|
continue # restart from the beginning
|
||||||
rep(`lineno` + '\n')
|
rep(`lineno` + '\n')
|
||||||
rep('< ' + line)
|
rep('< ' + line)
|
||||||
rep('> ' + newline)
|
rep('> ' + newline)
|
||||||
if g is not None:
|
if g is not None:
|
||||||
g.write(newline)
|
g.write(newline)
|
||||||
|
|
||||||
# End of file
|
# End of file
|
||||||
f.close()
|
f.close()
|
||||||
if not g: return 0 # No changes
|
if not g: return 0 # No changes
|
||||||
|
|
||||||
# Finishing touch -- move files
|
# Finishing touch -- move files
|
||||||
|
|
||||||
# First copy the file's mode to the temp file
|
# First copy the file's mode to the temp file
|
||||||
try:
|
try:
|
||||||
statbuf = os.stat(filename)
|
statbuf = os.stat(filename)
|
||||||
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(tempname + ': warning: chmod failed (' + `msg` + ')\n')
|
err(tempname + ': warning: chmod failed (' + `msg` + ')\n')
|
||||||
# Then make a backup of the original file as filename~
|
# Then make a backup of the original file as filename~
|
||||||
try:
|
try:
|
||||||
os.rename(filename, filename + '~')
|
os.rename(filename, filename + '~')
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(filename + ': warning: backup failed (' + `msg` + ')\n')
|
err(filename + ': warning: backup failed (' + `msg` + ')\n')
|
||||||
# Now move the temp file to the original file
|
# Now move the temp file to the original file
|
||||||
try:
|
try:
|
||||||
os.rename(tempname, filename)
|
os.rename(tempname, filename)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(filename + ': rename failed (' + `msg` + ')\n')
|
err(filename + ': rename failed (' + `msg` + ')\n')
|
||||||
return 1
|
return 1
|
||||||
# Return succes
|
# Return succes
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
# This expression doesn't catch *all* class definition headers,
|
# This expression doesn't catch *all* class definition headers,
|
||||||
# but it's pretty darn close.
|
# but it's pretty darn close.
|
||||||
|
@ -159,34 +159,34 @@ baseprog = regex.compile(baseexpr)
|
||||||
import string
|
import string
|
||||||
|
|
||||||
def fixline(line):
|
def fixline(line):
|
||||||
if classprog.match(line) < 0: # No 'class' keyword -- no change
|
if classprog.match(line) < 0: # No 'class' keyword -- no change
|
||||||
return line
|
return line
|
||||||
|
|
||||||
(a0, b0), (a1, b1), (a2, b2) = classprog.regs[:3]
|
|
||||||
# a0, b0 = Whole match (up to ':')
|
|
||||||
# a1, b1 = First subexpression (up to classname)
|
|
||||||
# a2, b2 = Second subexpression (=.*)
|
|
||||||
head = line[:b1]
|
|
||||||
tail = line[b0:] # Unmatched rest of line
|
|
||||||
|
|
||||||
if a2 == b2: # No base classes -- easy case
|
|
||||||
return head + ':' + tail
|
|
||||||
|
|
||||||
# Get rid of leading '='
|
|
||||||
basepart = line[a2+1:b2]
|
|
||||||
|
|
||||||
# Extract list of base expressions
|
(a0, b0), (a1, b1), (a2, b2) = classprog.regs[:3]
|
||||||
bases = string.splitfields(basepart, ',')
|
# a0, b0 = Whole match (up to ':')
|
||||||
|
# a1, b1 = First subexpression (up to classname)
|
||||||
# Strip trailing '()' from each base expression
|
# a2, b2 = Second subexpression (=.*)
|
||||||
for i in range(len(bases)):
|
head = line[:b1]
|
||||||
if baseprog.match(bases[i]) >= 0:
|
tail = line[b0:] # Unmatched rest of line
|
||||||
x1, y1 = baseprog.regs[1]
|
|
||||||
bases[i] = bases[i][x1:y1]
|
if a2 == b2: # No base classes -- easy case
|
||||||
|
return head + ':' + tail
|
||||||
# Join the bases back again and build the new line
|
|
||||||
basepart = string.joinfields(bases, ', ')
|
# Get rid of leading '='
|
||||||
|
basepart = line[a2+1:b2]
|
||||||
return head + '(' + basepart + '):' + tail
|
|
||||||
|
# Extract list of base expressions
|
||||||
|
bases = string.splitfields(basepart, ',')
|
||||||
|
|
||||||
|
# Strip trailing '()' from each base expression
|
||||||
|
for i in range(len(bases)):
|
||||||
|
if baseprog.match(bases[i]) >= 0:
|
||||||
|
x1, y1 = baseprog.regs[1]
|
||||||
|
bases[i] = bases[i][x1:y1]
|
||||||
|
|
||||||
|
# Join the bases back again and build the new line
|
||||||
|
basepart = string.joinfields(bases, ', ')
|
||||||
|
|
||||||
|
return head + '(' + basepart + '):' + tail
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -7,19 +7,19 @@ import os
|
||||||
from stat import ST_ATIME, ST_MTIME # Really constants 7 and 8
|
from stat import ST_ATIME, ST_MTIME # Really constants 7 and 8
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if len(sys.argv) <> 3:
|
if len(sys.argv) <> 3:
|
||||||
sys.stderr.write('usage: copytime source destination\n')
|
sys.stderr.write('usage: copytime source destination\n')
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
file1, file2 = sys.argv[1], sys.argv[2]
|
file1, file2 = sys.argv[1], sys.argv[2]
|
||||||
try:
|
try:
|
||||||
stat1 = os.stat(file1)
|
stat1 = os.stat(file1)
|
||||||
except os.error:
|
except os.error:
|
||||||
sys.stderr.write(file1 + ': cannot stat\n')
|
sys.stderr.write(file1 + ': cannot stat\n')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
try:
|
try:
|
||||||
os.utime(file2, (stat1[ST_ATIME], stat1[ST_MTIME]))
|
os.utime(file2, (stat1[ST_ATIME], stat1[ST_MTIME]))
|
||||||
except os.error:
|
except os.error:
|
||||||
sys.stderr.write(file2 + ': cannot change time\n')
|
sys.stderr.write(file2 + ': cannot change time\n')
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -4,56 +4,56 @@
|
||||||
import os, string, sys, errno
|
import os, string, sys, errno
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
p = os.popen('du ' + string.join(sys.argv[1:]), 'r')
|
p = os.popen('du ' + string.join(sys.argv[1:]), 'r')
|
||||||
total, d = None, {}
|
total, d = None, {}
|
||||||
for line in p.readlines():
|
for line in p.readlines():
|
||||||
i = 0
|
i = 0
|
||||||
while line[i] in '0123456789': i = i+1
|
while line[i] in '0123456789': i = i+1
|
||||||
size = eval(line[:i])
|
size = eval(line[:i])
|
||||||
while line[i] in ' \t': i = i+1
|
while line[i] in ' \t': i = i+1
|
||||||
file = line[i:-1]
|
file = line[i:-1]
|
||||||
comps = string.splitfields(file, '/')
|
comps = string.splitfields(file, '/')
|
||||||
if comps[0] == '': comps[0] = '/'
|
if comps[0] == '': comps[0] = '/'
|
||||||
if comps[len(comps)-1] == '': del comps[len(comps)-1]
|
if comps[len(comps)-1] == '': del comps[len(comps)-1]
|
||||||
total, d = store(size, comps, total, d)
|
total, d = store(size, comps, total, d)
|
||||||
try:
|
try:
|
||||||
display(total, d)
|
display(total, d)
|
||||||
except IOError, e:
|
except IOError, e:
|
||||||
if e.errno != errno.EPIPE:
|
if e.errno != errno.EPIPE:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def store(size, comps, total, d):
|
def store(size, comps, total, d):
|
||||||
if comps == []:
|
if comps == []:
|
||||||
return size, d
|
return size, d
|
||||||
if not d.has_key(comps[0]):
|
if not d.has_key(comps[0]):
|
||||||
d[comps[0]] = None, {}
|
d[comps[0]] = None, {}
|
||||||
t1, d1 = d[comps[0]]
|
t1, d1 = d[comps[0]]
|
||||||
d[comps[0]] = store(size, comps[1:], t1, d1)
|
d[comps[0]] = store(size, comps[1:], t1, d1)
|
||||||
return total, d
|
return total, d
|
||||||
|
|
||||||
def display(total, d):
|
def display(total, d):
|
||||||
show(total, d, '')
|
show(total, d, '')
|
||||||
|
|
||||||
def show(total, d, prefix):
|
def show(total, d, prefix):
|
||||||
if not d: return
|
if not d: return
|
||||||
list = []
|
list = []
|
||||||
sum = 0
|
sum = 0
|
||||||
for key in d.keys():
|
for key in d.keys():
|
||||||
tsub, dsub = d[key]
|
tsub, dsub = d[key]
|
||||||
list.append((tsub, key))
|
list.append((tsub, key))
|
||||||
if tsub is not None: sum = sum + tsub
|
if tsub is not None: sum = sum + tsub
|
||||||
## if sum < total:
|
## if sum < total:
|
||||||
## list.append((total - sum, os.curdir))
|
## list.append((total - sum, os.curdir))
|
||||||
list.sort()
|
list.sort()
|
||||||
list.reverse()
|
list.reverse()
|
||||||
width = len(`list[0][0]`)
|
width = len(`list[0][0]`)
|
||||||
for tsub, key in list:
|
for tsub, key in list:
|
||||||
if tsub is None:
|
if tsub is None:
|
||||||
psub = prefix
|
psub = prefix
|
||||||
else:
|
else:
|
||||||
print prefix + string.rjust(`tsub`, width) + ' ' + key
|
print prefix + string.rjust(`tsub`, width) + ' ' + key
|
||||||
psub = prefix + ' '*(width-1) + '|' + ' '*(len(key)+1)
|
psub = prefix + ' '*(width-1) + '|' + ' '*(len(key)+1)
|
||||||
if d.has_key(key):
|
if d.has_key(key):
|
||||||
show(tsub, d[key][1], psub)
|
show(tsub, d[key][1], psub)
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -10,33 +10,33 @@ import regex
|
||||||
import getopt
|
import getopt
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], '')
|
opts, args = getopt.getopt(sys.argv[1:], '')
|
||||||
if len(args) < 2:
|
if len(args) < 2:
|
||||||
raise getopt.error, 'not enough arguments'
|
raise getopt.error, 'not enough arguments'
|
||||||
except getopt.error, msg:
|
except getopt.error, msg:
|
||||||
sys.stdout = sys.stderr
|
sys.stdout = sys.stderr
|
||||||
print msg
|
print msg
|
||||||
print 'usage: findlinksto pattern directory ...'
|
print 'usage: findlinksto pattern directory ...'
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
pat, dirs = args[0], args[1:]
|
pat, dirs = args[0], args[1:]
|
||||||
prog = regex.compile(pat)
|
prog = regex.compile(pat)
|
||||||
for dirname in dirs:
|
for dirname in dirs:
|
||||||
os.path.walk(dirname, visit, prog)
|
os.path.walk(dirname, visit, prog)
|
||||||
|
|
||||||
def visit(prog, dirname, names):
|
def visit(prog, dirname, names):
|
||||||
if os.path.islink(dirname):
|
if os.path.islink(dirname):
|
||||||
names[:] = []
|
names[:] = []
|
||||||
return
|
return
|
||||||
if os.path.ismount(dirname):
|
if os.path.ismount(dirname):
|
||||||
print 'descend into', dirname
|
print 'descend into', dirname
|
||||||
for name in names:
|
for name in names:
|
||||||
name = os.path.join(dirname, name)
|
name = os.path.join(dirname, name)
|
||||||
try:
|
try:
|
||||||
linkto = os.readlink(name)
|
linkto = os.readlink(name)
|
||||||
if prog.search(linkto) >= 0:
|
if prog.search(linkto) >= 0:
|
||||||
print name, '->', linkto
|
print name, '->', linkto
|
||||||
except os.error:
|
except os.error:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -46,151 +46,151 @@ dbg = err
|
||||||
rep = sys.stdout.write
|
rep = sys.stdout.write
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
progname = sys.argv[0]
|
progname = sys.argv[0]
|
||||||
err('Usage: ' + progname +
|
err('Usage: ' + progname +
|
||||||
' [-c] [-r] [-s file] ... file-or-directory ...\n')
|
' [-c] [-r] [-s file] ... file-or-directory ...\n')
|
||||||
err('\n')
|
err('\n')
|
||||||
err('-c : substitute inside comments\n')
|
err('-c : substitute inside comments\n')
|
||||||
err('-r : reverse direction for following -s options\n')
|
err('-r : reverse direction for following -s options\n')
|
||||||
err('-s substfile : add a file of substitutions\n')
|
err('-s substfile : add a file of substitutions\n')
|
||||||
err('\n')
|
err('\n')
|
||||||
err('Each non-empty non-comment line in a substitution file must\n')
|
err('Each non-empty non-comment line in a substitution file must\n')
|
||||||
err('contain exactly two words: an identifier and its replacement.\n')
|
err('contain exactly two words: an identifier and its replacement.\n')
|
||||||
err('Comments start with a # character and end at end of line.\n')
|
err('Comments start with a # character and end at end of line.\n')
|
||||||
err('If an identifier is preceded with a *, it is not substituted\n')
|
err('If an identifier is preceded with a *, it is not substituted\n')
|
||||||
err('inside a comment even when -c is specified.\n')
|
err('inside a comment even when -c is specified.\n')
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'crs:')
|
opts, args = getopt.getopt(sys.argv[1:], 'crs:')
|
||||||
except getopt.error, msg:
|
except getopt.error, msg:
|
||||||
err('Options error: ' + str(msg) + '\n')
|
err('Options error: ' + str(msg) + '\n')
|
||||||
usage()
|
usage()
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
bad = 0
|
bad = 0
|
||||||
if not args: # No arguments
|
if not args: # No arguments
|
||||||
usage()
|
usage()
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
for opt, arg in opts:
|
for opt, arg in opts:
|
||||||
if opt == '-c':
|
if opt == '-c':
|
||||||
setdocomments()
|
setdocomments()
|
||||||
if opt == '-r':
|
if opt == '-r':
|
||||||
setreverse()
|
setreverse()
|
||||||
if opt == '-s':
|
if opt == '-s':
|
||||||
addsubst(arg)
|
addsubst(arg)
|
||||||
for arg in args:
|
for arg in args:
|
||||||
if os.path.isdir(arg):
|
if os.path.isdir(arg):
|
||||||
if recursedown(arg): bad = 1
|
if recursedown(arg): bad = 1
|
||||||
elif os.path.islink(arg):
|
elif os.path.islink(arg):
|
||||||
err(arg + ': will not process symbolic links\n')
|
err(arg + ': will not process symbolic links\n')
|
||||||
bad = 1
|
bad = 1
|
||||||
else:
|
else:
|
||||||
if fix(arg): bad = 1
|
if fix(arg): bad = 1
|
||||||
sys.exit(bad)
|
sys.exit(bad)
|
||||||
|
|
||||||
# Change this regular expression to select a different set of files
|
# Change this regular expression to select a different set of files
|
||||||
Wanted = '^[a-zA-Z0-9_]+\.[ch]$'
|
Wanted = '^[a-zA-Z0-9_]+\.[ch]$'
|
||||||
def wanted(name):
|
def wanted(name):
|
||||||
return regex.match(Wanted, name) >= 0
|
return regex.match(Wanted, name) >= 0
|
||||||
|
|
||||||
def recursedown(dirname):
|
def recursedown(dirname):
|
||||||
dbg('recursedown(' + `dirname` + ')\n')
|
dbg('recursedown(' + `dirname` + ')\n')
|
||||||
bad = 0
|
bad = 0
|
||||||
try:
|
try:
|
||||||
names = os.listdir(dirname)
|
names = os.listdir(dirname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(dirname + ': cannot list directory: ' + str(msg) + '\n')
|
err(dirname + ': cannot list directory: ' + str(msg) + '\n')
|
||||||
return 1
|
return 1
|
||||||
names.sort()
|
names.sort()
|
||||||
subdirs = []
|
subdirs = []
|
||||||
for name in names:
|
for name in names:
|
||||||
if name in (os.curdir, os.pardir): continue
|
if name in (os.curdir, os.pardir): continue
|
||||||
fullname = os.path.join(dirname, name)
|
fullname = os.path.join(dirname, name)
|
||||||
if os.path.islink(fullname): pass
|
if os.path.islink(fullname): pass
|
||||||
elif os.path.isdir(fullname):
|
elif os.path.isdir(fullname):
|
||||||
subdirs.append(fullname)
|
subdirs.append(fullname)
|
||||||
elif wanted(name):
|
elif wanted(name):
|
||||||
if fix(fullname): bad = 1
|
if fix(fullname): bad = 1
|
||||||
for fullname in subdirs:
|
for fullname in subdirs:
|
||||||
if recursedown(fullname): bad = 1
|
if recursedown(fullname): bad = 1
|
||||||
return bad
|
return bad
|
||||||
|
|
||||||
def fix(filename):
|
def fix(filename):
|
||||||
## dbg('fix(' + `filename` + ')\n')
|
## dbg('fix(' + `filename` + ')\n')
|
||||||
if filename == '-':
|
if filename == '-':
|
||||||
# Filter mode
|
# Filter mode
|
||||||
f = sys.stdin
|
f = sys.stdin
|
||||||
g = sys.stdout
|
g = sys.stdout
|
||||||
else:
|
else:
|
||||||
# File replacement mode
|
# File replacement mode
|
||||||
try:
|
try:
|
||||||
f = open(filename, 'r')
|
f = open(filename, 'r')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
err(filename + ': cannot open: ' + str(msg) + '\n')
|
err(filename + ': cannot open: ' + str(msg) + '\n')
|
||||||
return 1
|
return 1
|
||||||
head, tail = os.path.split(filename)
|
head, tail = os.path.split(filename)
|
||||||
tempname = os.path.join(head, '@' + tail)
|
tempname = os.path.join(head, '@' + tail)
|
||||||
g = None
|
g = None
|
||||||
# If we find a match, we rewind the file and start over but
|
# If we find a match, we rewind the file and start over but
|
||||||
# now copy everything to a temp file.
|
# now copy everything to a temp file.
|
||||||
lineno = 0
|
lineno = 0
|
||||||
initfixline()
|
initfixline()
|
||||||
while 1:
|
while 1:
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
if not line: break
|
if not line: break
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
while line[-2:] == '\\\n':
|
while line[-2:] == '\\\n':
|
||||||
nextline = f.readline()
|
nextline = f.readline()
|
||||||
if not nextline: break
|
if not nextline: break
|
||||||
line = line + nextline
|
line = line + nextline
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
newline = fixline(line)
|
newline = fixline(line)
|
||||||
if newline != line:
|
if newline != line:
|
||||||
if g is None:
|
if g is None:
|
||||||
try:
|
try:
|
||||||
g = open(tempname, 'w')
|
g = open(tempname, 'w')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
f.close()
|
f.close()
|
||||||
err(tempname+': cannot create: '+
|
err(tempname+': cannot create: '+
|
||||||
str(msg)+'\n')
|
str(msg)+'\n')
|
||||||
return 1
|
return 1
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
lineno = 0
|
lineno = 0
|
||||||
initfixline()
|
initfixline()
|
||||||
rep(filename + ':\n')
|
rep(filename + ':\n')
|
||||||
continue # restart from the beginning
|
continue # restart from the beginning
|
||||||
rep(`lineno` + '\n')
|
rep(`lineno` + '\n')
|
||||||
rep('< ' + line)
|
rep('< ' + line)
|
||||||
rep('> ' + newline)
|
rep('> ' + newline)
|
||||||
if g is not None:
|
if g is not None:
|
||||||
g.write(newline)
|
g.write(newline)
|
||||||
|
|
||||||
# End of file
|
# End of file
|
||||||
if filename == '-': return 0 # Done in filter mode
|
if filename == '-': return 0 # Done in filter mode
|
||||||
f.close()
|
f.close()
|
||||||
if not g: return 0 # No changes
|
if not g: return 0 # No changes
|
||||||
|
|
||||||
# Finishing touch -- move files
|
# Finishing touch -- move files
|
||||||
|
|
||||||
# First copy the file's mode to the temp file
|
# First copy the file's mode to the temp file
|
||||||
try:
|
try:
|
||||||
statbuf = os.stat(filename)
|
statbuf = os.stat(filename)
|
||||||
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(tempname + ': warning: chmod failed (' + str(msg) + ')\n')
|
err(tempname + ': warning: chmod failed (' + str(msg) + ')\n')
|
||||||
# Then make a backup of the original file as filename~
|
# Then make a backup of the original file as filename~
|
||||||
try:
|
try:
|
||||||
os.rename(filename, filename + '~')
|
os.rename(filename, filename + '~')
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(filename + ': warning: backup failed (' + str(msg) + ')\n')
|
err(filename + ': warning: backup failed (' + str(msg) + ')\n')
|
||||||
# Now move the temp file to the original file
|
# Now move the temp file to the original file
|
||||||
try:
|
try:
|
||||||
os.rename(tempname, filename)
|
os.rename(tempname, filename)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(filename + ': rename failed (' + str(msg) + ')\n')
|
err(filename + ': rename failed (' + str(msg) + ')\n')
|
||||||
return 1
|
return 1
|
||||||
# Return succes
|
# Return succes
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
# Tokenizing ANSI C (partly)
|
# Tokenizing ANSI C (partly)
|
||||||
|
|
||||||
|
@ -221,98 +221,98 @@ InsideCommentPattern = '\(' + string.joinfields(InsideComment, '\|') + '\)'
|
||||||
InsideCommentProgram = regex.compile(InsideCommentPattern)
|
InsideCommentProgram = regex.compile(InsideCommentPattern)
|
||||||
|
|
||||||
def initfixline():
|
def initfixline():
|
||||||
global Program
|
global Program
|
||||||
Program = OutsideCommentProgram
|
Program = OutsideCommentProgram
|
||||||
|
|
||||||
def fixline(line):
|
def fixline(line):
|
||||||
global Program
|
global Program
|
||||||
## print '-->', `line`
|
## print '-->', `line`
|
||||||
i = 0
|
i = 0
|
||||||
while i < len(line):
|
while i < len(line):
|
||||||
i = Program.search(line, i)
|
i = Program.search(line, i)
|
||||||
if i < 0: break
|
if i < 0: break
|
||||||
found = Program.group(0)
|
found = Program.group(0)
|
||||||
## if Program is InsideCommentProgram: print '...',
|
## if Program is InsideCommentProgram: print '...',
|
||||||
## else: print ' ',
|
## else: print ' ',
|
||||||
## print found
|
## print found
|
||||||
if len(found) == 2:
|
if len(found) == 2:
|
||||||
if found == '/*':
|
if found == '/*':
|
||||||
Program = InsideCommentProgram
|
Program = InsideCommentProgram
|
||||||
elif found == '*/':
|
elif found == '*/':
|
||||||
Program = OutsideCommentProgram
|
Program = OutsideCommentProgram
|
||||||
n = len(found)
|
n = len(found)
|
||||||
if Dict.has_key(found):
|
if Dict.has_key(found):
|
||||||
subst = Dict[found]
|
subst = Dict[found]
|
||||||
if Program is InsideCommentProgram:
|
if Program is InsideCommentProgram:
|
||||||
if not Docomments:
|
if not Docomments:
|
||||||
print 'Found in comment:', found
|
print 'Found in comment:', found
|
||||||
i = i + n
|
i = i + n
|
||||||
continue
|
continue
|
||||||
if NotInComment.has_key(found):
|
if NotInComment.has_key(found):
|
||||||
## print 'Ignored in comment:',
|
## print 'Ignored in comment:',
|
||||||
## print found, '-->', subst
|
## print found, '-->', subst
|
||||||
## print 'Line:', line,
|
## print 'Line:', line,
|
||||||
subst = found
|
subst = found
|
||||||
## else:
|
## else:
|
||||||
## print 'Substituting in comment:',
|
## print 'Substituting in comment:',
|
||||||
## print found, '-->', subst
|
## print found, '-->', subst
|
||||||
## print 'Line:', line,
|
## print 'Line:', line,
|
||||||
line = line[:i] + subst + line[i+n:]
|
line = line[:i] + subst + line[i+n:]
|
||||||
n = len(subst)
|
n = len(subst)
|
||||||
i = i + n
|
i = i + n
|
||||||
return line
|
return line
|
||||||
|
|
||||||
Docomments = 0
|
Docomments = 0
|
||||||
def setdocomments():
|
def setdocomments():
|
||||||
global Docomments
|
global Docomments
|
||||||
Docomments = 1
|
Docomments = 1
|
||||||
|
|
||||||
Reverse = 0
|
Reverse = 0
|
||||||
def setreverse():
|
def setreverse():
|
||||||
global Reverse
|
global Reverse
|
||||||
Reverse = (not Reverse)
|
Reverse = (not Reverse)
|
||||||
|
|
||||||
Dict = {}
|
Dict = {}
|
||||||
NotInComment = {}
|
NotInComment = {}
|
||||||
def addsubst(substfile):
|
def addsubst(substfile):
|
||||||
try:
|
try:
|
||||||
fp = open(substfile, 'r')
|
fp = open(substfile, 'r')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
err(substfile + ': cannot read substfile: ' + str(msg) + '\n')
|
err(substfile + ': cannot read substfile: ' + str(msg) + '\n')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
lineno = 0
|
lineno = 0
|
||||||
while 1:
|
while 1:
|
||||||
line = fp.readline()
|
line = fp.readline()
|
||||||
if not line: break
|
if not line: break
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
try:
|
try:
|
||||||
i = string.index(line, '#')
|
i = string.index(line, '#')
|
||||||
except string.index_error:
|
except string.index_error:
|
||||||
i = -1 # Happens to delete trailing \n
|
i = -1 # Happens to delete trailing \n
|
||||||
words = string.split(line[:i])
|
words = string.split(line[:i])
|
||||||
if not words: continue
|
if not words: continue
|
||||||
if len(words) == 3 and words[0] == 'struct':
|
if len(words) == 3 and words[0] == 'struct':
|
||||||
words[:2] = [words[0] + ' ' + words[1]]
|
words[:2] = [words[0] + ' ' + words[1]]
|
||||||
elif len(words) <> 2:
|
elif len(words) <> 2:
|
||||||
err(substfile + ':' + `lineno` +
|
err(substfile + ':' + `lineno` +
|
||||||
': warning: bad line: ' + line)
|
': warning: bad line: ' + line)
|
||||||
continue
|
continue
|
||||||
if Reverse:
|
if Reverse:
|
||||||
[value, key] = words
|
[value, key] = words
|
||||||
else:
|
else:
|
||||||
[key, value] = words
|
[key, value] = words
|
||||||
if value[0] == '*':
|
if value[0] == '*':
|
||||||
value = value[1:]
|
value = value[1:]
|
||||||
if key[0] == '*':
|
if key[0] == '*':
|
||||||
key = key[1:]
|
key = key[1:]
|
||||||
NotInComment[key] = value
|
NotInComment[key] = value
|
||||||
if Dict.has_key(key):
|
if Dict.has_key(key):
|
||||||
err(substfile + ':' + `lineno` +
|
err(substfile + ':' + `lineno` +
|
||||||
': warning: overriding: ' +
|
': warning: overriding: ' +
|
||||||
key + ' ' + value + '\n')
|
key + ' ' + value + '\n')
|
||||||
err(substfile + ':' + `lineno` +
|
err(substfile + ':' + `lineno` +
|
||||||
': warning: previous: ' + Dict[key] + '\n')
|
': warning: previous: ' + Dict[key] + '\n')
|
||||||
Dict[key] = value
|
Dict[key] = value
|
||||||
fp.close()
|
fp.close()
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -6,44 +6,44 @@ import sys
|
||||||
import string
|
import string
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
for file in args:
|
for file in args:
|
||||||
process(file)
|
process(file)
|
||||||
|
|
||||||
def process(file):
|
def process(file):
|
||||||
try:
|
try:
|
||||||
f = open(file, 'r')
|
f = open(file, 'r')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
sys.stderr.write('%s: can\'t open: %s\n' % (file, str(msg)))
|
sys.stderr.write('%s: can\'t open: %s\n' % (file, str(msg)))
|
||||||
return
|
return
|
||||||
data = f.read()
|
data = f.read()
|
||||||
f.close()
|
f.close()
|
||||||
if data[:2] <> '/*':
|
if data[:2] <> '/*':
|
||||||
sys.stderr.write('%s does not begin with C comment\n' % file)
|
sys.stderr.write('%s does not begin with C comment\n' % file)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
f = open(file, 'w')
|
f = open(file, 'w')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
sys.stderr.write('%s: can\'t write: %s\n' % (file, str(msg)))
|
sys.stderr.write('%s: can\'t write: %s\n' % (file, str(msg)))
|
||||||
return
|
return
|
||||||
sys.stderr.write('Processing %s ...\n' % file)
|
sys.stderr.write('Processing %s ...\n' % file)
|
||||||
magic = 'Py_'
|
magic = 'Py_'
|
||||||
for c in file:
|
for c in file:
|
||||||
if c in string.letters + string.digits:
|
if c in string.letters + string.digits:
|
||||||
magic = magic + string.upper(c)
|
magic = magic + string.upper(c)
|
||||||
else: magic = magic + '_'
|
else: magic = magic + '_'
|
||||||
sys.stdout = f
|
sys.stdout = f
|
||||||
print '#ifndef', magic
|
print '#ifndef', magic
|
||||||
print '#define', magic
|
print '#define', magic
|
||||||
print '#ifdef __cplusplus'
|
print '#ifdef __cplusplus'
|
||||||
print 'extern "C" {'
|
print 'extern "C" {'
|
||||||
print '#endif'
|
print '#endif'
|
||||||
print
|
print
|
||||||
f.write(data)
|
f.write(data)
|
||||||
print
|
print
|
||||||
print '#ifdef __cplusplus'
|
print '#ifdef __cplusplus'
|
||||||
print '}'
|
print '}'
|
||||||
print '#endif'
|
print '#endif'
|
||||||
print '#endif /*', '!'+magic, '*/'
|
print '#endif /*', '!'+magic, '*/'
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -8,26 +8,26 @@ import re
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
for file in sys.argv[1:]:
|
for file in sys.argv[1:]:
|
||||||
try:
|
try:
|
||||||
f = open(file, 'r')
|
f = open(file, 'r')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
print file, ': can\'t open :', msg
|
print file, ': can\'t open :', msg
|
||||||
continue
|
continue
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
if not re.match('^#! */usr/local/bin/python', line):
|
if not re.match('^#! */usr/local/bin/python', line):
|
||||||
print file, ': not a /usr/local/bin/python script'
|
print file, ': not a /usr/local/bin/python script'
|
||||||
f.close()
|
f.close()
|
||||||
continue
|
continue
|
||||||
rest = f.read()
|
rest = f.read()
|
||||||
f.close()
|
f.close()
|
||||||
line = re.sub('/usr/local/bin/python',
|
line = re.sub('/usr/local/bin/python',
|
||||||
'/usr/bin/env python', line)
|
'/usr/bin/env python', line)
|
||||||
print file, ':', `line`
|
print file, ':', `line`
|
||||||
f = open(file, "w")
|
f = open(file, "w")
|
||||||
f.write(line)
|
f.write(line)
|
||||||
f.write(rest)
|
f.write(rest)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
usage: ftpmirror [-v] [-q] [-i] [-m] [-n] [-r] [-s pat]
|
usage: ftpmirror [-v] [-q] [-i] [-m] [-n] [-r] [-s pat]
|
||||||
[-l username [-p passwd [-a account]]]
|
[-l username [-p passwd [-a account]]]
|
||||||
hostname [remotedir [localdir]]
|
hostname [remotedir [localdir]]
|
||||||
-v: verbose
|
-v: verbose
|
||||||
-q: quiet
|
-q: quiet
|
||||||
-i: interactive mode
|
-i: interactive mode
|
||||||
|
@ -28,10 +28,10 @@ from fnmatch import fnmatch
|
||||||
|
|
||||||
# Print usage message and exit
|
# Print usage message and exit
|
||||||
def usage(*args):
|
def usage(*args):
|
||||||
sys.stdout = sys.stderr
|
sys.stdout = sys.stderr
|
||||||
for msg in args: print msg
|
for msg in args: print msg
|
||||||
print __doc__
|
print __doc__
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
verbose = 1 # 0 for -q, 2 for -v
|
verbose = 1 # 0 for -q, 2 for -v
|
||||||
interactive = 0
|
interactive = 0
|
||||||
|
@ -42,356 +42,356 @@ skippats = ['.', '..', '.mirrorinfo']
|
||||||
|
|
||||||
# Main program: parse command line and start processing
|
# Main program: parse command line and start processing
|
||||||
def main():
|
def main():
|
||||||
global verbose, interactive, mac, rmok, nologin
|
global verbose, interactive, mac, rmok, nologin
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'a:bil:mnp:qrs:v')
|
opts, args = getopt.getopt(sys.argv[1:], 'a:bil:mnp:qrs:v')
|
||||||
except getopt.error, msg:
|
except getopt.error, msg:
|
||||||
usage(msg)
|
usage(msg)
|
||||||
login = ''
|
login = ''
|
||||||
passwd = ''
|
passwd = ''
|
||||||
account = ''
|
account = ''
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o == '-l': login = a
|
if o == '-l': login = a
|
||||||
if o == '-p': passwd = a
|
if o == '-p': passwd = a
|
||||||
if o == '-a': account = a
|
if o == '-a': account = a
|
||||||
if o == '-v': verbose = verbose + 1
|
if o == '-v': verbose = verbose + 1
|
||||||
if o == '-q': verbose = 0
|
if o == '-q': verbose = 0
|
||||||
if o == '-i': interactive = 1
|
if o == '-i': interactive = 1
|
||||||
if o == '-m': mac = 1; nologin = 1; skippats.append('*.o')
|
if o == '-m': mac = 1; nologin = 1; skippats.append('*.o')
|
||||||
if o == '-n': nologin = 1
|
if o == '-n': nologin = 1
|
||||||
if o == '-r': rmok = 1
|
if o == '-r': rmok = 1
|
||||||
if o == '-s': skippats.append(a)
|
if o == '-s': skippats.append(a)
|
||||||
if not args: usage('hostname missing')
|
if not args: usage('hostname missing')
|
||||||
host = args[0]
|
host = args[0]
|
||||||
remotedir = ''
|
remotedir = ''
|
||||||
localdir = ''
|
localdir = ''
|
||||||
if args[1:]:
|
if args[1:]:
|
||||||
remotedir = args[1]
|
remotedir = args[1]
|
||||||
if args[2:]:
|
if args[2:]:
|
||||||
localdir = args[2]
|
localdir = args[2]
|
||||||
if args[3:]: usage('too many arguments')
|
if args[3:]: usage('too many arguments')
|
||||||
#
|
#
|
||||||
f = ftplib.FTP()
|
f = ftplib.FTP()
|
||||||
if verbose: print 'Connecting to %s...' % `host`
|
if verbose: print 'Connecting to %s...' % `host`
|
||||||
f.connect(host)
|
f.connect(host)
|
||||||
if not nologin:
|
if not nologin:
|
||||||
if verbose:
|
if verbose:
|
||||||
print 'Logging in as %s...' % `login or 'anonymous'`
|
print 'Logging in as %s...' % `login or 'anonymous'`
|
||||||
f.login(login, passwd, account)
|
f.login(login, passwd, account)
|
||||||
if verbose: print 'OK.'
|
if verbose: print 'OK.'
|
||||||
pwd = f.pwd()
|
pwd = f.pwd()
|
||||||
if verbose > 1: print 'PWD =', `pwd`
|
if verbose > 1: print 'PWD =', `pwd`
|
||||||
if remotedir:
|
if remotedir:
|
||||||
if verbose > 1: print 'cwd(%s)' % `remotedir`
|
if verbose > 1: print 'cwd(%s)' % `remotedir`
|
||||||
f.cwd(remotedir)
|
f.cwd(remotedir)
|
||||||
if verbose > 1: print 'OK.'
|
if verbose > 1: print 'OK.'
|
||||||
pwd = f.pwd()
|
pwd = f.pwd()
|
||||||
if verbose > 1: print 'PWD =', `pwd`
|
if verbose > 1: print 'PWD =', `pwd`
|
||||||
#
|
#
|
||||||
mirrorsubdir(f, localdir)
|
mirrorsubdir(f, localdir)
|
||||||
|
|
||||||
# Core logic: mirror one subdirectory (recursively)
|
# Core logic: mirror one subdirectory (recursively)
|
||||||
def mirrorsubdir(f, localdir):
|
def mirrorsubdir(f, localdir):
|
||||||
pwd = f.pwd()
|
pwd = f.pwd()
|
||||||
if localdir and not os.path.isdir(localdir):
|
if localdir and not os.path.isdir(localdir):
|
||||||
if verbose: print 'Creating local directory', `localdir`
|
if verbose: print 'Creating local directory', `localdir`
|
||||||
try:
|
try:
|
||||||
makedir(localdir)
|
makedir(localdir)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
print "Failed to establish local directory", `localdir`
|
print "Failed to establish local directory", `localdir`
|
||||||
return
|
return
|
||||||
infofilename = os.path.join(localdir, '.mirrorinfo')
|
infofilename = os.path.join(localdir, '.mirrorinfo')
|
||||||
try:
|
try:
|
||||||
text = open(infofilename, 'r').read()
|
text = open(infofilename, 'r').read()
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
text = '{}'
|
text = '{}'
|
||||||
try:
|
try:
|
||||||
info = eval(text)
|
info = eval(text)
|
||||||
except (SyntaxError, NameError):
|
except (SyntaxError, NameError):
|
||||||
print 'Bad mirror info in %s' % `infofilename`
|
print 'Bad mirror info in %s' % `infofilename`
|
||||||
info = {}
|
info = {}
|
||||||
subdirs = []
|
subdirs = []
|
||||||
listing = []
|
listing = []
|
||||||
if verbose: print 'Listing remote directory %s...' % `pwd`
|
if verbose: print 'Listing remote directory %s...' % `pwd`
|
||||||
f.retrlines('LIST', listing.append)
|
f.retrlines('LIST', listing.append)
|
||||||
filesfound = []
|
filesfound = []
|
||||||
for line in listing:
|
for line in listing:
|
||||||
if verbose > 1: print '-->', `line`
|
if verbose > 1: print '-->', `line`
|
||||||
if mac:
|
if mac:
|
||||||
# Mac listing has just filenames;
|
# Mac listing has just filenames;
|
||||||
# trailing / means subdirectory
|
# trailing / means subdirectory
|
||||||
filename = string.strip(line)
|
filename = string.strip(line)
|
||||||
mode = '-'
|
mode = '-'
|
||||||
if filename[-1:] == '/':
|
if filename[-1:] == '/':
|
||||||
filename = filename[:-1]
|
filename = filename[:-1]
|
||||||
mode = 'd'
|
mode = 'd'
|
||||||
infostuff = ''
|
infostuff = ''
|
||||||
else:
|
else:
|
||||||
# Parse, assuming a UNIX listing
|
# Parse, assuming a UNIX listing
|
||||||
words = string.split(line, None, 8)
|
words = string.split(line, None, 8)
|
||||||
if len(words) < 6:
|
if len(words) < 6:
|
||||||
if verbose > 1: print 'Skipping short line'
|
if verbose > 1: print 'Skipping short line'
|
||||||
continue
|
continue
|
||||||
filename = string.lstrip(words[-1])
|
filename = string.lstrip(words[-1])
|
||||||
i = string.find(filename, " -> ")
|
i = string.find(filename, " -> ")
|
||||||
if i >= 0:
|
if i >= 0:
|
||||||
# words[0] had better start with 'l'...
|
# words[0] had better start with 'l'...
|
||||||
if verbose > 1:
|
if verbose > 1:
|
||||||
print 'Found symbolic link %s' % `filename`
|
print 'Found symbolic link %s' % `filename`
|
||||||
linkto = filename[i+4:]
|
linkto = filename[i+4:]
|
||||||
filename = filename[:i]
|
filename = filename[:i]
|
||||||
infostuff = words[-5:-1]
|
infostuff = words[-5:-1]
|
||||||
mode = words[0]
|
mode = words[0]
|
||||||
skip = 0
|
skip = 0
|
||||||
for pat in skippats:
|
for pat in skippats:
|
||||||
if fnmatch(filename, pat):
|
if fnmatch(filename, pat):
|
||||||
if verbose > 1:
|
if verbose > 1:
|
||||||
print 'Skip pattern', `pat`,
|
print 'Skip pattern', `pat`,
|
||||||
print 'matches', `filename`
|
print 'matches', `filename`
|
||||||
skip = 1
|
skip = 1
|
||||||
break
|
break
|
||||||
if skip:
|
if skip:
|
||||||
continue
|
continue
|
||||||
if mode[0] == 'd':
|
if mode[0] == 'd':
|
||||||
if verbose > 1:
|
if verbose > 1:
|
||||||
print 'Remembering subdirectory', `filename`
|
print 'Remembering subdirectory', `filename`
|
||||||
subdirs.append(filename)
|
subdirs.append(filename)
|
||||||
continue
|
continue
|
||||||
filesfound.append(filename)
|
filesfound.append(filename)
|
||||||
if info.has_key(filename) and info[filename] == infostuff:
|
if info.has_key(filename) and info[filename] == infostuff:
|
||||||
if verbose > 1:
|
if verbose > 1:
|
||||||
print 'Already have this version of',`filename`
|
print 'Already have this version of',`filename`
|
||||||
continue
|
continue
|
||||||
fullname = os.path.join(localdir, filename)
|
fullname = os.path.join(localdir, filename)
|
||||||
tempname = os.path.join(localdir, '@'+filename)
|
tempname = os.path.join(localdir, '@'+filename)
|
||||||
if interactive:
|
if interactive:
|
||||||
doit = askabout('file', filename, pwd)
|
doit = askabout('file', filename, pwd)
|
||||||
if not doit:
|
if not doit:
|
||||||
if not info.has_key(filename):
|
if not info.has_key(filename):
|
||||||
info[filename] = 'Not retrieved'
|
info[filename] = 'Not retrieved'
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
os.unlink(tempname)
|
os.unlink(tempname)
|
||||||
except os.error:
|
except os.error:
|
||||||
pass
|
pass
|
||||||
if mode[0] == 'l':
|
if mode[0] == 'l':
|
||||||
if verbose:
|
if verbose:
|
||||||
print "Creating symlink %s -> %s" % (
|
print "Creating symlink %s -> %s" % (
|
||||||
`filename`, `linkto`)
|
`filename`, `linkto`)
|
||||||
try:
|
try:
|
||||||
os.symlink(linkto, tempname)
|
os.symlink(linkto, tempname)
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
print "Can't create %s: %s" % (
|
print "Can't create %s: %s" % (
|
||||||
`tempname`, str(msg))
|
`tempname`, str(msg))
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
fp = open(tempname, 'wb')
|
fp = open(tempname, 'wb')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
print "Can't create %s: %s" % (
|
print "Can't create %s: %s" % (
|
||||||
`tempname`, str(msg))
|
`tempname`, str(msg))
|
||||||
continue
|
continue
|
||||||
if verbose:
|
if verbose:
|
||||||
print 'Retrieving %s from %s as %s...' % \
|
print 'Retrieving %s from %s as %s...' % \
|
||||||
(`filename`, `pwd`, `fullname`)
|
(`filename`, `pwd`, `fullname`)
|
||||||
if verbose:
|
if verbose:
|
||||||
fp1 = LoggingFile(fp, 1024, sys.stdout)
|
fp1 = LoggingFile(fp, 1024, sys.stdout)
|
||||||
else:
|
else:
|
||||||
fp1 = fp
|
fp1 = fp
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
try:
|
try:
|
||||||
f.retrbinary('RETR ' + filename,
|
f.retrbinary('RETR ' + filename,
|
||||||
fp1.write, 8*1024)
|
fp1.write, 8*1024)
|
||||||
except ftplib.error_perm, msg:
|
except ftplib.error_perm, msg:
|
||||||
print msg
|
print msg
|
||||||
t1 = time.time()
|
t1 = time.time()
|
||||||
bytes = fp.tell()
|
bytes = fp.tell()
|
||||||
fp.close()
|
fp.close()
|
||||||
if fp1 != fp:
|
if fp1 != fp:
|
||||||
fp1.close()
|
fp1.close()
|
||||||
try:
|
try:
|
||||||
os.unlink(fullname)
|
os.unlink(fullname)
|
||||||
except os.error:
|
except os.error:
|
||||||
pass # Ignore the error
|
pass # Ignore the error
|
||||||
try:
|
try:
|
||||||
os.rename(tempname, fullname)
|
os.rename(tempname, fullname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
print "Can't rename %s to %s: %s" % (`tempname`,
|
print "Can't rename %s to %s: %s" % (`tempname`,
|
||||||
`fullname`,
|
`fullname`,
|
||||||
str(msg))
|
str(msg))
|
||||||
continue
|
continue
|
||||||
info[filename] = infostuff
|
info[filename] = infostuff
|
||||||
writedict(info, infofilename)
|
writedict(info, infofilename)
|
||||||
if verbose and mode[0] != 'l':
|
if verbose and mode[0] != 'l':
|
||||||
dt = t1 - t0
|
dt = t1 - t0
|
||||||
kbytes = bytes / 1024.0
|
kbytes = bytes / 1024.0
|
||||||
print int(round(kbytes)),
|
print int(round(kbytes)),
|
||||||
print 'Kbytes in',
|
print 'Kbytes in',
|
||||||
print int(round(dt)),
|
print int(round(dt)),
|
||||||
print 'seconds',
|
print 'seconds',
|
||||||
if t1 > t0:
|
if t1 > t0:
|
||||||
print '(~%d Kbytes/sec)' % \
|
print '(~%d Kbytes/sec)' % \
|
||||||
int(round(kbytes/dt),)
|
int(round(kbytes/dt),)
|
||||||
print
|
print
|
||||||
#
|
#
|
||||||
# Remove files from info that are no longer remote
|
# Remove files from info that are no longer remote
|
||||||
deletions = 0
|
deletions = 0
|
||||||
for filename in info.keys():
|
for filename in info.keys():
|
||||||
if filename not in filesfound:
|
if filename not in filesfound:
|
||||||
if verbose:
|
if verbose:
|
||||||
print "Removing obsolete info entry for",
|
print "Removing obsolete info entry for",
|
||||||
print `filename`, "in", `localdir or "."`
|
print `filename`, "in", `localdir or "."`
|
||||||
del info[filename]
|
del info[filename]
|
||||||
deletions = deletions + 1
|
deletions = deletions + 1
|
||||||
if deletions:
|
if deletions:
|
||||||
writedict(info, infofilename)
|
writedict(info, infofilename)
|
||||||
#
|
#
|
||||||
# Remove local files that are no longer in the remote directory
|
# Remove local files that are no longer in the remote directory
|
||||||
try:
|
try:
|
||||||
if not localdir: names = os.listdir(os.curdir)
|
if not localdir: names = os.listdir(os.curdir)
|
||||||
else: names = os.listdir(localdir)
|
else: names = os.listdir(localdir)
|
||||||
except os.error:
|
except os.error:
|
||||||
names = []
|
names = []
|
||||||
for name in names:
|
for name in names:
|
||||||
if name[0] == '.' or info.has_key(name) or name in subdirs:
|
if name[0] == '.' or info.has_key(name) or name in subdirs:
|
||||||
continue
|
continue
|
||||||
skip = 0
|
skip = 0
|
||||||
for pat in skippats:
|
for pat in skippats:
|
||||||
if fnmatch(name, pat):
|
if fnmatch(name, pat):
|
||||||
if verbose > 1:
|
if verbose > 1:
|
||||||
print 'Skip pattern', `pat`,
|
print 'Skip pattern', `pat`,
|
||||||
print 'matches', `name`
|
print 'matches', `name`
|
||||||
skip = 1
|
skip = 1
|
||||||
break
|
break
|
||||||
if skip:
|
if skip:
|
||||||
continue
|
continue
|
||||||
fullname = os.path.join(localdir, name)
|
fullname = os.path.join(localdir, name)
|
||||||
if not rmok:
|
if not rmok:
|
||||||
if verbose:
|
if verbose:
|
||||||
print 'Local file', `fullname`,
|
print 'Local file', `fullname`,
|
||||||
print 'is no longer pertinent'
|
print 'is no longer pertinent'
|
||||||
continue
|
continue
|
||||||
if verbose: print 'Removing local file/dir', `fullname`
|
if verbose: print 'Removing local file/dir', `fullname`
|
||||||
remove(fullname)
|
remove(fullname)
|
||||||
#
|
#
|
||||||
# Recursively mirror subdirectories
|
# Recursively mirror subdirectories
|
||||||
for subdir in subdirs:
|
for subdir in subdirs:
|
||||||
if interactive:
|
if interactive:
|
||||||
doit = askabout('subdirectory', subdir, pwd)
|
doit = askabout('subdirectory', subdir, pwd)
|
||||||
if not doit: continue
|
if not doit: continue
|
||||||
if verbose: print 'Processing subdirectory', `subdir`
|
if verbose: print 'Processing subdirectory', `subdir`
|
||||||
localsubdir = os.path.join(localdir, subdir)
|
localsubdir = os.path.join(localdir, subdir)
|
||||||
pwd = f.pwd()
|
pwd = f.pwd()
|
||||||
if verbose > 1:
|
if verbose > 1:
|
||||||
print 'Remote directory now:', `pwd`
|
print 'Remote directory now:', `pwd`
|
||||||
print 'Remote cwd', `subdir`
|
print 'Remote cwd', `subdir`
|
||||||
try:
|
try:
|
||||||
f.cwd(subdir)
|
f.cwd(subdir)
|
||||||
except ftplib.error_perm, msg:
|
except ftplib.error_perm, msg:
|
||||||
print "Can't chdir to", `subdir`, ":", `msg`
|
print "Can't chdir to", `subdir`, ":", `msg`
|
||||||
else:
|
else:
|
||||||
if verbose: print 'Mirroring as', `localsubdir`
|
if verbose: print 'Mirroring as', `localsubdir`
|
||||||
mirrorsubdir(f, localsubdir)
|
mirrorsubdir(f, localsubdir)
|
||||||
if verbose > 1: print 'Remote cwd ..'
|
if verbose > 1: print 'Remote cwd ..'
|
||||||
f.cwd('..')
|
f.cwd('..')
|
||||||
newpwd = f.pwd()
|
newpwd = f.pwd()
|
||||||
if newpwd != pwd:
|
if newpwd != pwd:
|
||||||
print 'Ended up in wrong directory after cd + cd ..'
|
print 'Ended up in wrong directory after cd + cd ..'
|
||||||
print 'Giving up now.'
|
print 'Giving up now.'
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
if verbose > 1: print 'OK.'
|
if verbose > 1: print 'OK.'
|
||||||
|
|
||||||
# Helper to remove a file or directory tree
|
# Helper to remove a file or directory tree
|
||||||
def remove(fullname):
|
def remove(fullname):
|
||||||
if os.path.isdir(fullname) and not os.path.islink(fullname):
|
if os.path.isdir(fullname) and not os.path.islink(fullname):
|
||||||
try:
|
try:
|
||||||
names = os.listdir(fullname)
|
names = os.listdir(fullname)
|
||||||
except os.error:
|
except os.error:
|
||||||
names = []
|
names = []
|
||||||
ok = 1
|
ok = 1
|
||||||
for name in names:
|
for name in names:
|
||||||
if not remove(os.path.join(fullname, name)):
|
if not remove(os.path.join(fullname, name)):
|
||||||
ok = 0
|
ok = 0
|
||||||
if not ok:
|
if not ok:
|
||||||
return 0
|
return 0
|
||||||
try:
|
try:
|
||||||
os.rmdir(fullname)
|
os.rmdir(fullname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
print "Can't remove local directory %s: %s" % \
|
print "Can't remove local directory %s: %s" % \
|
||||||
(`fullname`, str(msg))
|
(`fullname`, str(msg))
|
||||||
return 0
|
return 0
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
os.unlink(fullname)
|
os.unlink(fullname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
print "Can't remove local file %s: %s" % \
|
print "Can't remove local file %s: %s" % \
|
||||||
(`fullname`, str(msg))
|
(`fullname`, str(msg))
|
||||||
return 0
|
return 0
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
# Wrapper around a file for writing to write a hash sign every block.
|
# Wrapper around a file for writing to write a hash sign every block.
|
||||||
class LoggingFile:
|
class LoggingFile:
|
||||||
def __init__(self, fp, blocksize, outfp):
|
def __init__(self, fp, blocksize, outfp):
|
||||||
self.fp = fp
|
self.fp = fp
|
||||||
self.bytes = 0
|
self.bytes = 0
|
||||||
self.hashes = 0
|
self.hashes = 0
|
||||||
self.blocksize = blocksize
|
self.blocksize = blocksize
|
||||||
self.outfp = outfp
|
self.outfp = outfp
|
||||||
def write(self, data):
|
def write(self, data):
|
||||||
self.bytes = self.bytes + len(data)
|
self.bytes = self.bytes + len(data)
|
||||||
hashes = int(self.bytes) / self.blocksize
|
hashes = int(self.bytes) / self.blocksize
|
||||||
while hashes > self.hashes:
|
while hashes > self.hashes:
|
||||||
self.outfp.write('#')
|
self.outfp.write('#')
|
||||||
self.outfp.flush()
|
self.outfp.flush()
|
||||||
self.hashes = self.hashes + 1
|
self.hashes = self.hashes + 1
|
||||||
self.fp.write(data)
|
self.fp.write(data)
|
||||||
def close(self):
|
def close(self):
|
||||||
self.outfp.write('\n')
|
self.outfp.write('\n')
|
||||||
|
|
||||||
# Ask permission to download a file.
|
# Ask permission to download a file.
|
||||||
def askabout(filetype, filename, pwd):
|
def askabout(filetype, filename, pwd):
|
||||||
prompt = 'Retrieve %s %s from %s ? [ny] ' % (filetype, filename, pwd)
|
prompt = 'Retrieve %s %s from %s ? [ny] ' % (filetype, filename, pwd)
|
||||||
while 1:
|
while 1:
|
||||||
reply = string.lower(string.strip(raw_input(prompt)))
|
reply = string.lower(string.strip(raw_input(prompt)))
|
||||||
if reply in ['y', 'ye', 'yes']:
|
if reply in ['y', 'ye', 'yes']:
|
||||||
return 1
|
return 1
|
||||||
if reply in ['', 'n', 'no', 'nop', 'nope']:
|
if reply in ['', 'n', 'no', 'nop', 'nope']:
|
||||||
return 0
|
return 0
|
||||||
print 'Please answer yes or no.'
|
print 'Please answer yes or no.'
|
||||||
|
|
||||||
# Create a directory if it doesn't exist. Recursively create the
|
# Create a directory if it doesn't exist. Recursively create the
|
||||||
# parent directory as well if needed.
|
# parent directory as well if needed.
|
||||||
def makedir(pathname):
|
def makedir(pathname):
|
||||||
if os.path.isdir(pathname):
|
if os.path.isdir(pathname):
|
||||||
return
|
return
|
||||||
dirname = os.path.dirname(pathname)
|
dirname = os.path.dirname(pathname)
|
||||||
if dirname: makedir(dirname)
|
if dirname: makedir(dirname)
|
||||||
os.mkdir(pathname, 0777)
|
os.mkdir(pathname, 0777)
|
||||||
|
|
||||||
# Write a dictionary to a file in a way that can be read back using
|
# Write a dictionary to a file in a way that can be read back using
|
||||||
# rval() but is still somewhat readable (i.e. not a single long line).
|
# rval() but is still somewhat readable (i.e. not a single long line).
|
||||||
# Also creates a backup file.
|
# Also creates a backup file.
|
||||||
def writedict(dict, filename):
|
def writedict(dict, filename):
|
||||||
dir, file = os.path.split(filename)
|
dir, file = os.path.split(filename)
|
||||||
tempname = os.path.join(dir, '@' + file)
|
tempname = os.path.join(dir, '@' + file)
|
||||||
backup = os.path.join(dir, file + '~')
|
backup = os.path.join(dir, file + '~')
|
||||||
try:
|
try:
|
||||||
os.unlink(backup)
|
os.unlink(backup)
|
||||||
except os.error:
|
except os.error:
|
||||||
pass
|
pass
|
||||||
fp = open(tempname, 'w')
|
fp = open(tempname, 'w')
|
||||||
fp.write('{\n')
|
fp.write('{\n')
|
||||||
for key, value in dict.items():
|
for key, value in dict.items():
|
||||||
fp.write('%s: %s,\n' % (`key`, `value`))
|
fp.write('%s: %s,\n' % (`key`, `value`))
|
||||||
fp.write('}\n')
|
fp.write('}\n')
|
||||||
fp.close()
|
fp.close()
|
||||||
try:
|
try:
|
||||||
os.rename(filename, backup)
|
os.rename(filename, backup)
|
||||||
except os.error:
|
except os.error:
|
||||||
pass
|
pass
|
||||||
os.rename(tempname, filename)
|
os.rename(tempname, filename)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -180,14 +180,14 @@ class Codec(codecs.Codec):
|
||||||
def encode(self,input,errors='strict'):
|
def encode(self,input,errors='strict'):
|
||||||
|
|
||||||
return codecs.charmap_encode(input,errors,encoding_map)
|
return codecs.charmap_encode(input,errors,encoding_map)
|
||||||
|
|
||||||
def decode(self,input,errors='strict'):
|
def decode(self,input,errors='strict'):
|
||||||
|
|
||||||
return codecs.charmap_decode(input,errors,decoding_map)
|
return codecs.charmap_decode(input,errors,decoding_map)
|
||||||
|
|
||||||
class StreamWriter(Codec,codecs.StreamWriter):
|
class StreamWriter(Codec,codecs.StreamWriter):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class StreamReader(Codec,codecs.StreamReader):
|
class StreamReader(Codec,codecs.StreamReader):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ def getregentry():
|
||||||
else:
|
else:
|
||||||
l.append("decoding_map = {")
|
l.append("decoding_map = {")
|
||||||
splits = 0
|
splits = 0
|
||||||
|
|
||||||
mappings = map.items()
|
mappings = map.items()
|
||||||
mappings.sort()
|
mappings.sort()
|
||||||
append = l.append
|
append = l.append
|
||||||
|
@ -290,7 +290,7 @@ def convertdir(dir,prefix='',comments=1):
|
||||||
print '* conversion failed'
|
print '* conversion failed'
|
||||||
|
|
||||||
def rewritepythondir(dir,prefix='',comments=1):
|
def rewritepythondir(dir,prefix='',comments=1):
|
||||||
|
|
||||||
mapnames = os.listdir(dir)
|
mapnames = os.listdir(dir)
|
||||||
for mapname in mapnames:
|
for mapname in mapnames:
|
||||||
if not mapname.endswith('.mapping'):
|
if not mapname.endswith('.mapping'):
|
||||||
|
|
|
@ -41,110 +41,110 @@ p_char = regex.compile("'\(\\\\.[^\\\\]*\|[^\\\\]\)'")
|
||||||
filedict = {}
|
filedict = {}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
searchdirs=string.splitfields(os.environ['include'],';')
|
searchdirs=string.splitfields(os.environ['include'],';')
|
||||||
except KeyError:
|
except KeyError:
|
||||||
try:
|
try:
|
||||||
searchdirs=string.splitfields(os.environ['INCLUDE'],';')
|
searchdirs=string.splitfields(os.environ['INCLUDE'],';')
|
||||||
except KeyError:
|
except KeyError:
|
||||||
try:
|
try:
|
||||||
if string.find( sys.platform, "beos" ) == 0:
|
if string.find( sys.platform, "beos" ) == 0:
|
||||||
searchdirs=string.splitfields(os.environ['BEINCLUDES'],';')
|
searchdirs=string.splitfields(os.environ['BEINCLUDES'],';')
|
||||||
else:
|
else:
|
||||||
raise KeyError
|
raise KeyError
|
||||||
except KeyError:
|
except KeyError:
|
||||||
searchdirs=['/usr/include']
|
searchdirs=['/usr/include']
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
global filedict
|
global filedict
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'i:')
|
opts, args = getopt.getopt(sys.argv[1:], 'i:')
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o == '-i':
|
if o == '-i':
|
||||||
ignores.append(regex.compile(a))
|
ignores.append(regex.compile(a))
|
||||||
if not args:
|
if not args:
|
||||||
args = ['-']
|
args = ['-']
|
||||||
for filename in args:
|
for filename in args:
|
||||||
if filename == '-':
|
if filename == '-':
|
||||||
sys.stdout.write('# Generated by h2py from stdin\n')
|
sys.stdout.write('# Generated by h2py from stdin\n')
|
||||||
process(sys.stdin, sys.stdout)
|
process(sys.stdin, sys.stdout)
|
||||||
else:
|
else:
|
||||||
fp = open(filename, 'r')
|
fp = open(filename, 'r')
|
||||||
outfile = os.path.basename(filename)
|
outfile = os.path.basename(filename)
|
||||||
i = string.rfind(outfile, '.')
|
i = string.rfind(outfile, '.')
|
||||||
if i > 0: outfile = outfile[:i]
|
if i > 0: outfile = outfile[:i]
|
||||||
outfile = string.upper(outfile)
|
outfile = string.upper(outfile)
|
||||||
outfile = outfile + '.py'
|
outfile = outfile + '.py'
|
||||||
outfp = open(outfile, 'w')
|
outfp = open(outfile, 'w')
|
||||||
outfp.write('# Generated by h2py from %s\n' % filename)
|
outfp.write('# Generated by h2py from %s\n' % filename)
|
||||||
filedict = {}
|
filedict = {}
|
||||||
for dir in searchdirs:
|
for dir in searchdirs:
|
||||||
if filename[:len(dir)] == dir:
|
if filename[:len(dir)] == dir:
|
||||||
filedict[filename[len(dir)+1:]] = None # no '/' trailing
|
filedict[filename[len(dir)+1:]] = None # no '/' trailing
|
||||||
break
|
break
|
||||||
process(fp, outfp)
|
process(fp, outfp)
|
||||||
outfp.close()
|
outfp.close()
|
||||||
fp.close()
|
fp.close()
|
||||||
|
|
||||||
def process(fp, outfp, env = {}):
|
def process(fp, outfp, env = {}):
|
||||||
lineno = 0
|
lineno = 0
|
||||||
while 1:
|
while 1:
|
||||||
line = fp.readline()
|
line = fp.readline()
|
||||||
if not line: break
|
if not line: break
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
n = p_define.match(line)
|
n = p_define.match(line)
|
||||||
if n >= 0:
|
if n >= 0:
|
||||||
# gobble up continuation lines
|
# gobble up continuation lines
|
||||||
while line[-2:] == '\\\n':
|
while line[-2:] == '\\\n':
|
||||||
nextline = fp.readline()
|
nextline = fp.readline()
|
||||||
if not nextline: break
|
if not nextline: break
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
line = line + nextline
|
line = line + nextline
|
||||||
name = p_define.group(1)
|
name = p_define.group(1)
|
||||||
body = line[n:]
|
body = line[n:]
|
||||||
# replace ignored patterns by spaces
|
# replace ignored patterns by spaces
|
||||||
for p in ignores:
|
for p in ignores:
|
||||||
body = regsub.gsub(p, ' ', body)
|
body = regsub.gsub(p, ' ', body)
|
||||||
# replace char literals by ord(...)
|
# replace char literals by ord(...)
|
||||||
body = regsub.gsub(p_char, 'ord(\\0)', body)
|
body = regsub.gsub(p_char, 'ord(\\0)', body)
|
||||||
stmt = '%s = %s\n' % (name, string.strip(body))
|
stmt = '%s = %s\n' % (name, string.strip(body))
|
||||||
ok = 0
|
ok = 0
|
||||||
try:
|
try:
|
||||||
exec stmt in env
|
exec stmt in env
|
||||||
except:
|
except:
|
||||||
sys.stderr.write('Skipping: %s' % stmt)
|
sys.stderr.write('Skipping: %s' % stmt)
|
||||||
else:
|
else:
|
||||||
outfp.write(stmt)
|
outfp.write(stmt)
|
||||||
n =p_macro.match(line)
|
n =p_macro.match(line)
|
||||||
if n >= 0:
|
if n >= 0:
|
||||||
macro, arg = p_macro.group(1, 2)
|
macro, arg = p_macro.group(1, 2)
|
||||||
body = line[n:]
|
body = line[n:]
|
||||||
for p in ignores:
|
for p in ignores:
|
||||||
body = regsub.gsub(p, ' ', body)
|
body = regsub.gsub(p, ' ', body)
|
||||||
body = regsub.gsub(p_char, 'ord(\\0)', body)
|
body = regsub.gsub(p_char, 'ord(\\0)', body)
|
||||||
stmt = 'def %s(%s): return %s\n' % (macro, arg, body)
|
stmt = 'def %s(%s): return %s\n' % (macro, arg, body)
|
||||||
try:
|
try:
|
||||||
exec stmt in env
|
exec stmt in env
|
||||||
except:
|
except:
|
||||||
sys.stderr.write('Skipping: %s' % stmt)
|
sys.stderr.write('Skipping: %s' % stmt)
|
||||||
else:
|
else:
|
||||||
outfp.write(stmt)
|
outfp.write(stmt)
|
||||||
if p_include.match(line) >= 0:
|
if p_include.match(line) >= 0:
|
||||||
regs = p_include.regs
|
regs = p_include.regs
|
||||||
a, b = regs[1]
|
a, b = regs[1]
|
||||||
filename = line[a:b]
|
filename = line[a:b]
|
||||||
if not filedict.has_key(filename):
|
if not filedict.has_key(filename):
|
||||||
filedict[filename] = None
|
filedict[filename] = None
|
||||||
inclfp = None
|
inclfp = None
|
||||||
for dir in searchdirs:
|
for dir in searchdirs:
|
||||||
try:
|
try:
|
||||||
inclfp = open(dir + '/' + filename, 'r')
|
inclfp = open(dir + '/' + filename, 'r')
|
||||||
break
|
break
|
||||||
except IOError:
|
except IOError:
|
||||||
pass
|
pass
|
||||||
if inclfp:
|
if inclfp:
|
||||||
outfp.write(
|
outfp.write(
|
||||||
'\n# Included from %s\n' % filename)
|
'\n# Included from %s\n' % filename)
|
||||||
process(inclfp, outfp, env)
|
process(inclfp, outfp, env)
|
||||||
else:
|
else:
|
||||||
sys.stderr.write('Warning - could not find file %s' % filename)
|
sys.stderr.write('Warning - could not find file %s' % filename)
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
# Selectively preprocess #ifdef / #ifndef statements.
|
# Selectively preprocess #ifdef / #ifndef statements.
|
||||||
# Usage:
|
# Usage:
|
||||||
# ifdef [-Dname] ... [-Uname] ... [file] ...
|
# ifdef [-Dname] ... [-Uname] ... [file] ...
|
||||||
#
|
#
|
||||||
# This scans the file(s), looking for #ifdef and #ifndef preprocessor
|
# This scans the file(s), looking for #ifdef and #ifndef preprocessor
|
||||||
# commands that test for one of the names mentioned in the -D and -U
|
# commands that test for one of the names mentioned in the -D and -U
|
||||||
# options. On standard output it writes a copy of the input file(s)
|
# options. On standard output it writes a copy of the input file(s)
|
||||||
|
@ -35,79 +35,79 @@ defs = []
|
||||||
undefs = []
|
undefs = []
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'D:U:')
|
opts, args = getopt.getopt(sys.argv[1:], 'D:U:')
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o == '-D':
|
if o == '-D':
|
||||||
defs.append(a)
|
defs.append(a)
|
||||||
if o == '-U':
|
if o == '-U':
|
||||||
undefs.append(a)
|
undefs.append(a)
|
||||||
if not args:
|
if not args:
|
||||||
args = ['-']
|
args = ['-']
|
||||||
for file in args:
|
for file in args:
|
||||||
if file == '-':
|
if file == '-':
|
||||||
process(sys.stdin, sys.stdout)
|
process(sys.stdin, sys.stdout)
|
||||||
else:
|
else:
|
||||||
f = open(file, 'r')
|
f = open(file, 'r')
|
||||||
process(f, sys.stdout)
|
process(f, sys.stdout)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
def process(fpi, fpo):
|
def process(fpi, fpo):
|
||||||
keywords = ('if', 'ifdef', 'ifndef', 'else', 'endif')
|
keywords = ('if', 'ifdef', 'ifndef', 'else', 'endif')
|
||||||
ok = 1
|
ok = 1
|
||||||
stack = []
|
stack = []
|
||||||
while 1:
|
while 1:
|
||||||
line = fpi.readline()
|
line = fpi.readline()
|
||||||
if not line: break
|
if not line: break
|
||||||
while line[-2:] == '\\\n':
|
while line[-2:] == '\\\n':
|
||||||
nextline = fpi.readline()
|
nextline = fpi.readline()
|
||||||
if not nextline: break
|
if not nextline: break
|
||||||
line = line + nextline
|
line = line + nextline
|
||||||
tmp = string.strip(line)
|
tmp = string.strip(line)
|
||||||
if tmp[:1] != '#':
|
if tmp[:1] != '#':
|
||||||
if ok: fpo.write(line)
|
if ok: fpo.write(line)
|
||||||
continue
|
continue
|
||||||
tmp = string.strip(tmp[1:])
|
tmp = string.strip(tmp[1:])
|
||||||
words = string.split(tmp)
|
words = string.split(tmp)
|
||||||
keyword = words[0]
|
keyword = words[0]
|
||||||
if keyword not in keywords:
|
if keyword not in keywords:
|
||||||
if ok: fpo.write(line)
|
if ok: fpo.write(line)
|
||||||
continue
|
continue
|
||||||
if keyword in ('ifdef', 'ifndef') and len(words) == 2:
|
if keyword in ('ifdef', 'ifndef') and len(words) == 2:
|
||||||
if keyword == 'ifdef':
|
if keyword == 'ifdef':
|
||||||
ko = 1
|
ko = 1
|
||||||
else:
|
else:
|
||||||
ko = 0
|
ko = 0
|
||||||
word = words[1]
|
word = words[1]
|
||||||
if word in defs:
|
if word in defs:
|
||||||
stack.append((ok, ko, word))
|
stack.append((ok, ko, word))
|
||||||
if not ko: ok = 0
|
if not ko: ok = 0
|
||||||
elif word in undefs:
|
elif word in undefs:
|
||||||
stack.append((ok, not ko, word))
|
stack.append((ok, not ko, word))
|
||||||
if ko: ok = 0
|
if ko: ok = 0
|
||||||
else:
|
else:
|
||||||
stack.append((ok, -1, word))
|
stack.append((ok, -1, word))
|
||||||
if ok: fpo.write(line)
|
if ok: fpo.write(line)
|
||||||
elif keyword == 'if':
|
elif keyword == 'if':
|
||||||
stack.append((ok, -1, ''))
|
stack.append((ok, -1, ''))
|
||||||
if ok: fpo.write(line)
|
if ok: fpo.write(line)
|
||||||
elif keyword == 'else' and stack:
|
elif keyword == 'else' and stack:
|
||||||
s_ok, s_ko, s_word = stack[-1]
|
s_ok, s_ko, s_word = stack[-1]
|
||||||
if s_ko < 0:
|
if s_ko < 0:
|
||||||
if ok: fpo.write(line)
|
if ok: fpo.write(line)
|
||||||
else:
|
else:
|
||||||
s_ko = not s_ko
|
s_ko = not s_ko
|
||||||
ok = s_ok
|
ok = s_ok
|
||||||
if not s_ko: ok = 0
|
if not s_ko: ok = 0
|
||||||
stack[-1] = s_ok, s_ko, s_word
|
stack[-1] = s_ok, s_ko, s_word
|
||||||
elif keyword == 'endif' and stack:
|
elif keyword == 'endif' and stack:
|
||||||
s_ok, s_ko, s_word = stack[-1]
|
s_ok, s_ko, s_word = stack[-1]
|
||||||
if s_ko < 0:
|
if s_ko < 0:
|
||||||
if ok: fpo.write(line)
|
if ok: fpo.write(line)
|
||||||
del stack[-1]
|
del stack[-1]
|
||||||
ok = s_ok
|
ok = s_ok
|
||||||
else:
|
else:
|
||||||
sys.stderr.write('Unknown keyword %s\n' % keyword)
|
sys.stderr.write('Unknown keyword %s\n' % keyword)
|
||||||
if stack:
|
if stack:
|
||||||
sys.stderr.write('stack: %s\n' % stack)
|
sys.stderr.write('stack: %s\n' % stack)
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -17,63 +17,63 @@ LINK = '.LINK' # Name of special symlink at the top.
|
||||||
debug = 0
|
debug = 0
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if not 3 <= len(sys.argv) <= 4:
|
if not 3 <= len(sys.argv) <= 4:
|
||||||
print 'usage:', sys.argv[0], 'oldtree newtree [linkto]'
|
print 'usage:', sys.argv[0], 'oldtree newtree [linkto]'
|
||||||
return 2
|
return 2
|
||||||
oldtree, newtree = sys.argv[1], sys.argv[2]
|
oldtree, newtree = sys.argv[1], sys.argv[2]
|
||||||
if len(sys.argv) > 3:
|
if len(sys.argv) > 3:
|
||||||
link = sys.argv[3]
|
link = sys.argv[3]
|
||||||
link_may_fail = 1
|
link_may_fail = 1
|
||||||
else:
|
else:
|
||||||
link = LINK
|
link = LINK
|
||||||
link_may_fail = 0
|
link_may_fail = 0
|
||||||
if not os.path.isdir(oldtree):
|
if not os.path.isdir(oldtree):
|
||||||
print oldtree + ': not a directory'
|
print oldtree + ': not a directory'
|
||||||
return 1
|
return 1
|
||||||
try:
|
try:
|
||||||
os.mkdir(newtree, 0777)
|
os.mkdir(newtree, 0777)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
print newtree + ': cannot mkdir:', msg
|
print newtree + ': cannot mkdir:', msg
|
||||||
return 1
|
return 1
|
||||||
linkname = os.path.join(newtree, link)
|
linkname = os.path.join(newtree, link)
|
||||||
try:
|
try:
|
||||||
os.symlink(os.path.join(os.pardir, oldtree), linkname)
|
os.symlink(os.path.join(os.pardir, oldtree), linkname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
if not link_may_fail:
|
if not link_may_fail:
|
||||||
print linkname + ': cannot symlink:', msg
|
print linkname + ': cannot symlink:', msg
|
||||||
return 1
|
return 1
|
||||||
else:
|
else:
|
||||||
print linkname + ': warning: cannot symlink:', msg
|
print linkname + ': warning: cannot symlink:', msg
|
||||||
linknames(oldtree, newtree, link)
|
linknames(oldtree, newtree, link)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def linknames(old, new, link):
|
def linknames(old, new, link):
|
||||||
if debug: print 'linknames', (old, new, link)
|
if debug: print 'linknames', (old, new, link)
|
||||||
try:
|
try:
|
||||||
names = os.listdir(old)
|
names = os.listdir(old)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
print old + ': warning: cannot listdir:', msg
|
print old + ': warning: cannot listdir:', msg
|
||||||
return
|
return
|
||||||
for name in names:
|
for name in names:
|
||||||
if name not in (os.curdir, os.pardir):
|
if name not in (os.curdir, os.pardir):
|
||||||
oldname = os.path.join(old, name)
|
oldname = os.path.join(old, name)
|
||||||
linkname = os.path.join(link, name)
|
linkname = os.path.join(link, name)
|
||||||
newname = os.path.join(new, name)
|
newname = os.path.join(new, name)
|
||||||
if debug > 1: print oldname, newname, linkname
|
if debug > 1: print oldname, newname, linkname
|
||||||
if os.path.isdir(oldname) and \
|
if os.path.isdir(oldname) and \
|
||||||
not os.path.islink(oldname):
|
not os.path.islink(oldname):
|
||||||
try:
|
try:
|
||||||
os.mkdir(newname, 0777)
|
os.mkdir(newname, 0777)
|
||||||
ok = 1
|
ok = 1
|
||||||
except:
|
except:
|
||||||
print newname + \
|
print newname + \
|
||||||
': warning: cannot mkdir:', msg
|
': warning: cannot mkdir:', msg
|
||||||
ok = 0
|
ok = 0
|
||||||
if ok:
|
if ok:
|
||||||
linkname = os.path.join(os.pardir,
|
linkname = os.path.join(os.pardir,
|
||||||
linkname)
|
linkname)
|
||||||
linknames(oldname, newname, linkname)
|
linknames(oldname, newname, linkname)
|
||||||
else:
|
else:
|
||||||
os.symlink(linkname, newname)
|
os.symlink(linkname, newname)
|
||||||
|
|
||||||
sys.exit(main())
|
sys.exit(main())
|
||||||
|
|
|
@ -8,18 +8,18 @@
|
||||||
import sys, os
|
import sys, os
|
||||||
|
|
||||||
def lll(dirname):
|
def lll(dirname):
|
||||||
for name in os.listdir(dirname):
|
for name in os.listdir(dirname):
|
||||||
if name not in (os.curdir, os.pardir):
|
if name not in (os.curdir, os.pardir):
|
||||||
full = os.path.join(dirname, name)
|
full = os.path.join(dirname, name)
|
||||||
if os.path.islink(full):
|
if os.path.islink(full):
|
||||||
print name, '->', os.readlink(full)
|
print name, '->', os.readlink(full)
|
||||||
|
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
if not args: args = [os.curdir]
|
if not args: args = [os.curdir]
|
||||||
first = 1
|
first = 1
|
||||||
for arg in args:
|
for arg in args:
|
||||||
if len(args) > 1:
|
if len(args) > 1:
|
||||||
if not first: print
|
if not first: print
|
||||||
first = 0
|
first = 0
|
||||||
print arg + ':'
|
print arg + ':'
|
||||||
lll(arg)
|
lll(arg)
|
||||||
|
|
|
@ -116,7 +116,7 @@ def digest_chunk(chunk):
|
||||||
text.insert(0, revline)
|
text.insert(0, revline)
|
||||||
records.append((date, working_file, rev, author, text))
|
records.append((date, working_file, rev, author, text))
|
||||||
return records
|
return records
|
||||||
|
|
||||||
def format_output(database):
|
def format_output(database):
|
||||||
prevtext = None
|
prevtext = None
|
||||||
prev = []
|
prev = []
|
||||||
|
|
|
@ -166,7 +166,7 @@ def parsedir(dir, modify):
|
||||||
# find all numeric file names and sort them
|
# find all numeric file names and sort them
|
||||||
files = filter(lambda fn, pat=pat: pat.match(fn) is not None, os.listdir('.'))
|
files = filter(lambda fn, pat=pat: pat.match(fn) is not None, os.listdir('.'))
|
||||||
files.sort(sort_numeric)
|
files.sort(sort_numeric)
|
||||||
|
|
||||||
for fn in files:
|
for fn in files:
|
||||||
# Lets try to parse the file.
|
# Lets try to parse the file.
|
||||||
fp = open(fn)
|
fp = open(fn)
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#! /usr/bin/env python
|
#! /usr/bin/env python
|
||||||
|
|
||||||
# Fix Python source files to avoid using
|
# Fix Python source files to avoid using
|
||||||
# def method(self, (arg1, ..., argn)):
|
# def method(self, (arg1, ..., argn)):
|
||||||
# instead of the more rational
|
# instead of the more rational
|
||||||
# def method(self, arg1, ..., argn):
|
# def method(self, arg1, ..., argn):
|
||||||
#
|
#
|
||||||
# Command line arguments are files or directories to be processed.
|
# Command line arguments are files or directories to be processed.
|
||||||
# Directories are searched recursively for files whose name looks
|
# Directories are searched recursively for files whose name looks
|
||||||
|
@ -37,137 +37,137 @@ dbg = err
|
||||||
rep = sys.stdout.write
|
rep = sys.stdout.write
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
bad = 0
|
bad = 0
|
||||||
if not sys.argv[1:]: # No arguments
|
if not sys.argv[1:]: # No arguments
|
||||||
err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
|
err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
for arg in sys.argv[1:]:
|
for arg in sys.argv[1:]:
|
||||||
if os.path.isdir(arg):
|
if os.path.isdir(arg):
|
||||||
if recursedown(arg): bad = 1
|
if recursedown(arg): bad = 1
|
||||||
elif os.path.islink(arg):
|
elif os.path.islink(arg):
|
||||||
err(arg + ': will not process symbolic links\n')
|
err(arg + ': will not process symbolic links\n')
|
||||||
bad = 1
|
bad = 1
|
||||||
else:
|
else:
|
||||||
if fix(arg): bad = 1
|
if fix(arg): bad = 1
|
||||||
sys.exit(bad)
|
sys.exit(bad)
|
||||||
|
|
||||||
ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
|
ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
|
||||||
def ispython(name):
|
def ispython(name):
|
||||||
return ispythonprog.match(name) >= 0
|
return ispythonprog.match(name) >= 0
|
||||||
|
|
||||||
def recursedown(dirname):
|
def recursedown(dirname):
|
||||||
dbg('recursedown(' + `dirname` + ')\n')
|
dbg('recursedown(' + `dirname` + ')\n')
|
||||||
bad = 0
|
bad = 0
|
||||||
try:
|
try:
|
||||||
names = os.listdir(dirname)
|
names = os.listdir(dirname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(dirname + ': cannot list directory: ' + `msg` + '\n')
|
err(dirname + ': cannot list directory: ' + `msg` + '\n')
|
||||||
return 1
|
return 1
|
||||||
names.sort()
|
names.sort()
|
||||||
subdirs = []
|
subdirs = []
|
||||||
for name in names:
|
for name in names:
|
||||||
if name in (os.curdir, os.pardir): continue
|
if name in (os.curdir, os.pardir): continue
|
||||||
fullname = os.path.join(dirname, name)
|
fullname = os.path.join(dirname, name)
|
||||||
if os.path.islink(fullname): pass
|
if os.path.islink(fullname): pass
|
||||||
elif os.path.isdir(fullname):
|
elif os.path.isdir(fullname):
|
||||||
subdirs.append(fullname)
|
subdirs.append(fullname)
|
||||||
elif ispython(name):
|
elif ispython(name):
|
||||||
if fix(fullname): bad = 1
|
if fix(fullname): bad = 1
|
||||||
for fullname in subdirs:
|
for fullname in subdirs:
|
||||||
if recursedown(fullname): bad = 1
|
if recursedown(fullname): bad = 1
|
||||||
return bad
|
return bad
|
||||||
|
|
||||||
def fix(filename):
|
def fix(filename):
|
||||||
## dbg('fix(' + `filename` + ')\n')
|
## dbg('fix(' + `filename` + ')\n')
|
||||||
try:
|
try:
|
||||||
f = open(filename, 'r')
|
f = open(filename, 'r')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
err(filename + ': cannot open: ' + `msg` + '\n')
|
err(filename + ': cannot open: ' + `msg` + '\n')
|
||||||
return 1
|
return 1
|
||||||
head, tail = os.path.split(filename)
|
head, tail = os.path.split(filename)
|
||||||
tempname = os.path.join(head, '@' + tail)
|
tempname = os.path.join(head, '@' + tail)
|
||||||
g = None
|
g = None
|
||||||
# If we find a match, we rewind the file and start over but
|
# If we find a match, we rewind the file and start over but
|
||||||
# now copy everything to a temp file.
|
# now copy everything to a temp file.
|
||||||
lineno = 0
|
lineno = 0
|
||||||
while 1:
|
while 1:
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
if not line: break
|
if not line: break
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
if g is None and '\0' in line:
|
if g is None and '\0' in line:
|
||||||
# Check for binary files
|
# Check for binary files
|
||||||
err(filename + ': contains null bytes; not fixed\n')
|
err(filename + ': contains null bytes; not fixed\n')
|
||||||
f.close()
|
f.close()
|
||||||
return 1
|
return 1
|
||||||
if lineno == 1 and g is None and line[:2] == '#!':
|
if lineno == 1 and g is None and line[:2] == '#!':
|
||||||
# Check for non-Python scripts
|
# Check for non-Python scripts
|
||||||
words = string.split(line[2:])
|
words = string.split(line[2:])
|
||||||
if words and regex.search('[pP]ython', words[0]) < 0:
|
if words and regex.search('[pP]ython', words[0]) < 0:
|
||||||
msg = filename + ': ' + words[0]
|
msg = filename + ': ' + words[0]
|
||||||
msg = msg + ' script; not fixed\n'
|
msg = msg + ' script; not fixed\n'
|
||||||
err(msg)
|
err(msg)
|
||||||
f.close()
|
f.close()
|
||||||
return 1
|
return 1
|
||||||
while line[-2:] == '\\\n':
|
while line[-2:] == '\\\n':
|
||||||
nextline = f.readline()
|
nextline = f.readline()
|
||||||
if not nextline: break
|
if not nextline: break
|
||||||
line = line + nextline
|
line = line + nextline
|
||||||
lineno = lineno + 1
|
lineno = lineno + 1
|
||||||
newline = fixline(line)
|
newline = fixline(line)
|
||||||
if newline != line:
|
if newline != line:
|
||||||
if g is None:
|
if g is None:
|
||||||
try:
|
try:
|
||||||
g = open(tempname, 'w')
|
g = open(tempname, 'w')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
f.close()
|
f.close()
|
||||||
err(tempname+': cannot create: '+\
|
err(tempname+': cannot create: '+\
|
||||||
`msg`+'\n')
|
`msg`+'\n')
|
||||||
return 1
|
return 1
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
lineno = 0
|
lineno = 0
|
||||||
rep(filename + ':\n')
|
rep(filename + ':\n')
|
||||||
continue # restart from the beginning
|
continue # restart from the beginning
|
||||||
rep(`lineno` + '\n')
|
rep(`lineno` + '\n')
|
||||||
rep('< ' + line)
|
rep('< ' + line)
|
||||||
rep('> ' + newline)
|
rep('> ' + newline)
|
||||||
if g is not None:
|
if g is not None:
|
||||||
g.write(newline)
|
g.write(newline)
|
||||||
|
|
||||||
# End of file
|
# End of file
|
||||||
f.close()
|
f.close()
|
||||||
if not g: return 0 # No changes
|
if not g: return 0 # No changes
|
||||||
|
|
||||||
# Finishing touch -- move files
|
|
||||||
|
|
||||||
# First copy the file's mode to the temp file
|
# Finishing touch -- move files
|
||||||
try:
|
|
||||||
statbuf = os.stat(filename)
|
# First copy the file's mode to the temp file
|
||||||
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
try:
|
||||||
except os.error, msg:
|
statbuf = os.stat(filename)
|
||||||
err(tempname + ': warning: chmod failed (' + `msg` + ')\n')
|
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
||||||
# Then make a backup of the original file as filename~
|
except os.error, msg:
|
||||||
try:
|
err(tempname + ': warning: chmod failed (' + `msg` + ')\n')
|
||||||
os.rename(filename, filename + '~')
|
# Then make a backup of the original file as filename~
|
||||||
except os.error, msg:
|
try:
|
||||||
err(filename + ': warning: backup failed (' + `msg` + ')\n')
|
os.rename(filename, filename + '~')
|
||||||
# Now move the temp file to the original file
|
except os.error, msg:
|
||||||
try:
|
err(filename + ': warning: backup failed (' + `msg` + ')\n')
|
||||||
os.rename(tempname, filename)
|
# Now move the temp file to the original file
|
||||||
except os.error, msg:
|
try:
|
||||||
err(filename + ': rename failed (' + `msg` + ')\n')
|
os.rename(tempname, filename)
|
||||||
return 1
|
except os.error, msg:
|
||||||
# Return succes
|
err(filename + ': rename failed (' + `msg` + ')\n')
|
||||||
return 0
|
return 1
|
||||||
|
# Return succes
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
fixpat = '^[ \t]+def +[a-zA-Z0-9_]+ *( *self *, *\(( *\(.*\) *)\) *) *:'
|
fixpat = '^[ \t]+def +[a-zA-Z0-9_]+ *( *self *, *\(( *\(.*\) *)\) *) *:'
|
||||||
fixprog = regex.compile(fixpat)
|
fixprog = regex.compile(fixpat)
|
||||||
|
|
||||||
def fixline(line):
|
def fixline(line):
|
||||||
if fixprog.match(line) >= 0:
|
if fixprog.match(line) >= 0:
|
||||||
(a, b), (c, d) = fixprog.regs[1:3]
|
(a, b), (c, d) = fixprog.regs[1:3]
|
||||||
line = line[:a] + line[c:d] + line[b:]
|
line = line[:a] + line[c:d] + line[b:]
|
||||||
return line
|
return line
|
||||||
|
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -15,51 +15,51 @@ error = 'mkreal error'
|
||||||
BUFSIZE = 32*1024
|
BUFSIZE = 32*1024
|
||||||
|
|
||||||
def mkrealfile(name):
|
def mkrealfile(name):
|
||||||
st = os.stat(name) # Get the mode
|
st = os.stat(name) # Get the mode
|
||||||
mode = S_IMODE(st[ST_MODE])
|
mode = S_IMODE(st[ST_MODE])
|
||||||
linkto = os.readlink(name) # Make sure again it's a symlink
|
linkto = os.readlink(name) # Make sure again it's a symlink
|
||||||
f_in = open(name, 'r') # This ensures it's a file
|
f_in = open(name, 'r') # This ensures it's a file
|
||||||
os.unlink(name)
|
os.unlink(name)
|
||||||
f_out = open(name, 'w')
|
f_out = open(name, 'w')
|
||||||
while 1:
|
while 1:
|
||||||
buf = f_in.read(BUFSIZE)
|
buf = f_in.read(BUFSIZE)
|
||||||
if not buf: break
|
if not buf: break
|
||||||
f_out.write(buf)
|
f_out.write(buf)
|
||||||
del f_out # Flush data to disk before changing mode
|
del f_out # Flush data to disk before changing mode
|
||||||
os.chmod(name, mode)
|
os.chmod(name, mode)
|
||||||
|
|
||||||
def mkrealdir(name):
|
def mkrealdir(name):
|
||||||
st = os.stat(name) # Get the mode
|
st = os.stat(name) # Get the mode
|
||||||
mode = S_IMODE(st[ST_MODE])
|
mode = S_IMODE(st[ST_MODE])
|
||||||
linkto = os.readlink(name)
|
linkto = os.readlink(name)
|
||||||
files = os.listdir(name)
|
files = os.listdir(name)
|
||||||
os.unlink(name)
|
os.unlink(name)
|
||||||
os.mkdir(name, mode)
|
os.mkdir(name, mode)
|
||||||
os.chmod(name, mode)
|
os.chmod(name, mode)
|
||||||
linkto = join(os.pardir, linkto)
|
linkto = join(os.pardir, linkto)
|
||||||
#
|
#
|
||||||
for file in files:
|
for file in files:
|
||||||
if file not in (os.curdir, os.pardir):
|
if file not in (os.curdir, os.pardir):
|
||||||
os.symlink(join(linkto, file), join(name, file))
|
os.symlink(join(linkto, file), join(name, file))
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
sys.stdout = sys.stderr
|
sys.stdout = sys.stderr
|
||||||
progname = os.path.basename(sys.argv[0])
|
progname = os.path.basename(sys.argv[0])
|
||||||
if progname == '-c': progname = 'mkreal'
|
if progname == '-c': progname = 'mkreal'
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
if not args:
|
if not args:
|
||||||
print 'usage:', progname, 'path ...'
|
print 'usage:', progname, 'path ...'
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
status = 0
|
status = 0
|
||||||
for name in args:
|
for name in args:
|
||||||
if not os.path.islink(name):
|
if not os.path.islink(name):
|
||||||
print progname+':', name+':', 'not a symlink'
|
print progname+':', name+':', 'not a symlink'
|
||||||
status = 1
|
status = 1
|
||||||
else:
|
else:
|
||||||
if os.path.isdir(name):
|
if os.path.isdir(name):
|
||||||
mkrealdir(name)
|
mkrealdir(name)
|
||||||
else:
|
else:
|
||||||
mkrealfile(name)
|
mkrealfile(name)
|
||||||
sys.exit(status)
|
sys.exit(status)
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -98,6 +98,6 @@ def main():
|
||||||
f = sys.stdout # open('PC/python_nt.def','w')
|
f = sys.stdout # open('PC/python_nt.def','w')
|
||||||
f.write(DEF_TEMPLATE % (exports))
|
f.write(DEF_TEMPLATE % (exports))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -40,19 +40,19 @@ matcher = regex.compile('\(.*\):\t?........ \(.\) \(.*\)$')
|
||||||
# If there is no list for the key yet, it is created.
|
# If there is no list for the key yet, it is created.
|
||||||
#
|
#
|
||||||
def store(dict, key, item):
|
def store(dict, key, item):
|
||||||
if dict.has_key(key):
|
if dict.has_key(key):
|
||||||
dict[key].append(item)
|
dict[key].append(item)
|
||||||
else:
|
else:
|
||||||
dict[key] = [item]
|
dict[key] = [item]
|
||||||
|
|
||||||
# Return a flattened version of a list of strings: the concatenation
|
# Return a flattened version of a list of strings: the concatenation
|
||||||
# of its elements with intervening spaces.
|
# of its elements with intervening spaces.
|
||||||
#
|
#
|
||||||
def flat(list):
|
def flat(list):
|
||||||
s = ''
|
s = ''
|
||||||
for item in list:
|
for item in list:
|
||||||
s = s + ' ' + item
|
s = s + ' ' + item
|
||||||
return s[1:]
|
return s[1:]
|
||||||
|
|
||||||
# Global variables mapping defined/undefined names to files and back.
|
# Global variables mapping defined/undefined names to files and back.
|
||||||
#
|
#
|
||||||
|
@ -65,151 +65,151 @@ undef2file = {}
|
||||||
# Argument is an open file.
|
# Argument is an open file.
|
||||||
#
|
#
|
||||||
def readinput(file):
|
def readinput(file):
|
||||||
while 1:
|
while 1:
|
||||||
s = file.readline()
|
s = file.readline()
|
||||||
if not s:
|
if not s:
|
||||||
break
|
break
|
||||||
# If you get any output from this line,
|
# If you get any output from this line,
|
||||||
# it is probably caused by an unexpected input line:
|
# it is probably caused by an unexpected input line:
|
||||||
if matcher.search(s) < 0: s; continue # Shouldn't happen
|
if matcher.search(s) < 0: s; continue # Shouldn't happen
|
||||||
(ra, rb), (r1a, r1b), (r2a, r2b), (r3a, r3b) = matcher.regs[:4]
|
(ra, rb), (r1a, r1b), (r2a, r2b), (r3a, r3b) = matcher.regs[:4]
|
||||||
fn, name, type = s[r1a:r1b], s[r3a:r3b], s[r2a:r2b]
|
fn, name, type = s[r1a:r1b], s[r3a:r3b], s[r2a:r2b]
|
||||||
if type in definitions:
|
if type in definitions:
|
||||||
store(def2file, name, fn)
|
store(def2file, name, fn)
|
||||||
store(file2def, fn, name)
|
store(file2def, fn, name)
|
||||||
elif type in externals:
|
elif type in externals:
|
||||||
store(file2undef, fn, name)
|
store(file2undef, fn, name)
|
||||||
store(undef2file, name, fn)
|
store(undef2file, name, fn)
|
||||||
elif not type in ignore:
|
elif not type in ignore:
|
||||||
print fn + ':' + name + ': unknown type ' + type
|
print fn + ':' + name + ': unknown type ' + type
|
||||||
|
|
||||||
# Print all names that were undefined in some module and where they are
|
# Print all names that were undefined in some module and where they are
|
||||||
# defined.
|
# defined.
|
||||||
#
|
#
|
||||||
def printcallee():
|
def printcallee():
|
||||||
flist = file2undef.keys()
|
flist = file2undef.keys()
|
||||||
flist.sort()
|
flist.sort()
|
||||||
for file in flist:
|
for file in flist:
|
||||||
print file + ':'
|
print file + ':'
|
||||||
elist = file2undef[file]
|
elist = file2undef[file]
|
||||||
elist.sort()
|
elist.sort()
|
||||||
for ext in elist:
|
for ext in elist:
|
||||||
if len(ext) >= 8:
|
if len(ext) >= 8:
|
||||||
tabs = '\t'
|
tabs = '\t'
|
||||||
else:
|
else:
|
||||||
tabs = '\t\t'
|
tabs = '\t\t'
|
||||||
if not def2file.has_key(ext):
|
if not def2file.has_key(ext):
|
||||||
print '\t' + ext + tabs + ' *undefined'
|
print '\t' + ext + tabs + ' *undefined'
|
||||||
else:
|
else:
|
||||||
print '\t' + ext + tabs + flat(def2file[ext])
|
print '\t' + ext + tabs + flat(def2file[ext])
|
||||||
|
|
||||||
# Print for each module the names of the other modules that use it.
|
# Print for each module the names of the other modules that use it.
|
||||||
#
|
#
|
||||||
def printcaller():
|
def printcaller():
|
||||||
files = file2def.keys()
|
files = file2def.keys()
|
||||||
files.sort()
|
files.sort()
|
||||||
for file in files:
|
for file in files:
|
||||||
callers = []
|
callers = []
|
||||||
for label in file2def[file]:
|
for label in file2def[file]:
|
||||||
if undef2file.has_key(label):
|
if undef2file.has_key(label):
|
||||||
callers = callers + undef2file[label]
|
callers = callers + undef2file[label]
|
||||||
if callers:
|
if callers:
|
||||||
callers.sort()
|
callers.sort()
|
||||||
print file + ':'
|
print file + ':'
|
||||||
lastfn = ''
|
lastfn = ''
|
||||||
for fn in callers:
|
for fn in callers:
|
||||||
if fn <> lastfn:
|
if fn <> lastfn:
|
||||||
print '\t' + fn
|
print '\t' + fn
|
||||||
lastfn = fn
|
lastfn = fn
|
||||||
else:
|
else:
|
||||||
print file + ': unused'
|
print file + ': unused'
|
||||||
|
|
||||||
# Print undefine names and where they are used.
|
# Print undefine names and where they are used.
|
||||||
#
|
#
|
||||||
def printundef():
|
def printundef():
|
||||||
undefs = {}
|
undefs = {}
|
||||||
for file in file2undef.keys():
|
for file in file2undef.keys():
|
||||||
for ext in file2undef[file]:
|
for ext in file2undef[file]:
|
||||||
if not def2file.has_key(ext):
|
if not def2file.has_key(ext):
|
||||||
store(undefs, ext, file)
|
store(undefs, ext, file)
|
||||||
elist = undefs.keys()
|
elist = undefs.keys()
|
||||||
elist.sort()
|
elist.sort()
|
||||||
for ext in elist:
|
for ext in elist:
|
||||||
print ext + ':'
|
print ext + ':'
|
||||||
flist = undefs[ext]
|
flist = undefs[ext]
|
||||||
flist.sort()
|
flist.sort()
|
||||||
for file in flist:
|
for file in flist:
|
||||||
print '\t' + file
|
print '\t' + file
|
||||||
|
|
||||||
# Print warning messages about names defined in more than one file.
|
# Print warning messages about names defined in more than one file.
|
||||||
#
|
#
|
||||||
def warndups():
|
def warndups():
|
||||||
savestdout = sys.stdout
|
savestdout = sys.stdout
|
||||||
sys.stdout = sys.stderr
|
sys.stdout = sys.stderr
|
||||||
names = def2file.keys()
|
names = def2file.keys()
|
||||||
names.sort()
|
names.sort()
|
||||||
for name in names:
|
for name in names:
|
||||||
if len(def2file[name]) > 1:
|
if len(def2file[name]) > 1:
|
||||||
print 'warning:', name, 'multiply defined:',
|
print 'warning:', name, 'multiply defined:',
|
||||||
print flat(def2file[name])
|
print flat(def2file[name])
|
||||||
sys.stdout = savestdout
|
sys.stdout = savestdout
|
||||||
|
|
||||||
# Main program
|
# Main program
|
||||||
#
|
#
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
optlist, args = getopt.getopt(sys.argv[1:], 'cdu')
|
optlist, args = getopt.getopt(sys.argv[1:], 'cdu')
|
||||||
except getopt.error:
|
except getopt.error:
|
||||||
sys.stdout = sys.stderr
|
sys.stdout = sys.stderr
|
||||||
print 'Usage:', os.path.basename(sys.argv[0]),
|
print 'Usage:', os.path.basename(sys.argv[0]),
|
||||||
print '[-cdu] [file] ...'
|
print '[-cdu] [file] ...'
|
||||||
print '-c: print callers per objectfile'
|
print '-c: print callers per objectfile'
|
||||||
print '-d: print callees per objectfile'
|
print '-d: print callees per objectfile'
|
||||||
print '-u: print usage of undefined symbols'
|
print '-u: print usage of undefined symbols'
|
||||||
print 'If none of -cdu is specified, all are assumed.'
|
print 'If none of -cdu is specified, all are assumed.'
|
||||||
print 'Use "nm -o" to generate the input (on IRIX: "nm -Bo"),'
|
print 'Use "nm -o" to generate the input (on IRIX: "nm -Bo"),'
|
||||||
print 'e.g.: nm -o /lib/libc.a | objgraph'
|
print 'e.g.: nm -o /lib/libc.a | objgraph'
|
||||||
return 1
|
return 1
|
||||||
optu = optc = optd = 0
|
optu = optc = optd = 0
|
||||||
for opt, void in optlist:
|
for opt, void in optlist:
|
||||||
if opt == '-u':
|
if opt == '-u':
|
||||||
optu = 1
|
optu = 1
|
||||||
elif opt == '-c':
|
elif opt == '-c':
|
||||||
optc = 1
|
optc = 1
|
||||||
elif opt == '-d':
|
elif opt == '-d':
|
||||||
optd = 1
|
optd = 1
|
||||||
if optu == optc == optd == 0:
|
if optu == optc == optd == 0:
|
||||||
optu = optc = optd = 1
|
optu = optc = optd = 1
|
||||||
if not args:
|
if not args:
|
||||||
args = ['-']
|
args = ['-']
|
||||||
for file in args:
|
for file in args:
|
||||||
if file == '-':
|
if file == '-':
|
||||||
readinput(sys.stdin)
|
readinput(sys.stdin)
|
||||||
else:
|
else:
|
||||||
readinput(open(file, 'r'))
|
readinput(open(file, 'r'))
|
||||||
#
|
#
|
||||||
warndups()
|
warndups()
|
||||||
#
|
#
|
||||||
more = (optu + optc + optd > 1)
|
more = (optu + optc + optd > 1)
|
||||||
if optd:
|
if optd:
|
||||||
if more:
|
if more:
|
||||||
print '---------------All callees------------------'
|
print '---------------All callees------------------'
|
||||||
printcallee()
|
printcallee()
|
||||||
if optu:
|
if optu:
|
||||||
if more:
|
if more:
|
||||||
print '---------------Undefined callees------------'
|
print '---------------Undefined callees------------'
|
||||||
printundef()
|
printundef()
|
||||||
if optc:
|
if optc:
|
||||||
if more:
|
if more:
|
||||||
print '---------------All Callers------------------'
|
print '---------------All Callers------------------'
|
||||||
printcaller()
|
printcaller()
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
# Call the main program.
|
# Call the main program.
|
||||||
# Use its return value as exit status.
|
# Use its return value as exit status.
|
||||||
# Catch interrupts to avoid stack trace.
|
# Catch interrupts to avoid stack trace.
|
||||||
#
|
#
|
||||||
try:
|
try:
|
||||||
sys.exit(main())
|
sys.exit(main())
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
Python snippet defining a dictionary "entitydefs" mapping literal
|
Python snippet defining a dictionary "entitydefs" mapping literal
|
||||||
entity name to character or numeric entity.
|
entity name to character or numeric entity.
|
||||||
|
|
||||||
Marc-Andre Lemburg, mal@lemburg.com, 1999.
|
Marc-Andre Lemburg, mal@lemburg.com, 1999.
|
||||||
Use as you like. NO WARRANTIES.
|
Use as you like. NO WARRANTIES.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -62,4 +62,3 @@ if __name__ == '__main__':
|
||||||
text = infile.read()
|
text = infile.read()
|
||||||
defs = parse(text)
|
defs = parse(text)
|
||||||
writefile(outfile,defs)
|
writefile(outfile,defs)
|
||||||
|
|
||||||
|
|
|
@ -33,117 +33,117 @@ rep = sys.stdout.write
|
||||||
new_interpreter = None
|
new_interpreter = None
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
global new_interpreter
|
global new_interpreter
|
||||||
usage = ('usage: %s -i /interpreter file-or-directory ...\n' %
|
usage = ('usage: %s -i /interpreter file-or-directory ...\n' %
|
||||||
sys.argv[0])
|
sys.argv[0])
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'i:')
|
opts, args = getopt.getopt(sys.argv[1:], 'i:')
|
||||||
except getopt.error, msg:
|
except getopt.error, msg:
|
||||||
err(msg + '\n')
|
err(msg + '\n')
|
||||||
err(usage)
|
err(usage)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o == '-i':
|
if o == '-i':
|
||||||
new_interpreter = a
|
new_interpreter = a
|
||||||
if not new_interpreter or new_interpreter[0] != '/' or not args:
|
if not new_interpreter or new_interpreter[0] != '/' or not args:
|
||||||
err('-i option or file-or-directory missing\n')
|
err('-i option or file-or-directory missing\n')
|
||||||
err(usage)
|
err(usage)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
bad = 0
|
bad = 0
|
||||||
for arg in args:
|
for arg in args:
|
||||||
if os.path.isdir(arg):
|
if os.path.isdir(arg):
|
||||||
if recursedown(arg): bad = 1
|
if recursedown(arg): bad = 1
|
||||||
elif os.path.islink(arg):
|
elif os.path.islink(arg):
|
||||||
err(arg + ': will not process symbolic links\n')
|
err(arg + ': will not process symbolic links\n')
|
||||||
bad = 1
|
bad = 1
|
||||||
else:
|
else:
|
||||||
if fix(arg): bad = 1
|
if fix(arg): bad = 1
|
||||||
sys.exit(bad)
|
sys.exit(bad)
|
||||||
|
|
||||||
ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
|
ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
|
||||||
def ispython(name):
|
def ispython(name):
|
||||||
return ispythonprog.match(name) >= 0
|
return ispythonprog.match(name) >= 0
|
||||||
|
|
||||||
def recursedown(dirname):
|
def recursedown(dirname):
|
||||||
dbg('recursedown(' + `dirname` + ')\n')
|
dbg('recursedown(' + `dirname` + ')\n')
|
||||||
bad = 0
|
bad = 0
|
||||||
try:
|
try:
|
||||||
names = os.listdir(dirname)
|
names = os.listdir(dirname)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(dirname + ': cannot list directory: ' + `msg` + '\n')
|
err(dirname + ': cannot list directory: ' + `msg` + '\n')
|
||||||
return 1
|
return 1
|
||||||
names.sort()
|
names.sort()
|
||||||
subdirs = []
|
subdirs = []
|
||||||
for name in names:
|
for name in names:
|
||||||
if name in (os.curdir, os.pardir): continue
|
if name in (os.curdir, os.pardir): continue
|
||||||
fullname = os.path.join(dirname, name)
|
fullname = os.path.join(dirname, name)
|
||||||
if os.path.islink(fullname): pass
|
if os.path.islink(fullname): pass
|
||||||
elif os.path.isdir(fullname):
|
elif os.path.isdir(fullname):
|
||||||
subdirs.append(fullname)
|
subdirs.append(fullname)
|
||||||
elif ispython(name):
|
elif ispython(name):
|
||||||
if fix(fullname): bad = 1
|
if fix(fullname): bad = 1
|
||||||
for fullname in subdirs:
|
for fullname in subdirs:
|
||||||
if recursedown(fullname): bad = 1
|
if recursedown(fullname): bad = 1
|
||||||
return bad
|
return bad
|
||||||
|
|
||||||
def fix(filename):
|
def fix(filename):
|
||||||
## dbg('fix(' + `filename` + ')\n')
|
## dbg('fix(' + `filename` + ')\n')
|
||||||
try:
|
try:
|
||||||
f = open(filename, 'r')
|
f = open(filename, 'r')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
err(filename + ': cannot open: ' + `msg` + '\n')
|
err(filename + ': cannot open: ' + `msg` + '\n')
|
||||||
return 1
|
return 1
|
||||||
line = f.readline()
|
line = f.readline()
|
||||||
fixed = fixline(line)
|
fixed = fixline(line)
|
||||||
if line == fixed:
|
if line == fixed:
|
||||||
rep(filename+': no change\n')
|
rep(filename+': no change\n')
|
||||||
f.close()
|
f.close()
|
||||||
return
|
return
|
||||||
head, tail = os.path.split(filename)
|
head, tail = os.path.split(filename)
|
||||||
tempname = os.path.join(head, '@' + tail)
|
tempname = os.path.join(head, '@' + tail)
|
||||||
try:
|
try:
|
||||||
g = open(tempname, 'w')
|
g = open(tempname, 'w')
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
f.close()
|
f.close()
|
||||||
err(tempname+': cannot create: '+`msg`+'\n')
|
err(tempname+': cannot create: '+`msg`+'\n')
|
||||||
return 1
|
return 1
|
||||||
rep(filename + ': updating\n')
|
rep(filename + ': updating\n')
|
||||||
g.write(fixed)
|
g.write(fixed)
|
||||||
BUFSIZE = 8*1024
|
BUFSIZE = 8*1024
|
||||||
while 1:
|
while 1:
|
||||||
buf = f.read(BUFSIZE)
|
buf = f.read(BUFSIZE)
|
||||||
if not buf: break
|
if not buf: break
|
||||||
g.write(buf)
|
g.write(buf)
|
||||||
g.close()
|
g.close()
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
# Finishing touch -- move files
|
# Finishing touch -- move files
|
||||||
|
|
||||||
# First copy the file's mode to the temp file
|
# First copy the file's mode to the temp file
|
||||||
try:
|
try:
|
||||||
statbuf = os.stat(filename)
|
statbuf = os.stat(filename)
|
||||||
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
os.chmod(tempname, statbuf[ST_MODE] & 07777)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(tempname + ': warning: chmod failed (' + `msg` + ')\n')
|
err(tempname + ': warning: chmod failed (' + `msg` + ')\n')
|
||||||
# Then make a backup of the original file as filename~
|
# Then make a backup of the original file as filename~
|
||||||
try:
|
try:
|
||||||
os.rename(filename, filename + '~')
|
os.rename(filename, filename + '~')
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(filename + ': warning: backup failed (' + `msg` + ')\n')
|
err(filename + ': warning: backup failed (' + `msg` + ')\n')
|
||||||
# Now move the temp file to the original file
|
# Now move the temp file to the original file
|
||||||
try:
|
try:
|
||||||
os.rename(tempname, filename)
|
os.rename(tempname, filename)
|
||||||
except os.error, msg:
|
except os.error, msg:
|
||||||
err(filename + ': rename failed (' + `msg` + ')\n')
|
err(filename + ': rename failed (' + `msg` + ')\n')
|
||||||
return 1
|
return 1
|
||||||
# Return succes
|
# Return succes
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def fixline(line):
|
def fixline(line):
|
||||||
if line[:2] != '#!':
|
if line[:2] != '#!':
|
||||||
return line
|
return line
|
||||||
if string.find(line, "python") < 0:
|
if string.find(line, "python") < 0:
|
||||||
return line
|
return line
|
||||||
return '#! %s\n' % new_interpreter
|
return '#! %s\n' % new_interpreter
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
# Find dependencies between a bunch of Python modules.
|
# Find dependencies between a bunch of Python modules.
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
# pdeps file1.py file2.py ...
|
# pdeps file1.py file2.py ...
|
||||||
#
|
#
|
||||||
# Output:
|
# Output:
|
||||||
# Four tables separated by lines like '--- Closure ---':
|
# Four tables separated by lines like '--- Closure ---':
|
||||||
|
@ -29,31 +29,31 @@ import string
|
||||||
# Main program
|
# Main program
|
||||||
#
|
#
|
||||||
def main():
|
def main():
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
if not args:
|
if not args:
|
||||||
print 'usage: pdeps file.py file.py ...'
|
print 'usage: pdeps file.py file.py ...'
|
||||||
return 2
|
return 2
|
||||||
#
|
#
|
||||||
table = {}
|
table = {}
|
||||||
for arg in args:
|
for arg in args:
|
||||||
process(arg, table)
|
process(arg, table)
|
||||||
#
|
#
|
||||||
print '--- Uses ---'
|
print '--- Uses ---'
|
||||||
printresults(table)
|
printresults(table)
|
||||||
#
|
#
|
||||||
print '--- Used By ---'
|
print '--- Used By ---'
|
||||||
inv = inverse(table)
|
inv = inverse(table)
|
||||||
printresults(inv)
|
printresults(inv)
|
||||||
#
|
#
|
||||||
print '--- Closure of Uses ---'
|
print '--- Closure of Uses ---'
|
||||||
reach = closure(table)
|
reach = closure(table)
|
||||||
printresults(reach)
|
printresults(reach)
|
||||||
#
|
#
|
||||||
print '--- Closure of Used By ---'
|
print '--- Closure of Used By ---'
|
||||||
invreach = inverse(reach)
|
invreach = inverse(reach)
|
||||||
printresults(invreach)
|
printresults(invreach)
|
||||||
#
|
#
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
# Compiled regular expressions to search for import statements
|
# Compiled regular expressions to search for import statements
|
||||||
|
@ -65,56 +65,56 @@ m_from = regex.compile('^[ \t]*import[ \t]+\([^#]+\)')
|
||||||
# Collect data from one file
|
# Collect data from one file
|
||||||
#
|
#
|
||||||
def process(filename, table):
|
def process(filename, table):
|
||||||
fp = open(filename, 'r')
|
fp = open(filename, 'r')
|
||||||
mod = os.path.basename(filename)
|
mod = os.path.basename(filename)
|
||||||
if mod[-3:] == '.py':
|
if mod[-3:] == '.py':
|
||||||
mod = mod[:-3]
|
mod = mod[:-3]
|
||||||
table[mod] = list = []
|
table[mod] = list = []
|
||||||
while 1:
|
while 1:
|
||||||
line = fp.readline()
|
line = fp.readline()
|
||||||
if not line: break
|
if not line: break
|
||||||
while line[-1:] == '\\':
|
while line[-1:] == '\\':
|
||||||
nextline = fp.readline()
|
nextline = fp.readline()
|
||||||
if not nextline: break
|
if not nextline: break
|
||||||
line = line[:-1] + nextline
|
line = line[:-1] + nextline
|
||||||
if m_import.match(line) >= 0:
|
if m_import.match(line) >= 0:
|
||||||
(a, b), (a1, b1) = m_import.regs[:2]
|
(a, b), (a1, b1) = m_import.regs[:2]
|
||||||
elif m_from.match(line) >= 0:
|
elif m_from.match(line) >= 0:
|
||||||
(a, b), (a1, b1) = m_from.regs[:2]
|
(a, b), (a1, b1) = m_from.regs[:2]
|
||||||
else: continue
|
else: continue
|
||||||
words = string.splitfields(line[a1:b1], ',')
|
words = string.splitfields(line[a1:b1], ',')
|
||||||
# print '#', line, words
|
# print '#', line, words
|
||||||
for word in words:
|
for word in words:
|
||||||
word = string.strip(word)
|
word = string.strip(word)
|
||||||
if word not in list:
|
if word not in list:
|
||||||
list.append(word)
|
list.append(word)
|
||||||
|
|
||||||
|
|
||||||
# Compute closure (this is in fact totally general)
|
# Compute closure (this is in fact totally general)
|
||||||
#
|
#
|
||||||
def closure(table):
|
def closure(table):
|
||||||
modules = table.keys()
|
modules = table.keys()
|
||||||
#
|
#
|
||||||
# Initialize reach with a copy of table
|
# Initialize reach with a copy of table
|
||||||
#
|
#
|
||||||
reach = {}
|
reach = {}
|
||||||
for mod in modules:
|
for mod in modules:
|
||||||
reach[mod] = table[mod][:]
|
reach[mod] = table[mod][:]
|
||||||
#
|
#
|
||||||
# Iterate until no more change
|
# Iterate until no more change
|
||||||
#
|
#
|
||||||
change = 1
|
change = 1
|
||||||
while change:
|
while change:
|
||||||
change = 0
|
change = 0
|
||||||
for mod in modules:
|
for mod in modules:
|
||||||
for mo in reach[mod]:
|
for mo in reach[mod]:
|
||||||
if mo in modules:
|
if mo in modules:
|
||||||
for m in reach[mo]:
|
for m in reach[mo]:
|
||||||
if m not in reach[mod]:
|
if m not in reach[mod]:
|
||||||
reach[mod].append(m)
|
reach[mod].append(m)
|
||||||
change = 1
|
change = 1
|
||||||
#
|
#
|
||||||
return reach
|
return reach
|
||||||
|
|
||||||
|
|
||||||
# Invert a table (this is again totally general).
|
# Invert a table (this is again totally general).
|
||||||
|
@ -122,13 +122,13 @@ def closure(table):
|
||||||
# so there may be empty lists in the inverse.
|
# so there may be empty lists in the inverse.
|
||||||
#
|
#
|
||||||
def inverse(table):
|
def inverse(table):
|
||||||
inv = {}
|
inv = {}
|
||||||
for key in table.keys():
|
for key in table.keys():
|
||||||
if not inv.has_key(key):
|
if not inv.has_key(key):
|
||||||
inv[key] = []
|
inv[key] = []
|
||||||
for item in table[key]:
|
for item in table[key]:
|
||||||
store(inv, item, key)
|
store(inv, item, key)
|
||||||
return inv
|
return inv
|
||||||
|
|
||||||
|
|
||||||
# Store "item" in "dict" under "key".
|
# Store "item" in "dict" under "key".
|
||||||
|
@ -136,32 +136,32 @@ def inverse(table):
|
||||||
# If there is no list for the key yet, it is created.
|
# If there is no list for the key yet, it is created.
|
||||||
#
|
#
|
||||||
def store(dict, key, item):
|
def store(dict, key, item):
|
||||||
if dict.has_key(key):
|
if dict.has_key(key):
|
||||||
dict[key].append(item)
|
dict[key].append(item)
|
||||||
else:
|
else:
|
||||||
dict[key] = [item]
|
dict[key] = [item]
|
||||||
|
|
||||||
|
|
||||||
# Tabulate results neatly
|
# Tabulate results neatly
|
||||||
#
|
#
|
||||||
def printresults(table):
|
def printresults(table):
|
||||||
modules = table.keys()
|
modules = table.keys()
|
||||||
maxlen = 0
|
maxlen = 0
|
||||||
for mod in modules: maxlen = max(maxlen, len(mod))
|
for mod in modules: maxlen = max(maxlen, len(mod))
|
||||||
modules.sort()
|
modules.sort()
|
||||||
for mod in modules:
|
for mod in modules:
|
||||||
list = table[mod]
|
list = table[mod]
|
||||||
list.sort()
|
list.sort()
|
||||||
print string.ljust(mod, maxlen), ':',
|
print string.ljust(mod, maxlen), ':',
|
||||||
if mod in list:
|
if mod in list:
|
||||||
print '(*)',
|
print '(*)',
|
||||||
for ref in list:
|
for ref in list:
|
||||||
print ref,
|
print ref,
|
||||||
print
|
print
|
||||||
|
|
||||||
|
|
||||||
# Call main and honor exit status
|
# Call main and honor exit status
|
||||||
try:
|
try:
|
||||||
sys.exit(main())
|
sys.exit(main())
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
|
@ -97,236 +97,236 @@ start = 'if', 'while', 'for', 'try', 'def', 'class'
|
||||||
|
|
||||||
class PythonIndenter:
|
class PythonIndenter:
|
||||||
|
|
||||||
def __init__(self, fpi = sys.stdin, fpo = sys.stdout,
|
def __init__(self, fpi = sys.stdin, fpo = sys.stdout,
|
||||||
indentsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
indentsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
self.fpi = fpi
|
self.fpi = fpi
|
||||||
self.fpo = fpo
|
self.fpo = fpo
|
||||||
self.indentsize = indentsize
|
self.indentsize = indentsize
|
||||||
self.tabsize = tabsize
|
self.tabsize = tabsize
|
||||||
self.lineno = 0
|
self.lineno = 0
|
||||||
self.expandtabs = expandtabs
|
self.expandtabs = expandtabs
|
||||||
self._write = fpo.write
|
self._write = fpo.write
|
||||||
self.kwprog = re.compile(
|
self.kwprog = re.compile(
|
||||||
r'^\s*(?P<kw>[a-z]+)'
|
r'^\s*(?P<kw>[a-z]+)'
|
||||||
r'(\s+(?P<id>[a-zA-Z_]\w*))?'
|
r'(\s+(?P<id>[a-zA-Z_]\w*))?'
|
||||||
r'[^\w]')
|
r'[^\w]')
|
||||||
self.endprog = re.compile(
|
self.endprog = re.compile(
|
||||||
r'^\s*#?\s*end\s+(?P<kw>[a-z]+)'
|
r'^\s*#?\s*end\s+(?P<kw>[a-z]+)'
|
||||||
r'(\s+(?P<id>[a-zA-Z_]\w*))?'
|
r'(\s+(?P<id>[a-zA-Z_]\w*))?'
|
||||||
r'[^\w]')
|
r'[^\w]')
|
||||||
self.wsprog = re.compile(r'^[ \t]*')
|
self.wsprog = re.compile(r'^[ \t]*')
|
||||||
# end def __init__
|
# end def __init__
|
||||||
|
|
||||||
def write(self, line):
|
def write(self, line):
|
||||||
if self.expandtabs:
|
if self.expandtabs:
|
||||||
self._write(string.expandtabs(line, self.tabsize))
|
self._write(string.expandtabs(line, self.tabsize))
|
||||||
else:
|
else:
|
||||||
self._write(line)
|
self._write(line)
|
||||||
# end if
|
# end if
|
||||||
# end def write
|
# end def write
|
||||||
|
|
||||||
def readline(self):
|
def readline(self):
|
||||||
line = self.fpi.readline()
|
line = self.fpi.readline()
|
||||||
if line: self.lineno = self.lineno + 1
|
if line: self.lineno = self.lineno + 1
|
||||||
# end if
|
# end if
|
||||||
return line
|
return line
|
||||||
# end def readline
|
# end def readline
|
||||||
|
|
||||||
def error(self, fmt, *args):
|
def error(self, fmt, *args):
|
||||||
if args: fmt = fmt % args
|
if args: fmt = fmt % args
|
||||||
# end if
|
# end if
|
||||||
sys.stderr.write('Error at line %d: %s\n' % (self.lineno, fmt))
|
sys.stderr.write('Error at line %d: %s\n' % (self.lineno, fmt))
|
||||||
self.write('### %s ###\n' % fmt)
|
self.write('### %s ###\n' % fmt)
|
||||||
# end def error
|
# end def error
|
||||||
|
|
||||||
def getline(self):
|
def getline(self):
|
||||||
line = self.readline()
|
line = self.readline()
|
||||||
while line[-2:] == '\\\n':
|
while line[-2:] == '\\\n':
|
||||||
line2 = self.readline()
|
line2 = self.readline()
|
||||||
if not line2: break
|
if not line2: break
|
||||||
# end if
|
# end if
|
||||||
line = line + line2
|
line = line + line2
|
||||||
# end while
|
# end while
|
||||||
return line
|
return line
|
||||||
# end def getline
|
# end def getline
|
||||||
|
|
||||||
def putline(self, line, indent = None):
|
def putline(self, line, indent = None):
|
||||||
if indent is None:
|
if indent is None:
|
||||||
self.write(line)
|
self.write(line)
|
||||||
return
|
return
|
||||||
# end if
|
# end if
|
||||||
tabs, spaces = divmod(indent*self.indentsize, self.tabsize)
|
tabs, spaces = divmod(indent*self.indentsize, self.tabsize)
|
||||||
i = 0
|
i = 0
|
||||||
m = self.wsprog.match(line)
|
m = self.wsprog.match(line)
|
||||||
if m: i = m.end()
|
if m: i = m.end()
|
||||||
# end if
|
# end if
|
||||||
self.write('\t'*tabs + ' '*spaces + line[i:])
|
self.write('\t'*tabs + ' '*spaces + line[i:])
|
||||||
# end def putline
|
# end def putline
|
||||||
|
|
||||||
def reformat(self):
|
def reformat(self):
|
||||||
stack = []
|
stack = []
|
||||||
while 1:
|
while 1:
|
||||||
line = self.getline()
|
line = self.getline()
|
||||||
if not line: break # EOF
|
if not line: break # EOF
|
||||||
# end if
|
# end if
|
||||||
m = self.endprog.match(line)
|
m = self.endprog.match(line)
|
||||||
if m:
|
if m:
|
||||||
kw = 'end'
|
kw = 'end'
|
||||||
kw2 = m.group('kw')
|
kw2 = m.group('kw')
|
||||||
if not stack:
|
if not stack:
|
||||||
self.error('unexpected end')
|
self.error('unexpected end')
|
||||||
elif stack[-1][0] != kw2:
|
elif stack[-1][0] != kw2:
|
||||||
self.error('unmatched end')
|
self.error('unmatched end')
|
||||||
# end if
|
# end if
|
||||||
del stack[-1:]
|
del stack[-1:]
|
||||||
self.putline(line, len(stack))
|
self.putline(line, len(stack))
|
||||||
continue
|
continue
|
||||||
# end if
|
# end if
|
||||||
m = self.kwprog.match(line)
|
m = self.kwprog.match(line)
|
||||||
if m:
|
if m:
|
||||||
kw = m.group('kw')
|
kw = m.group('kw')
|
||||||
if kw in start:
|
if kw in start:
|
||||||
self.putline(line, len(stack))
|
self.putline(line, len(stack))
|
||||||
stack.append((kw, kw))
|
stack.append((kw, kw))
|
||||||
continue
|
continue
|
||||||
# end if
|
# end if
|
||||||
if next.has_key(kw) and stack:
|
if next.has_key(kw) and stack:
|
||||||
self.putline(line, len(stack)-1)
|
self.putline(line, len(stack)-1)
|
||||||
kwa, kwb = stack[-1]
|
kwa, kwb = stack[-1]
|
||||||
stack[-1] = kwa, kw
|
stack[-1] = kwa, kw
|
||||||
continue
|
continue
|
||||||
# end if
|
# end if
|
||||||
# end if
|
# end if
|
||||||
self.putline(line, len(stack))
|
self.putline(line, len(stack))
|
||||||
# end while
|
# end while
|
||||||
if stack:
|
if stack:
|
||||||
self.error('unterminated keywords')
|
self.error('unterminated keywords')
|
||||||
for kwa, kwb in stack:
|
for kwa, kwb in stack:
|
||||||
self.write('\t%s\n' % kwa)
|
self.write('\t%s\n' % kwa)
|
||||||
# end for
|
# end for
|
||||||
# end if
|
# end if
|
||||||
# end def reformat
|
# end def reformat
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
begin_counter = 0
|
begin_counter = 0
|
||||||
end_counter = 0
|
end_counter = 0
|
||||||
while 1:
|
while 1:
|
||||||
line = self.getline()
|
line = self.getline()
|
||||||
if not line: break # EOF
|
if not line: break # EOF
|
||||||
# end if
|
# end if
|
||||||
m = self.endprog.match(line)
|
m = self.endprog.match(line)
|
||||||
if m:
|
if m:
|
||||||
end_counter = end_counter + 1
|
end_counter = end_counter + 1
|
||||||
continue
|
continue
|
||||||
# end if
|
# end if
|
||||||
m = self.kwprog.match(line)
|
m = self.kwprog.match(line)
|
||||||
if m:
|
if m:
|
||||||
kw = m.group('kw')
|
kw = m.group('kw')
|
||||||
if kw in start:
|
if kw in start:
|
||||||
begin_counter = begin_counter + 1
|
begin_counter = begin_counter + 1
|
||||||
# end if
|
# end if
|
||||||
# end if
|
# end if
|
||||||
self.putline(line)
|
self.putline(line)
|
||||||
# end while
|
# end while
|
||||||
if begin_counter - end_counter < 0:
|
if begin_counter - end_counter < 0:
|
||||||
sys.stderr.write('Warning: input contained more end tags than expected\n')
|
sys.stderr.write('Warning: input contained more end tags than expected\n')
|
||||||
elif begin_counter - end_counter > 0:
|
elif begin_counter - end_counter > 0:
|
||||||
sys.stderr.write('Warning: input contained less end tags than expected\n')
|
sys.stderr.write('Warning: input contained less end tags than expected\n')
|
||||||
# end if
|
# end if
|
||||||
# end def delete
|
# end def delete
|
||||||
|
|
||||||
def complete(self):
|
def complete(self):
|
||||||
self.indentsize = 1
|
self.indentsize = 1
|
||||||
stack = []
|
stack = []
|
||||||
todo = []
|
todo = []
|
||||||
current, firstkw, lastkw, topid = 0, '', '', ''
|
current, firstkw, lastkw, topid = 0, '', '', ''
|
||||||
while 1:
|
while 1:
|
||||||
line = self.getline()
|
line = self.getline()
|
||||||
i = 0
|
i = 0
|
||||||
m = self.wsprog.match(line)
|
m = self.wsprog.match(line)
|
||||||
if m: i = m.end()
|
if m: i = m.end()
|
||||||
# end if
|
# end if
|
||||||
m = self.endprog.match(line)
|
m = self.endprog.match(line)
|
||||||
if m:
|
if m:
|
||||||
thiskw = 'end'
|
thiskw = 'end'
|
||||||
endkw = m.group('kw')
|
endkw = m.group('kw')
|
||||||
thisid = m.group('id')
|
thisid = m.group('id')
|
||||||
else:
|
else:
|
||||||
m = self.kwprog.match(line)
|
m = self.kwprog.match(line)
|
||||||
if m:
|
if m:
|
||||||
thiskw = m.group('kw')
|
thiskw = m.group('kw')
|
||||||
if not next.has_key(thiskw):
|
if not next.has_key(thiskw):
|
||||||
thiskw = ''
|
thiskw = ''
|
||||||
# end if
|
# end if
|
||||||
if thiskw in ('def', 'class'):
|
if thiskw in ('def', 'class'):
|
||||||
thisid = m.group('id')
|
thisid = m.group('id')
|
||||||
else:
|
else:
|
||||||
thisid = ''
|
thisid = ''
|
||||||
# end if
|
# end if
|
||||||
elif line[i:i+1] in ('\n', '#'):
|
elif line[i:i+1] in ('\n', '#'):
|
||||||
todo.append(line)
|
todo.append(line)
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
thiskw = ''
|
thiskw = ''
|
||||||
# end if
|
# end if
|
||||||
# end if
|
# end if
|
||||||
indent = len(string.expandtabs(line[:i], self.tabsize))
|
indent = len(string.expandtabs(line[:i], self.tabsize))
|
||||||
while indent < current:
|
while indent < current:
|
||||||
if firstkw:
|
if firstkw:
|
||||||
if topid:
|
if topid:
|
||||||
s = '# end %s %s\n' % (
|
s = '# end %s %s\n' % (
|
||||||
firstkw, topid)
|
firstkw, topid)
|
||||||
else:
|
else:
|
||||||
s = '# end %s\n' % firstkw
|
s = '# end %s\n' % firstkw
|
||||||
# end if
|
# end if
|
||||||
self.putline(s, current)
|
self.putline(s, current)
|
||||||
firstkw = lastkw = ''
|
firstkw = lastkw = ''
|
||||||
# end if
|
# end if
|
||||||
current, firstkw, lastkw, topid = stack[-1]
|
current, firstkw, lastkw, topid = stack[-1]
|
||||||
del stack[-1]
|
del stack[-1]
|
||||||
# end while
|
# end while
|
||||||
if indent == current and firstkw:
|
if indent == current and firstkw:
|
||||||
if thiskw == 'end':
|
if thiskw == 'end':
|
||||||
if endkw != firstkw:
|
if endkw != firstkw:
|
||||||
self.error('mismatched end')
|
self.error('mismatched end')
|
||||||
# end if
|
# end if
|
||||||
firstkw = lastkw = ''
|
firstkw = lastkw = ''
|
||||||
elif not thiskw or thiskw in start:
|
elif not thiskw or thiskw in start:
|
||||||
if topid:
|
if topid:
|
||||||
s = '# end %s %s\n' % (
|
s = '# end %s %s\n' % (
|
||||||
firstkw, topid)
|
firstkw, topid)
|
||||||
else:
|
else:
|
||||||
s = '# end %s\n' % firstkw
|
s = '# end %s\n' % firstkw
|
||||||
# end if
|
# end if
|
||||||
self.putline(s, current)
|
self.putline(s, current)
|
||||||
firstkw = lastkw = topid = ''
|
firstkw = lastkw = topid = ''
|
||||||
# end if
|
# end if
|
||||||
# end if
|
# end if
|
||||||
if indent > current:
|
if indent > current:
|
||||||
stack.append((current, firstkw, lastkw, topid))
|
stack.append((current, firstkw, lastkw, topid))
|
||||||
if thiskw and thiskw not in start:
|
if thiskw and thiskw not in start:
|
||||||
# error
|
# error
|
||||||
thiskw = ''
|
thiskw = ''
|
||||||
# end if
|
# end if
|
||||||
current, firstkw, lastkw, topid = \
|
current, firstkw, lastkw, topid = \
|
||||||
indent, thiskw, thiskw, thisid
|
indent, thiskw, thiskw, thisid
|
||||||
# end if
|
# end if
|
||||||
if thiskw:
|
if thiskw:
|
||||||
if thiskw in start:
|
if thiskw in start:
|
||||||
firstkw = lastkw = thiskw
|
firstkw = lastkw = thiskw
|
||||||
topid = thisid
|
topid = thisid
|
||||||
else:
|
else:
|
||||||
lastkw = thiskw
|
lastkw = thiskw
|
||||||
# end if
|
# end if
|
||||||
# end if
|
# end if
|
||||||
for l in todo: self.write(l)
|
for l in todo: self.write(l)
|
||||||
# end for
|
# end for
|
||||||
todo = []
|
todo = []
|
||||||
if not line: break
|
if not line: break
|
||||||
# end if
|
# end if
|
||||||
self.write(line)
|
self.write(line)
|
||||||
# end while
|
# end while
|
||||||
# end def complete
|
# end def complete
|
||||||
|
|
||||||
# end class PythonIndenter
|
# end class PythonIndenter
|
||||||
|
|
||||||
|
@ -336,134 +336,134 @@ class PythonIndenter:
|
||||||
# - xxx_file(filename): process file in place, return true iff changed
|
# - xxx_file(filename): process file in place, return true iff changed
|
||||||
|
|
||||||
def complete_filter(input = sys.stdin, output = sys.stdout,
|
def complete_filter(input = sys.stdin, output = sys.stdout,
|
||||||
stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
||||||
pi.complete()
|
pi.complete()
|
||||||
# end def complete_filter
|
# end def complete_filter
|
||||||
|
|
||||||
def delete_filter(input= sys.stdin, output = sys.stdout,
|
def delete_filter(input= sys.stdin, output = sys.stdout,
|
||||||
stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
||||||
pi.delete()
|
pi.delete()
|
||||||
# end def delete_filter
|
# end def delete_filter
|
||||||
|
|
||||||
def reformat_filter(input = sys.stdin, output = sys.stdout,
|
def reformat_filter(input = sys.stdin, output = sys.stdout,
|
||||||
stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
||||||
pi.reformat()
|
pi.reformat()
|
||||||
# end def reformat_filter
|
# end def reformat_filter
|
||||||
|
|
||||||
class StringReader:
|
class StringReader:
|
||||||
def __init__(self, buf):
|
def __init__(self, buf):
|
||||||
self.buf = buf
|
self.buf = buf
|
||||||
self.pos = 0
|
self.pos = 0
|
||||||
self.len = len(self.buf)
|
self.len = len(self.buf)
|
||||||
# end def __init__
|
# end def __init__
|
||||||
def read(self, n = 0):
|
def read(self, n = 0):
|
||||||
if n <= 0:
|
if n <= 0:
|
||||||
n = self.len - self.pos
|
n = self.len - self.pos
|
||||||
else:
|
else:
|
||||||
n = min(n, self.len - self.pos)
|
n = min(n, self.len - self.pos)
|
||||||
# end if
|
# end if
|
||||||
r = self.buf[self.pos : self.pos + n]
|
r = self.buf[self.pos : self.pos + n]
|
||||||
self.pos = self.pos + n
|
self.pos = self.pos + n
|
||||||
return r
|
return r
|
||||||
# end def read
|
# end def read
|
||||||
def readline(self):
|
def readline(self):
|
||||||
i = string.find(self.buf, '\n', self.pos)
|
i = string.find(self.buf, '\n', self.pos)
|
||||||
return self.read(i + 1 - self.pos)
|
return self.read(i + 1 - self.pos)
|
||||||
# end def readline
|
# end def readline
|
||||||
def readlines(self):
|
def readlines(self):
|
||||||
lines = []
|
lines = []
|
||||||
line = self.readline()
|
line = self.readline()
|
||||||
while line:
|
while line:
|
||||||
lines.append(line)
|
lines.append(line)
|
||||||
line = self.readline()
|
line = self.readline()
|
||||||
# end while
|
# end while
|
||||||
return lines
|
return lines
|
||||||
# end def readlines
|
# end def readlines
|
||||||
# seek/tell etc. are left as an exercise for the reader
|
# seek/tell etc. are left as an exercise for the reader
|
||||||
# end class StringReader
|
# end class StringReader
|
||||||
|
|
||||||
class StringWriter:
|
class StringWriter:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.buf = ''
|
self.buf = ''
|
||||||
# end def __init__
|
# end def __init__
|
||||||
def write(self, s):
|
def write(self, s):
|
||||||
self.buf = self.buf + s
|
self.buf = self.buf + s
|
||||||
# end def write
|
# end def write
|
||||||
def getvalue(self):
|
def getvalue(self):
|
||||||
return self.buf
|
return self.buf
|
||||||
# end def getvalue
|
# end def getvalue
|
||||||
# end class StringWriter
|
# end class StringWriter
|
||||||
|
|
||||||
def complete_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
def complete_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
input = StringReader(source)
|
input = StringReader(source)
|
||||||
output = StringWriter()
|
output = StringWriter()
|
||||||
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
||||||
pi.complete()
|
pi.complete()
|
||||||
return output.getvalue()
|
return output.getvalue()
|
||||||
# end def complete_string
|
# end def complete_string
|
||||||
|
|
||||||
def delete_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
def delete_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
input = StringReader(source)
|
input = StringReader(source)
|
||||||
output = StringWriter()
|
output = StringWriter()
|
||||||
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
||||||
pi.delete()
|
pi.delete()
|
||||||
return output.getvalue()
|
return output.getvalue()
|
||||||
# end def delete_string
|
# end def delete_string
|
||||||
|
|
||||||
def reformat_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
def reformat_string(source, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
input = StringReader(source)
|
input = StringReader(source)
|
||||||
output = StringWriter()
|
output = StringWriter()
|
||||||
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
pi = PythonIndenter(input, output, stepsize, tabsize, expandtabs)
|
||||||
pi.reformat()
|
pi.reformat()
|
||||||
return output.getvalue()
|
return output.getvalue()
|
||||||
# end def reformat_string
|
# end def reformat_string
|
||||||
|
|
||||||
def complete_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
def complete_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
source = open(filename, 'r').read()
|
source = open(filename, 'r').read()
|
||||||
result = complete_string(source, stepsize, tabsize, expandtabs)
|
result = complete_string(source, stepsize, tabsize, expandtabs)
|
||||||
if source == result: return 0
|
if source == result: return 0
|
||||||
# end if
|
# end if
|
||||||
import os
|
import os
|
||||||
try: os.rename(filename, filename + '~')
|
try: os.rename(filename, filename + '~')
|
||||||
except os.error: pass
|
except os.error: pass
|
||||||
# end try
|
# end try
|
||||||
f = open(filename, 'w')
|
f = open(filename, 'w')
|
||||||
f.write(result)
|
f.write(result)
|
||||||
f.close()
|
f.close()
|
||||||
return 1
|
return 1
|
||||||
# end def complete_file
|
# end def complete_file
|
||||||
|
|
||||||
def delete_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
def delete_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
source = open(filename, 'r').read()
|
source = open(filename, 'r').read()
|
||||||
result = delete_string(source, stepsize, tabsize, expandtabs)
|
result = delete_string(source, stepsize, tabsize, expandtabs)
|
||||||
if source == result: return 0
|
if source == result: return 0
|
||||||
# end if
|
# end if
|
||||||
import os
|
import os
|
||||||
try: os.rename(filename, filename + '~')
|
try: os.rename(filename, filename + '~')
|
||||||
except os.error: pass
|
except os.error: pass
|
||||||
# end try
|
# end try
|
||||||
f = open(filename, 'w')
|
f = open(filename, 'w')
|
||||||
f.write(result)
|
f.write(result)
|
||||||
f.close()
|
f.close()
|
||||||
return 1
|
return 1
|
||||||
# end def delete_file
|
# end def delete_file
|
||||||
|
|
||||||
def reformat_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
def reformat_file(filename, stepsize = STEPSIZE, tabsize = TABSIZE, expandtabs = EXPANDTABS):
|
||||||
source = open(filename, 'r').read()
|
source = open(filename, 'r').read()
|
||||||
result = reformat_string(source, stepsize, tabsize, expandtabs)
|
result = reformat_string(source, stepsize, tabsize, expandtabs)
|
||||||
if source == result: return 0
|
if source == result: return 0
|
||||||
# end if
|
# end if
|
||||||
import os
|
import os
|
||||||
try: os.rename(filename, filename + '~')
|
try: os.rename(filename, filename + '~')
|
||||||
except os.error: pass
|
except os.error: pass
|
||||||
# end try
|
# end try
|
||||||
f = open(filename, 'w')
|
f = open(filename, 'w')
|
||||||
f.write(result)
|
f.write(result)
|
||||||
f.close()
|
f.close()
|
||||||
return 1
|
return 1
|
||||||
# end def reformat_file
|
# end def reformat_file
|
||||||
|
|
||||||
# Test program when called as a script
|
# Test program when called as a script
|
||||||
|
@ -482,62 +482,62 @@ the program acts as a filter (reads stdin, writes stdout).
|
||||||
""" % vars()
|
""" % vars()
|
||||||
|
|
||||||
def error_both(op1, op2):
|
def error_both(op1, op2):
|
||||||
sys.stderr.write('Error: You can not specify both '+op1+' and -'+op2[0]+' at the same time\n')
|
sys.stderr.write('Error: You can not specify both '+op1+' and -'+op2[0]+' at the same time\n')
|
||||||
sys.stderr.write(usage)
|
sys.stderr.write(usage)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
# end def error_both
|
# end def error_both
|
||||||
|
|
||||||
def test():
|
def test():
|
||||||
import getopt
|
import getopt
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'cdrs:t:e')
|
opts, args = getopt.getopt(sys.argv[1:], 'cdrs:t:e')
|
||||||
except getopt.error, msg:
|
except getopt.error, msg:
|
||||||
sys.stderr.write('Error: %s\n' % msg)
|
sys.stderr.write('Error: %s\n' % msg)
|
||||||
sys.stderr.write(usage)
|
sys.stderr.write(usage)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
# end try
|
# end try
|
||||||
action = None
|
action = None
|
||||||
stepsize = STEPSIZE
|
stepsize = STEPSIZE
|
||||||
tabsize = TABSIZE
|
tabsize = TABSIZE
|
||||||
expandtabs = EXPANDTABS
|
expandtabs = EXPANDTABS
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o == '-c':
|
if o == '-c':
|
||||||
if action: error_both(o, action)
|
if action: error_both(o, action)
|
||||||
# end if
|
# end if
|
||||||
action = 'complete'
|
action = 'complete'
|
||||||
elif o == '-d':
|
elif o == '-d':
|
||||||
if action: error_both(o, action)
|
if action: error_both(o, action)
|
||||||
# end if
|
# end if
|
||||||
action = 'delete'
|
action = 'delete'
|
||||||
elif o == '-r':
|
elif o == '-r':
|
||||||
if action: error_both(o, action)
|
if action: error_both(o, action)
|
||||||
# end if
|
# end if
|
||||||
action = 'reformat'
|
action = 'reformat'
|
||||||
elif o == '-s':
|
elif o == '-s':
|
||||||
stepsize = string.atoi(a)
|
stepsize = string.atoi(a)
|
||||||
elif o == '-t':
|
elif o == '-t':
|
||||||
tabsize = string.atoi(a)
|
tabsize = string.atoi(a)
|
||||||
elif o == '-e':
|
elif o == '-e':
|
||||||
expandtabs = 1
|
expandtabs = 1
|
||||||
# end if
|
# end if
|
||||||
# end for
|
# end for
|
||||||
if not action:
|
if not action:
|
||||||
sys.stderr.write(
|
sys.stderr.write(
|
||||||
'You must specify -c(omplete), -d(elete) or -r(eformat)\n')
|
'You must specify -c(omplete), -d(elete) or -r(eformat)\n')
|
||||||
sys.stderr.write(usage)
|
sys.stderr.write(usage)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
# end if
|
# end if
|
||||||
if not args or args == ['-']:
|
if not args or args == ['-']:
|
||||||
action = eval(action + '_filter')
|
action = eval(action + '_filter')
|
||||||
action(sys.stdin, sys.stdout, stepsize, tabsize, expandtabs)
|
action(sys.stdin, sys.stdout, stepsize, tabsize, expandtabs)
|
||||||
else:
|
else:
|
||||||
action = eval(action + '_file')
|
action = eval(action + '_file')
|
||||||
for file in args:
|
for file in args:
|
||||||
action(file, stepsize, tabsize, expandtabs)
|
action(file, stepsize, tabsize, expandtabs)
|
||||||
# end for
|
# end for
|
||||||
# end if
|
# end if
|
||||||
# end def test
|
# end def test
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
test()
|
test()
|
||||||
# end if
|
# end if
|
||||||
|
|
|
@ -39,7 +39,7 @@ def treat_file(file):
|
||||||
tags.append(s)
|
tags.append(s)
|
||||||
while 1:
|
while 1:
|
||||||
line = fp.readline()
|
line = fp.readline()
|
||||||
if not line:
|
if not line:
|
||||||
break
|
break
|
||||||
m = matcher.match(line)
|
m = matcher.match(line)
|
||||||
if m:
|
if m:
|
||||||
|
|
|
@ -4,159 +4,159 @@ from Tkinter import *
|
||||||
import re
|
import re
|
||||||
|
|
||||||
class ReDemo:
|
class ReDemo:
|
||||||
|
|
||||||
def __init__(self, master):
|
|
||||||
self.master = master
|
|
||||||
|
|
||||||
self.promptdisplay = Label(self.master, anchor=W,
|
def __init__(self, master):
|
||||||
text="Enter a Perl-style regular expression:")
|
self.master = master
|
||||||
self.promptdisplay.pack(side=TOP, fill=X)
|
|
||||||
|
|
||||||
self.regexdisplay = Entry(self.master)
|
self.promptdisplay = Label(self.master, anchor=W,
|
||||||
self.regexdisplay.pack(fill=X)
|
text="Enter a Perl-style regular expression:")
|
||||||
self.regexdisplay.focus_set()
|
self.promptdisplay.pack(side=TOP, fill=X)
|
||||||
|
|
||||||
self.addoptions()
|
self.regexdisplay = Entry(self.master)
|
||||||
|
self.regexdisplay.pack(fill=X)
|
||||||
|
self.regexdisplay.focus_set()
|
||||||
|
|
||||||
self.statusdisplay = Label(self.master, text="", anchor=W)
|
self.addoptions()
|
||||||
self.statusdisplay.pack(side=TOP, fill=X)
|
|
||||||
|
|
||||||
self.labeldisplay = Label(self.master, anchor=W,
|
self.statusdisplay = Label(self.master, text="", anchor=W)
|
||||||
text="Enter a string to search:")
|
self.statusdisplay.pack(side=TOP, fill=X)
|
||||||
self.labeldisplay.pack(fill=X)
|
|
||||||
self.labeldisplay.pack(fill=X)
|
|
||||||
|
|
||||||
self.showframe = Frame(master)
|
self.labeldisplay = Label(self.master, anchor=W,
|
||||||
self.showframe.pack(fill=X, anchor=W)
|
text="Enter a string to search:")
|
||||||
|
self.labeldisplay.pack(fill=X)
|
||||||
|
self.labeldisplay.pack(fill=X)
|
||||||
|
|
||||||
self.showvar = StringVar(master)
|
self.showframe = Frame(master)
|
||||||
self.showvar.set("first")
|
self.showframe.pack(fill=X, anchor=W)
|
||||||
|
|
||||||
self.showfirstradio = Radiobutton(self.showframe,
|
self.showvar = StringVar(master)
|
||||||
text="Highlight first match",
|
self.showvar.set("first")
|
||||||
variable=self.showvar,
|
|
||||||
value="first",
|
|
||||||
command=self.recompile)
|
|
||||||
self.showfirstradio.pack(side=LEFT)
|
|
||||||
|
|
||||||
self.showallradio = Radiobutton(self.showframe,
|
self.showfirstradio = Radiobutton(self.showframe,
|
||||||
text="Highlight all matches",
|
text="Highlight first match",
|
||||||
variable=self.showvar,
|
variable=self.showvar,
|
||||||
value="all",
|
value="first",
|
||||||
command=self.recompile)
|
command=self.recompile)
|
||||||
self.showallradio.pack(side=LEFT)
|
self.showfirstradio.pack(side=LEFT)
|
||||||
|
|
||||||
self.stringdisplay = Text(self.master, width=60, height=4)
|
self.showallradio = Radiobutton(self.showframe,
|
||||||
self.stringdisplay.pack(fill=BOTH, expand=1)
|
text="Highlight all matches",
|
||||||
self.stringdisplay.tag_configure("hit", background="yellow")
|
variable=self.showvar,
|
||||||
|
value="all",
|
||||||
|
command=self.recompile)
|
||||||
|
self.showallradio.pack(side=LEFT)
|
||||||
|
|
||||||
self.grouplabel = Label(self.master, text="Groups:", anchor=W)
|
self.stringdisplay = Text(self.master, width=60, height=4)
|
||||||
self.grouplabel.pack(fill=X)
|
self.stringdisplay.pack(fill=BOTH, expand=1)
|
||||||
|
self.stringdisplay.tag_configure("hit", background="yellow")
|
||||||
|
|
||||||
self.grouplist = Listbox(self.master)
|
self.grouplabel = Label(self.master, text="Groups:", anchor=W)
|
||||||
self.grouplist.pack(expand=1, fill=BOTH)
|
self.grouplabel.pack(fill=X)
|
||||||
|
|
||||||
self.regexdisplay.bind('<Key>', self.recompile)
|
self.grouplist = Listbox(self.master)
|
||||||
self.stringdisplay.bind('<Key>', self.reevaluate)
|
self.grouplist.pack(expand=1, fill=BOTH)
|
||||||
|
|
||||||
self.compiled = None
|
self.regexdisplay.bind('<Key>', self.recompile)
|
||||||
self.recompile()
|
self.stringdisplay.bind('<Key>', self.reevaluate)
|
||||||
|
|
||||||
btags = self.regexdisplay.bindtags()
|
self.compiled = None
|
||||||
self.regexdisplay.bindtags(btags[1:] + btags[:1])
|
self.recompile()
|
||||||
|
|
||||||
btags = self.stringdisplay.bindtags()
|
btags = self.regexdisplay.bindtags()
|
||||||
self.stringdisplay.bindtags(btags[1:] + btags[:1])
|
self.regexdisplay.bindtags(btags[1:] + btags[:1])
|
||||||
|
|
||||||
def addoptions(self):
|
|
||||||
self.frames = []
|
|
||||||
self.boxes = []
|
|
||||||
self.vars = []
|
|
||||||
for name in ('IGNORECASE',
|
|
||||||
'LOCALE',
|
|
||||||
'MULTILINE',
|
|
||||||
'DOTALL',
|
|
||||||
'VERBOSE'):
|
|
||||||
if len(self.boxes) % 3 == 0:
|
|
||||||
frame = Frame(self.master)
|
|
||||||
frame.pack(fill=X)
|
|
||||||
self.frames.append(frame)
|
|
||||||
val = getattr(re, name)
|
|
||||||
var = IntVar()
|
|
||||||
box = Checkbutton(frame,
|
|
||||||
variable=var, text=name,
|
|
||||||
offvalue=0, onvalue=val,
|
|
||||||
command=self.recompile)
|
|
||||||
box.pack(side=LEFT)
|
|
||||||
self.boxes.append(box)
|
|
||||||
self.vars.append(var)
|
|
||||||
|
|
||||||
def getflags(self):
|
|
||||||
flags = 0
|
|
||||||
for var in self.vars:
|
|
||||||
flags = flags | var.get()
|
|
||||||
flags = flags
|
|
||||||
return flags
|
|
||||||
|
|
||||||
def recompile(self, event=None):
|
|
||||||
try:
|
|
||||||
self.compiled = re.compile(self.regexdisplay.get(),
|
|
||||||
self.getflags())
|
|
||||||
bg = self.promptdisplay['background']
|
|
||||||
self.statusdisplay.config(text="", background=bg)
|
|
||||||
except re.error, msg:
|
|
||||||
self.compiled = None
|
|
||||||
self.statusdisplay.config(
|
|
||||||
text="re.error: %s" % str(msg),
|
|
||||||
background="red")
|
|
||||||
self.reevaluate()
|
|
||||||
|
|
||||||
def reevaluate(self, event=None):
|
|
||||||
try:
|
|
||||||
self.stringdisplay.tag_remove("hit", "1.0", END)
|
|
||||||
except TclError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
self.stringdisplay.tag_remove("hit0", "1.0", END)
|
|
||||||
except TclError:
|
|
||||||
pass
|
|
||||||
self.grouplist.delete(0, END)
|
|
||||||
if not self.compiled:
|
|
||||||
return
|
|
||||||
self.stringdisplay.tag_configure("hit", background="yellow")
|
|
||||||
self.stringdisplay.tag_configure("hit0", background="orange")
|
|
||||||
text = self.stringdisplay.get("1.0", END)
|
|
||||||
last = 0
|
|
||||||
nmatches = 0
|
|
||||||
while last <= len(text):
|
|
||||||
m = self.compiled.search(text, last)
|
|
||||||
if m is None:
|
|
||||||
break
|
|
||||||
first, last = m.span()
|
|
||||||
if last == first:
|
|
||||||
last = first+1
|
|
||||||
tag = "hit0"
|
|
||||||
else:
|
|
||||||
tag = "hit"
|
|
||||||
pfirst = "1.0 + %d chars" % first
|
|
||||||
plast = "1.0 + %d chars" % last
|
|
||||||
self.stringdisplay.tag_add(tag, pfirst, plast)
|
|
||||||
if nmatches == 0:
|
|
||||||
self.stringdisplay.yview_pickplace(pfirst)
|
|
||||||
groups = list(m.groups())
|
|
||||||
groups.insert(0, m.group())
|
|
||||||
for i in range(len(groups)):
|
|
||||||
g = "%2d: %s" % (i, `groups[i]`)
|
|
||||||
self.grouplist.insert(END, g)
|
|
||||||
nmatches = nmatches + 1
|
|
||||||
if self.showvar.get() == "first":
|
|
||||||
break
|
|
||||||
|
|
||||||
if nmatches == 0:
|
btags = self.stringdisplay.bindtags()
|
||||||
self.statusdisplay.config(text="(no match)",
|
self.stringdisplay.bindtags(btags[1:] + btags[:1])
|
||||||
background="yellow")
|
|
||||||
else:
|
def addoptions(self):
|
||||||
self.statusdisplay.config(text="")
|
self.frames = []
|
||||||
|
self.boxes = []
|
||||||
|
self.vars = []
|
||||||
|
for name in ('IGNORECASE',
|
||||||
|
'LOCALE',
|
||||||
|
'MULTILINE',
|
||||||
|
'DOTALL',
|
||||||
|
'VERBOSE'):
|
||||||
|
if len(self.boxes) % 3 == 0:
|
||||||
|
frame = Frame(self.master)
|
||||||
|
frame.pack(fill=X)
|
||||||
|
self.frames.append(frame)
|
||||||
|
val = getattr(re, name)
|
||||||
|
var = IntVar()
|
||||||
|
box = Checkbutton(frame,
|
||||||
|
variable=var, text=name,
|
||||||
|
offvalue=0, onvalue=val,
|
||||||
|
command=self.recompile)
|
||||||
|
box.pack(side=LEFT)
|
||||||
|
self.boxes.append(box)
|
||||||
|
self.vars.append(var)
|
||||||
|
|
||||||
|
def getflags(self):
|
||||||
|
flags = 0
|
||||||
|
for var in self.vars:
|
||||||
|
flags = flags | var.get()
|
||||||
|
flags = flags
|
||||||
|
return flags
|
||||||
|
|
||||||
|
def recompile(self, event=None):
|
||||||
|
try:
|
||||||
|
self.compiled = re.compile(self.regexdisplay.get(),
|
||||||
|
self.getflags())
|
||||||
|
bg = self.promptdisplay['background']
|
||||||
|
self.statusdisplay.config(text="", background=bg)
|
||||||
|
except re.error, msg:
|
||||||
|
self.compiled = None
|
||||||
|
self.statusdisplay.config(
|
||||||
|
text="re.error: %s" % str(msg),
|
||||||
|
background="red")
|
||||||
|
self.reevaluate()
|
||||||
|
|
||||||
|
def reevaluate(self, event=None):
|
||||||
|
try:
|
||||||
|
self.stringdisplay.tag_remove("hit", "1.0", END)
|
||||||
|
except TclError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
self.stringdisplay.tag_remove("hit0", "1.0", END)
|
||||||
|
except TclError:
|
||||||
|
pass
|
||||||
|
self.grouplist.delete(0, END)
|
||||||
|
if not self.compiled:
|
||||||
|
return
|
||||||
|
self.stringdisplay.tag_configure("hit", background="yellow")
|
||||||
|
self.stringdisplay.tag_configure("hit0", background="orange")
|
||||||
|
text = self.stringdisplay.get("1.0", END)
|
||||||
|
last = 0
|
||||||
|
nmatches = 0
|
||||||
|
while last <= len(text):
|
||||||
|
m = self.compiled.search(text, last)
|
||||||
|
if m is None:
|
||||||
|
break
|
||||||
|
first, last = m.span()
|
||||||
|
if last == first:
|
||||||
|
last = first+1
|
||||||
|
tag = "hit0"
|
||||||
|
else:
|
||||||
|
tag = "hit"
|
||||||
|
pfirst = "1.0 + %d chars" % first
|
||||||
|
plast = "1.0 + %d chars" % last
|
||||||
|
self.stringdisplay.tag_add(tag, pfirst, plast)
|
||||||
|
if nmatches == 0:
|
||||||
|
self.stringdisplay.yview_pickplace(pfirst)
|
||||||
|
groups = list(m.groups())
|
||||||
|
groups.insert(0, m.group())
|
||||||
|
for i in range(len(groups)):
|
||||||
|
g = "%2d: %s" % (i, `groups[i]`)
|
||||||
|
self.grouplist.insert(END, g)
|
||||||
|
nmatches = nmatches + 1
|
||||||
|
if self.showvar.get() == "first":
|
||||||
|
break
|
||||||
|
|
||||||
|
if nmatches == 0:
|
||||||
|
self.statusdisplay.config(text="(no match)",
|
||||||
|
background="yellow")
|
||||||
|
else:
|
||||||
|
self.statusdisplay.config(text="")
|
||||||
|
|
||||||
|
|
||||||
# Main function, run when invoked as a stand-alone Python program.
|
# Main function, run when invoked as a stand-alone Python program.
|
||||||
|
|
|
@ -7,23 +7,23 @@
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
files = sys.argv[1:]
|
files = sys.argv[1:]
|
||||||
suffixes = {}
|
suffixes = {}
|
||||||
for file in files:
|
for file in files:
|
||||||
suff = getsuffix(file)
|
suff = getsuffix(file)
|
||||||
if not suffixes.has_key(suff):
|
if not suffixes.has_key(suff):
|
||||||
suffixes[suff] = []
|
suffixes[suff] = []
|
||||||
suffixes[suff].append(file)
|
suffixes[suff].append(file)
|
||||||
keys = suffixes.keys()
|
keys = suffixes.keys()
|
||||||
keys.sort()
|
keys.sort()
|
||||||
for suff in keys:
|
for suff in keys:
|
||||||
print `suff`, len(suffixes[suff])
|
print `suff`, len(suffixes[suff])
|
||||||
|
|
||||||
def getsuffix(file):
|
def getsuffix(file):
|
||||||
suff = ''
|
suff = ''
|
||||||
for i in range(len(file)):
|
for i in range(len(file)):
|
||||||
if file[i] == '.':
|
if file[i] == '.':
|
||||||
suff = file[i:]
|
suff = file[i:]
|
||||||
return suff
|
return suff
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -25,73 +25,73 @@ StringType = type('')
|
||||||
FileType = type(sys.stdin)
|
FileType = type(sys.stdin)
|
||||||
|
|
||||||
def sum(*files):
|
def sum(*files):
|
||||||
sts = 0
|
sts = 0
|
||||||
if files and type(files[-1]) == FileType:
|
if files and type(files[-1]) == FileType:
|
||||||
out, files = files[-1], files[:-1]
|
out, files = files[-1], files[:-1]
|
||||||
else:
|
else:
|
||||||
out = sys.stdout
|
out = sys.stdout
|
||||||
if len(files) == 1 and type(files[0]) != StringType:
|
if len(files) == 1 and type(files[0]) != StringType:
|
||||||
files = files[0]
|
files = files[0]
|
||||||
for f in files:
|
for f in files:
|
||||||
if type(f) == StringType:
|
if type(f) == StringType:
|
||||||
if f == '-':
|
if f == '-':
|
||||||
sts = printsumfp(sys.stdin, '<stdin>', out) or sts
|
sts = printsumfp(sys.stdin, '<stdin>', out) or sts
|
||||||
else:
|
else:
|
||||||
sts = printsum(f, out) or sts
|
sts = printsum(f, out) or sts
|
||||||
else:
|
else:
|
||||||
sts = sum(f, out) or sts
|
sts = sum(f, out) or sts
|
||||||
return sts
|
return sts
|
||||||
|
|
||||||
def printsum(file, out = sys.stdout):
|
def printsum(file, out = sys.stdout):
|
||||||
try:
|
try:
|
||||||
fp = open(file, rmode)
|
fp = open(file, rmode)
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
sys.stderr.write('%s: Can\'t open: %s\n' % (file, msg))
|
sys.stderr.write('%s: Can\'t open: %s\n' % (file, msg))
|
||||||
return 1
|
return 1
|
||||||
if fnfilter:
|
if fnfilter:
|
||||||
file = fnfilter(file)
|
file = fnfilter(file)
|
||||||
sts = printsumfp(fp, file, out)
|
sts = printsumfp(fp, file, out)
|
||||||
fp.close()
|
fp.close()
|
||||||
return sts
|
return sts
|
||||||
|
|
||||||
def printsumfp(fp, file, out = sys.stdout):
|
def printsumfp(fp, file, out = sys.stdout):
|
||||||
m = md5.md5()
|
m = md5.md5()
|
||||||
try:
|
try:
|
||||||
while 1:
|
while 1:
|
||||||
data = fp.read(bufsize)
|
data = fp.read(bufsize)
|
||||||
if not data: break
|
if not data: break
|
||||||
m.update(data)
|
m.update(data)
|
||||||
except IOError, msg:
|
except IOError, msg:
|
||||||
sys.stderr.write('%s: I/O error: %s\n' % (file, msg))
|
sys.stderr.write('%s: I/O error: %s\n' % (file, msg))
|
||||||
return 1
|
return 1
|
||||||
out.write('%s %s\n' % (hexify(m.digest()), file))
|
out.write('%s %s\n' % (hexify(m.digest()), file))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def hexify(s):
|
def hexify(s):
|
||||||
res = ''
|
res = ''
|
||||||
for c in s:
|
for c in s:
|
||||||
res = res + '%02x' % ord(c)
|
res = res + '%02x' % ord(c)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def main(args = sys.argv[1:], out = sys.stdout):
|
def main(args = sys.argv[1:], out = sys.stdout):
|
||||||
global fnfilter, rmode, bufsize
|
global fnfilter, rmode, bufsize
|
||||||
import getopt
|
import getopt
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(args, 'blts:')
|
opts, args = getopt.getopt(args, 'blts:')
|
||||||
except getopt.error, msg:
|
except getopt.error, msg:
|
||||||
sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage))
|
sys.stderr.write('%s: %s\n%s' % (sys.argv[0], msg, usage))
|
||||||
return 2
|
return 2
|
||||||
for o, a in opts:
|
for o, a in opts:
|
||||||
if o == '-l':
|
if o == '-l':
|
||||||
fnfilter = os.path.basename
|
fnfilter = os.path.basename
|
||||||
if o == '-b':
|
if o == '-b':
|
||||||
rmode = 'rb'
|
rmode = 'rb'
|
||||||
if o == '-t':
|
if o == '-t':
|
||||||
rmode = 'r'
|
rmode = 'r'
|
||||||
if o == '-s':
|
if o == '-s':
|
||||||
bufsize = string.atoi(a)
|
bufsize = string.atoi(a)
|
||||||
if not args: args = ['-']
|
if not args: args = ['-']
|
||||||
return sum(args, out)
|
return sum(args, out)
|
||||||
|
|
||||||
if __name__ == '__main__' or __name__ == sys.argv[0]:
|
if __name__ == '__main__' or __name__ == sys.argv[0]:
|
||||||
sys.exit(main(sys.argv[1:], sys.stdout))
|
sys.exit(main(sys.argv[1:], sys.stdout))
|
||||||
|
|
|
@ -46,13 +46,13 @@ blprog = re.compile('^[ \t]*$') # Blank line
|
||||||
kwprog = re.compile('@[a-z]+') # Keyword (embedded, usually
|
kwprog = re.compile('@[a-z]+') # Keyword (embedded, usually
|
||||||
# with {} args)
|
# with {} args)
|
||||||
spprog = re.compile('[\n@{}&<>]') # Special characters in
|
spprog = re.compile('[\n@{}&<>]') # Special characters in
|
||||||
# running text
|
# running text
|
||||||
#
|
#
|
||||||
# menu item (Yuck!)
|
# menu item (Yuck!)
|
||||||
miprog = re.compile('^\* ([^:]*):(:|[ \t]*([^\t,\n.]+)([^ \t\n]*))[ \t\n]*')
|
miprog = re.compile('^\* ([^:]*):(:|[ \t]*([^\t,\n.]+)([^ \t\n]*))[ \t\n]*')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class HTMLNode:
|
class HTMLNode:
|
||||||
"""Some of the parser's functionality is separated into this class.
|
"""Some of the parser's functionality is separated into this class.
|
||||||
|
|
||||||
|
@ -1568,7 +1568,7 @@ def test():
|
||||||
print_headers = 0
|
print_headers = 0
|
||||||
cont = 0
|
cont = 0
|
||||||
html3 = 0
|
html3 = 0
|
||||||
|
|
||||||
while sys.argv[1:2] == ['-d']:
|
while sys.argv[1:2] == ['-d']:
|
||||||
debugging = debugging + 1
|
debugging = debugging + 1
|
||||||
del sys.argv[1:2]
|
del sys.argv[1:2]
|
||||||
|
|
|
@ -261,7 +261,7 @@ def find_executable_linenos(filename):
|
||||||
# The only way I know to find line numbers is to look for the
|
# The only way I know to find line numbers is to look for the
|
||||||
# SET_LINENO instructions. Isn't there some way to get it from
|
# SET_LINENO instructions. Isn't there some way to get it from
|
||||||
# the AST?
|
# the AST?
|
||||||
|
|
||||||
return _find_LINENO(code)
|
return _find_LINENO(code)
|
||||||
|
|
||||||
### XXX because os.path.commonprefix seems broken by my way of thinking...
|
### XXX because os.path.commonprefix seems broken by my way of thinking...
|
||||||
|
@ -279,7 +279,7 @@ def commonprefix(dirs):
|
||||||
if i == 0: return ''
|
if i == 0: return ''
|
||||||
break
|
break
|
||||||
return os.sep.join(prefix)
|
return os.sep.join(prefix)
|
||||||
|
|
||||||
def create_results_log(results, dirname = ".", show_missing = 1,
|
def create_results_log(results, dirname = ".", show_missing = 1,
|
||||||
save_counts = 0):
|
save_counts = 0):
|
||||||
import re
|
import re
|
||||||
|
@ -297,7 +297,7 @@ def create_results_log(results, dirname = ".", show_missing = 1,
|
||||||
results.update(results.__class__(counts, modules))
|
results.update(results.__class__(counts, modules))
|
||||||
except IOError:
|
except IOError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# there are many places where this is insufficient, like a blank
|
# there are many places where this is insufficient, like a blank
|
||||||
# line embedded in a multiline string.
|
# line embedded in a multiline string.
|
||||||
blank = re.compile(r'^\s*(#.*)?$')
|
blank = re.compile(r'^\s*(#.*)?$')
|
||||||
|
@ -307,7 +307,7 @@ def create_results_log(results, dirname = ".", show_missing = 1,
|
||||||
tfdir = tempfile.gettempdir()
|
tfdir = tempfile.gettempdir()
|
||||||
for key in per_file.keys():
|
for key in per_file.keys():
|
||||||
filename = key
|
filename = key
|
||||||
|
|
||||||
# skip some "files" we don't care about...
|
# skip some "files" we don't care about...
|
||||||
if filename == "<string>":
|
if filename == "<string>":
|
||||||
continue
|
continue
|
||||||
|
@ -484,7 +484,7 @@ class Trace:
|
||||||
print '%s(%d): ??' % (modulename, lineno)
|
print '%s(%d): ??' % (modulename, lineno)
|
||||||
|
|
||||||
return self.trace
|
return self.trace
|
||||||
|
|
||||||
|
|
||||||
def _err_exit(msg):
|
def _err_exit(msg):
|
||||||
sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
|
sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
|
||||||
|
|
|
@ -17,7 +17,7 @@ entry in the master tree are synchronized. This means:
|
||||||
copy the slave to the master
|
copy the slave to the master
|
||||||
else (the master is newer):
|
else (the master is newer):
|
||||||
copy the master to the slave
|
copy the master to the slave
|
||||||
|
|
||||||
normalizing the slave means replacing CRLF with LF when the master
|
normalizing the slave means replacing CRLF with LF when the master
|
||||||
doesn't use CRLF
|
doesn't use CRLF
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ def main():
|
||||||
print "slavedir masterdir"
|
print "slavedir masterdir"
|
||||||
return
|
return
|
||||||
process(slave, master)
|
process(slave, master)
|
||||||
|
|
||||||
def process(slave, master):
|
def process(slave, master):
|
||||||
cvsdir = os.path.join(master, "CVS")
|
cvsdir = os.path.join(master, "CVS")
|
||||||
if not os.path.isdir(cvsdir):
|
if not os.path.isdir(cvsdir):
|
||||||
|
|
|
@ -11,7 +11,7 @@ import sys, os, string
|
||||||
from stat import *
|
from stat import *
|
||||||
|
|
||||||
def msg(str):
|
def msg(str):
|
||||||
sys.stderr.write(str + '\n')
|
sys.stderr.write(str + '\n')
|
||||||
|
|
||||||
pathlist = string.splitfields(os.environ['PATH'], ':')
|
pathlist = string.splitfields(os.environ['PATH'], ':')
|
||||||
|
|
||||||
|
@ -19,38 +19,38 @@ sts = 0
|
||||||
longlist = ''
|
longlist = ''
|
||||||
|
|
||||||
if sys.argv[1:] and sys.argv[1][:2] == '-l':
|
if sys.argv[1:] and sys.argv[1][:2] == '-l':
|
||||||
longlist = sys.argv[1]
|
longlist = sys.argv[1]
|
||||||
del sys.argv[1]
|
del sys.argv[1]
|
||||||
|
|
||||||
for prog in sys.argv[1:]:
|
for prog in sys.argv[1:]:
|
||||||
ident = ()
|
ident = ()
|
||||||
for dir in pathlist:
|
for dir in pathlist:
|
||||||
file = os.path.join(dir, prog)
|
file = os.path.join(dir, prog)
|
||||||
try:
|
try:
|
||||||
st = os.stat(file)
|
st = os.stat(file)
|
||||||
except os.error:
|
except os.error:
|
||||||
continue
|
continue
|
||||||
if not S_ISREG(st[ST_MODE]):
|
if not S_ISREG(st[ST_MODE]):
|
||||||
msg(file + ': not a disk file')
|
msg(file + ': not a disk file')
|
||||||
else:
|
else:
|
||||||
mode = S_IMODE(st[ST_MODE])
|
mode = S_IMODE(st[ST_MODE])
|
||||||
if mode & 0111:
|
if mode & 0111:
|
||||||
if not ident:
|
if not ident:
|
||||||
print file
|
print file
|
||||||
ident = st[:3]
|
ident = st[:3]
|
||||||
else:
|
else:
|
||||||
if st[:3] == ident:
|
if st[:3] == ident:
|
||||||
s = 'same as: '
|
s = 'same as: '
|
||||||
else:
|
else:
|
||||||
s = 'also: '
|
s = 'also: '
|
||||||
msg(s + file)
|
msg(s + file)
|
||||||
else:
|
else:
|
||||||
msg(file + ': not executable')
|
msg(file + ': not executable')
|
||||||
if longlist:
|
if longlist:
|
||||||
sts = os.system('ls ' + longlist + ' ' + file)
|
sts = os.system('ls ' + longlist + ' ' + file)
|
||||||
if sts: msg('"ls -l" exit status: ' + `sts`)
|
if sts: msg('"ls -l" exit status: ' + `sts`)
|
||||||
if not ident:
|
if not ident:
|
||||||
msg(prog + ': not found')
|
msg(prog + ': not found')
|
||||||
sts = 1
|
sts = 1
|
||||||
|
|
||||||
sys.exit(sts)
|
sys.exit(sts)
|
||||||
|
|
|
@ -16,102 +16,102 @@ EXECMAGIC = '\001\140\000\010'
|
||||||
MAXSIZE = 200*1024 # Files this big must be binaries and are skipped.
|
MAXSIZE = 200*1024 # Files this big must be binaries and are skipped.
|
||||||
|
|
||||||
def getargs():
|
def getargs():
|
||||||
args = sys.argv[1:]
|
args = sys.argv[1:]
|
||||||
if args:
|
if args:
|
||||||
return args
|
return args
|
||||||
print 'No arguments, checking almost *, in "ls -t" order'
|
print 'No arguments, checking almost *, in "ls -t" order'
|
||||||
list = []
|
list = []
|
||||||
for file in os.listdir(os.curdir):
|
for file in os.listdir(os.curdir):
|
||||||
if not skipfile(file):
|
if not skipfile(file):
|
||||||
list.append((getmtime(file), file))
|
list.append((getmtime(file), file))
|
||||||
list.sort()
|
list.sort()
|
||||||
if not list:
|
if not list:
|
||||||
print 'Nothing to do -- exit 1'
|
print 'Nothing to do -- exit 1'
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
list.sort()
|
list.sort()
|
||||||
list.reverse()
|
list.reverse()
|
||||||
for mtime, file in list: args.append(file)
|
for mtime, file in list: args.append(file)
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def getmtime(file):
|
def getmtime(file):
|
||||||
try:
|
try:
|
||||||
st = os.stat(file)
|
st = os.stat(file)
|
||||||
return st[ST_MTIME]
|
return st[ST_MTIME]
|
||||||
except os.error:
|
except os.error:
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
|
badnames = ['tags', 'TAGS', 'xyzzy', 'nohup.out', 'core']
|
||||||
badprefixes = ['.', ',', '@', '#', 'o.']
|
badprefixes = ['.', ',', '@', '#', 'o.']
|
||||||
badsuffixes = \
|
badsuffixes = \
|
||||||
['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \
|
['~', '.a', '.o', '.old', '.bak', '.orig', '.new', '.prev', '.not', \
|
||||||
'.pyc', '.fdc', '.rgb', '.elc', ',v']
|
'.pyc', '.fdc', '.rgb', '.elc', ',v']
|
||||||
ignore = []
|
ignore = []
|
||||||
|
|
||||||
def setup():
|
def setup():
|
||||||
ignore[:] = badnames
|
ignore[:] = badnames
|
||||||
for p in badprefixes:
|
for p in badprefixes:
|
||||||
ignore.append(p + '*')
|
ignore.append(p + '*')
|
||||||
for p in badsuffixes:
|
for p in badsuffixes:
|
||||||
ignore.append('*' + p)
|
ignore.append('*' + p)
|
||||||
try:
|
try:
|
||||||
f = open('.xxcign', 'r')
|
f = open('.xxcign', 'r')
|
||||||
except IOError:
|
except IOError:
|
||||||
return
|
return
|
||||||
ignore[:] = ignore + string.split(f.read())
|
ignore[:] = ignore + string.split(f.read())
|
||||||
|
|
||||||
def skipfile(file):
|
def skipfile(file):
|
||||||
for p in ignore:
|
for p in ignore:
|
||||||
if fnmatch.fnmatch(file, p): return 1
|
if fnmatch.fnmatch(file, p): return 1
|
||||||
try:
|
try:
|
||||||
st = os.lstat(file)
|
st = os.lstat(file)
|
||||||
except os.error:
|
except os.error:
|
||||||
return 1 # Doesn't exist -- skip it
|
return 1 # Doesn't exist -- skip it
|
||||||
# Skip non-plain files.
|
# Skip non-plain files.
|
||||||
if not S_ISREG(st[ST_MODE]): return 1
|
if not S_ISREG(st[ST_MODE]): return 1
|
||||||
# Skip huge files -- probably binaries.
|
# Skip huge files -- probably binaries.
|
||||||
if st[ST_SIZE] >= MAXSIZE: return 1
|
if st[ST_SIZE] >= MAXSIZE: return 1
|
||||||
# Skip executables
|
# Skip executables
|
||||||
try:
|
try:
|
||||||
data = open(file, 'r').read(len(EXECMAGIC))
|
data = open(file, 'r').read(len(EXECMAGIC))
|
||||||
if data == EXECMAGIC: return 1
|
if data == EXECMAGIC: return 1
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def badprefix(file):
|
def badprefix(file):
|
||||||
for bad in badprefixes:
|
for bad in badprefixes:
|
||||||
if file[:len(bad)] == bad: return 1
|
if file[:len(bad)] == bad: return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def badsuffix(file):
|
def badsuffix(file):
|
||||||
for bad in badsuffixes:
|
for bad in badsuffixes:
|
||||||
if file[-len(bad):] == bad: return 1
|
if file[-len(bad):] == bad: return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def go(args):
|
def go(args):
|
||||||
for file in args:
|
for file in args:
|
||||||
print file + ':'
|
print file + ':'
|
||||||
if differing(file):
|
if differing(file):
|
||||||
showdiffs(file)
|
showdiffs(file)
|
||||||
if askyesno('Check in ' + file + ' ? '):
|
if askyesno('Check in ' + file + ' ? '):
|
||||||
sts = os.system('rcs -l ' + file) # ignored
|
sts = os.system('rcs -l ' + file) # ignored
|
||||||
sts = os.system('ci -l ' + file)
|
sts = os.system('ci -l ' + file)
|
||||||
|
|
||||||
def differing(file):
|
def differing(file):
|
||||||
cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file
|
cmd = 'co -p ' + file + ' 2>/dev/null | cmp -s - ' + file
|
||||||
sts = os.system(cmd)
|
sts = os.system(cmd)
|
||||||
return sts != 0
|
return sts != 0
|
||||||
|
|
||||||
def showdiffs(file):
|
def showdiffs(file):
|
||||||
cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}'
|
cmd = 'rcsdiff ' + file + ' 2>&1 | ${PAGER-more}'
|
||||||
sts = os.system(cmd)
|
sts = os.system(cmd)
|
||||||
|
|
||||||
def askyesno(prompt):
|
def askyesno(prompt):
|
||||||
s = raw_input(prompt)
|
s = raw_input(prompt)
|
||||||
return s in ['y', 'yes']
|
return s in ['y', 'yes']
|
||||||
|
|
||||||
try:
|
try:
|
||||||
setup()
|
setup()
|
||||||
go(getargs())
|
go(getargs())
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print '[Intr]'
|
print '[Intr]'
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue