]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Initial revision
authorGuido van Rossum <guido@python.org>
Mon, 2 Mar 1992 16:20:32 +0000 (16:20 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 2 Mar 1992 16:20:32 +0000 (16:20 +0000)
Demo/scripts/wh.py [new file with mode: 0755]
Tools/scripts/dutree.doc [new file with mode: 0644]
Tools/scripts/dutree.py [new file with mode: 0755]
Tools/scripts/h2py.py [new file with mode: 0755]
Tools/scripts/linktree.py [new file with mode: 0755]
Tools/scripts/lll.py [new file with mode: 0755]

diff --git a/Demo/scripts/wh.py b/Demo/scripts/wh.py
new file mode 100755 (executable)
index 0000000..b9b09ef
--- /dev/null
@@ -0,0 +1,2 @@
+# This is here so I can use 'wh' instead of 'which' in '~/bin/generic_python'
+import which
diff --git a/Tools/scripts/dutree.doc b/Tools/scripts/dutree.doc
new file mode 100644 (file)
index 0000000..2a09426
--- /dev/null
@@ -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 (executable)
index 0000000..c309212
--- /dev/null
@@ -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 (executable)
index 0000000..ff2afc2
--- /dev/null
@@ -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 (executable)
index 0000000..5a66507
--- /dev/null
@@ -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 (executable)
index 0000000..509936d
--- /dev/null
@@ -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)