summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1992-03-02 16:20:32 (GMT)
committerGuido van Rossum <guido@python.org>1992-03-02 16:20:32 (GMT)
commit2ba9f30489326dcaea8e0c1fdc395805fb618c97 (patch)
treed360c7225310833094e7dc40be5289f9d95ea3e9 /Tools
parentbecdad3d5e512b08e0dd5994ac7c7ec3e6f84ebc (diff)
downloadcpython-2ba9f30489326dcaea8e0c1fdc395805fb618c97.zip
cpython-2ba9f30489326dcaea8e0c1fdc395805fb618c97.tar.gz
cpython-2ba9f30489326dcaea8e0c1fdc395805fb618c97.tar.bz2
Initial revision
Diffstat (limited to 'Tools')
-rw-r--r--Tools/scripts/dutree.doc54
-rwxr-xr-xTools/scripts/dutree.py52
-rwxr-xr-xTools/scripts/h2py.py50
-rwxr-xr-xTools/scripts/linktree.py76
-rwxr-xr-xTools/scripts/lll.py25
5 files changed, 257 insertions, 0 deletions
diff --git a/Tools/scripts/dutree.doc b/Tools/scripts/dutree.doc
new file mode 100644
index 0000000..2a09426
--- /dev/null
+++ b/Tools/scripts/dutree.doc
@@ -0,0 +1,54 @@
+Path: cwi.nl!sun4nl!mcsun!uunet!cs.utexas.edu!convex!usenet
+From: tchrist@convex.COM (Tom Christiansen)
+Newsgroups: comp.lang.perl
+Subject: Re: The problems of Perl (Re: Question (silly?))
+Message-ID: <1992Jan17.053115.4220@convex.com>
+Date: 17 Jan 92 05:31:15 GMT
+References: <17458@ector.cs.purdue.edu> <1992Jan16.165347.25583@cherokee.uswest.com> <=#Hues+4@cs.psu.edu>
+Sender: usenet@convex.com (news access account)
+Reply-To: tchrist@convex.COM (Tom Christiansen)
+Organization: CONVEX Realtime Development, Colorado Springs, CO
+Lines: 83
+Nntp-Posting-Host: pixel.convex.com
+
+From the keyboard of flee@cs.psu.edu (Felix Lee):
+:And Perl is definitely awkward with data types. I haven't yet found a
+:pleasant way of shoving non-trivial data types into Perl's grammar.
+
+Yes, it's pretty aweful at that, alright. Sometimes I write perl programs
+that need them, and sometimes it just takes a little creativity. But
+sometimes it's not worth it. I actually wrote a C program the other day
+(gasp) because I didn't want to deal with a game matrix with six links per node.
+
+:Here's a very simple problem that's tricky to express in Perl: process
+:the output of "du" to produce output that's indented to reflect the
+:tree structure, and with each subtree sorted by size. Something like:
+: 434 /etc
+: | 344 .
+: | 50 install
+: | 35 uucp
+: | 3 nserve
+: | | 2 .
+: | | 1 auth.info
+: | 1 sm
+: | 1 sm.bak
+
+At first I thought I could just keep one local list around
+at once, but this seems inherently recursive. Which means
+I need an real recursive data structure. Maybe you could
+do it with one of the %assoc arrays Larry uses in the begat
+programs, but I broke down and got dirty. I think the hardest
+part was matching Felix's desired output exactly. It's not
+blazingly fast: I should probably inline the &childof routine,
+but it *was* faster to write than I could have written the
+equivalent C program.
+
+
+--tom
+
+--
+"GUIs normally make it simple to accomplish simple actions and impossible
+to accomplish complex actions." --Doug Gwyn (22/Jun/91 in comp.unix.wizards)
+
+ Tom Christiansen tchrist@convex.com convex!tchrist
+
diff --git a/Tools/scripts/dutree.py b/Tools/scripts/dutree.py
new file mode 100755
index 0000000..c309212
--- /dev/null
+++ b/Tools/scripts/dutree.py
@@ -0,0 +1,52 @@
+#! /usr/local/python
+# Format du output in a tree shape
+
+import posix, string, sys, path
+
+def main():
+ p = posix.popen('du ' + string.join(sys.argv[1:]), 'r')
+ total, d = None, {}
+ for line in p.readlines():
+ [num, file] = string.split(line)
+ size = eval(num)
+ comps = string.splitfields(file, '/')
+ if comps[0] == '': comps[0] = '/'
+ if comps[len(comps)-1] == '': del comps[len(comps)-1]
+ total, d = store(size, comps, total, d)
+ display(total, d)
+
+def store(size, comps, total, d):
+ if comps == []:
+ return size, d
+ if not d.has_key(comps[0]):
+ d[comps[0]] = None, {}
+ t1, d1 = d[comps[0]]
+ d[comps[0]] = store(size, comps[1:], t1, d1)
+ return total, d
+
+def display(total, d):
+ show(total, d, '')
+
+def show(total, d, prefix):
+ if not d: return
+ list = []
+ sum = 0
+ for key in d.keys():
+ tsub, dsub = d[key]
+ list.append((tsub, key))
+ if tsub is not None: sum = sum + tsub
+ if sum < total:
+ list.append((total - sum, '.'))
+ list.sort()
+ list.reverse()
+ width = len(`list[0][0]`)
+ for tsub, key in list:
+ if tsub is None:
+ psub = prefix
+ else:
+ print prefix + string.rjust(`tsub`, width) + ' ' + key
+ psub = prefix + ' '*(width-1) + '|' + ' '*(len(key)+1)
+ if d.has_key(key):
+ show(tsub, d[key][1], psub)
+
+main()
diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py
new file mode 100755
index 0000000..ff2afc2
--- /dev/null
+++ b/Tools/scripts/h2py.py
@@ -0,0 +1,50 @@
+#! /ufs/guido/bin/sgi/python
+#! /usr/local/python
+
+# Read #define's from stdin and translate to Python code on stdout.
+# Very primitive: non-#define's are ignored, no check for valid Python
+# syntax is made -- you will have to edit the output in most cases.
+
+# XXX To do:
+# - accept filename arguments
+# - turn trailing C comments into Python comments
+# - turn C string quotes into Python comments
+# - turn C Boolean operators "&& || !" into Python "and or not"
+# - what to do about #if(def)?
+# - what to do about macros with parameters?
+# - reject definitions with semicolons in them
+
+import sys, regex, string
+
+p_define = regex.compile('^#[\t ]*define[\t ]+\([a-zA-Z0-9_]+\)[\t ]+')
+
+p_comment = regex.compile('/\*\([^*]+\|\*+[^/]\)*\*+/')
+
+def main():
+ process(sys.stdin)
+
+def process(fp):
+ lineno = 0
+ while 1:
+ line = fp.readline()
+ if not line: break
+ lineno = lineno + 1
+ if p_define.match(line) >= 0:
+ # gobble up continuation lines
+ while line[-2:] == '\\\n':
+ nextline = fp.readline()
+ if not nextline: break
+ lineno = lineno + 1
+ line = line + nextline
+ regs = p_define.regs
+ a, b = regs[1] # where the macro name is
+ name = line[a:b]
+ a, b = regs[0] # the whole match
+ body = line[b:]
+ # replace comments by spaces
+ while p_comment.search(body) >= 0:
+ a, b = p_comment.regs[0]
+ body = body[:a] + ' ' + body[b:]
+ print name, '=', string.strip(body)
+
+main()
diff --git a/Tools/scripts/linktree.py b/Tools/scripts/linktree.py
new file mode 100755
index 0000000..5a66507
--- /dev/null
+++ b/Tools/scripts/linktree.py
@@ -0,0 +1,76 @@
+#! /usr/local/python
+
+# linktree
+#
+# Make a copy of a directory tree with symbolic links to all files in the
+# original tree.
+# All symbolic links go to a special symbolic link at the top, so you
+# can easily fix things if the original source tree moves.
+# See also "mkreal".
+#
+# usage: mklinks oldtree newtree
+
+import sys, posix, path
+
+LINK = '.LINK' # Name of special symlink at the top.
+
+debug = 0
+
+def main():
+ if not 3 <= len(sys.argv) <= 4:
+ print 'usage:', sys.argv[0], 'oldtree newtree [linkto]'
+ return 2
+ oldtree, newtree = sys.argv[1], sys.argv[2]
+ if len(sys.argv) > 3:
+ link = sys.argv[3]
+ link_may_fail = 1
+ else:
+ link = LINK
+ link_may_fail = 0
+ if not path.isdir(oldtree):
+ print oldtree + ': not a directory'
+ return 1
+ try:
+ posix.mkdir(newtree, 0777)
+ except posix.error, msg:
+ print newtree + ': cannot mkdir:', msg
+ return 1
+ linkname = path.cat(newtree, link)
+ try:
+ posix.symlink(path.cat('..', oldtree), linkname)
+ except posix.error, msg:
+ if not link_may_fail:
+ print linkname + ': cannot symlink:', msg
+ return 1
+ else:
+ print linkname + ': warning: cannot symlink:', msg
+ linknames(oldtree, newtree, link)
+ return 0
+
+def linknames(old, new, link):
+ if debug: print 'linknames', (old, new, link)
+ try:
+ names = posix.listdir(old)
+ except posix.error, msg:
+ print old + ': warning: cannot listdir:', msg
+ return
+ for name in names:
+ if name not in ('.', '..'):
+ oldname = path.cat(old, name)
+ linkname = path.cat(link, name)
+ newname = path.cat(new, name)
+ if debug > 1: print oldname, newname, linkname
+ if path.isdir(oldname) and not path.islink(oldname):
+ try:
+ posix.mkdir(newname, 0777)
+ ok = 1
+ except:
+ print newname + ': warning: cannot mkdir:', msg
+ ok = 0
+ if ok:
+ linkname = path.cat('..', linkname)
+ linknames(oldname, newname, linkname)
+ else:
+ posix.symlink(linkname, newname)
+
+sys.exit(main())
diff --git a/Tools/scripts/lll.py b/Tools/scripts/lll.py
new file mode 100755
index 0000000..509936d
--- /dev/null
+++ b/Tools/scripts/lll.py
@@ -0,0 +1,25 @@
+#! /usr/local/python
+
+# Find symbolic links and show where they point to.
+# Arguments are directories to search; default is current directory.
+# No recursion.
+# (This is a totally different program from "findsymlinks.py"!)
+
+import sys, posix, path
+
+def lll(dirname):
+ for name in posix.listdir(dirname):
+ if name not in ['.', '..']:
+ full = path.join(dirname, name)
+ if path.islink(full):
+ print name, '->', posix.readlink(full)
+
+args = sys.argv[1:]
+if not args: args = ['.']
+first = 1
+for arg in args:
+ if len(args) > 1:
+ if not first: print
+ first = 0
+ print arg + ':'
+ lll(arg)