guido@cwi.nl (Guido van Rossum) (02/20/91)
: This is a shell archive. : Extract with 'sh this_file'. : : Extract part 01 first since it makes all directories echo 'Start of pack.out, part 21 out of 21:' if test -s 'demo/README' then echo '*** I will not over-write existing file demo/README' else echo 'x - demo/README' sed 's/^X//' > 'demo/README' << 'EOF' XThis directory contains various demonstrations of what you can do with XPython. The demos are grouped sub(sub*)directories according to Xrequired optional built-in modules. X Xscripts Some useful Python scripts that I put in my bin X directory. No optional built-in modules meeded. X Xsgi Demos that only run on Silicon Graphics machines. X Require the built-in modules 'audio' and/or 'gl'. X Xstdwin Demos that use the STDWIN library. Require the 'stdwin' X built-in module. X XWARNING: some scripts are executable and have a first line saying X X #! /ufs/guido/bin/sgi/python X XThis is unlikely to give good results anywhere else except in my Xoffice. Edit the first line before installing such scripts; to try Xthem out, you can just say "python file.py". (The .py suffix is not Xnecessary in this case, but makes it possible to debug the modules Xinteractively by importing them.) EOF fi if test -s 'demo/scripts/findlinksto.py' then echo '*** I will not over-write existing file demo/scripts/findlinksto.py' else echo 'x - demo/scripts/findlinksto.py' sed 's/^X//' > 'demo/scripts/findlinksto.py' << 'EOF' X#! /ufs/guido/bin/sgi/python X X# findlinksto X# X# find symbolic links to a given path X Ximport posix, path, sys X Xdef visit(pattern, dirname, names): X if path.islink(dirname): X names[:] = [] X return X if path.ismount(dirname): X print 'descend into', dirname X n = len(pattern) X for name in names: X name = path.cat(dirname, name) X try: X linkto = posix.readlink(name) X if linkto[:n] = pattern: X print name, '->', linkto X except posix.error: X pass X Xdef main(pattern, args): X for dirname in args: X path.walk(dirname, visit, pattern) X Xmain(sys.argv[1], sys.argv[2:]) EOF chmod +x 'demo/scripts/findlinksto.py' fi if test -s 'demo/scripts/suff.py' then echo '*** I will not over-write existing file demo/scripts/suff.py' else echo 'x - demo/scripts/suff.py' sed 's/^X//' > 'demo/scripts/suff.py' << 'EOF' X#! /ufs/guido/bin/sgi/python X X# suff X# X# show different suffixes amongst arguments X Ximport sys X Xdef main(): X files = sys.argv[1:] X suffixes = {} X for file in files: X suff = getsuffix(file) X if not suffixes.has_key(suff): X suffixes[suff] = [] X suffixes[suff].append(file) X keys = suffixes.keys() X keys.sort() X for suff in keys: X print `suff`, len(suffixes[suff]) X Xdef getsuffix(file): X suff = '' X for i in range(len(file)): X if file[i] = '.': X suff = file[i:] X return suff X Xmain() EOF chmod +x 'demo/scripts/suff.py' fi if test -s 'demo/sgi/README' then echo '*** I will not over-write existing file demo/sgi/README' else echo 'x - demo/sgi/README' sed 's/^X//' > 'demo/sgi/README' << 'EOF' XDemonstrations of Python that use various features of the Silicon XGraphics IRIS machines. X Xaudio Demonstrations of the audio capabilities of the 4D/25. X Require the built-in module 'audio'. X Xaudio_stdwin Window-based demonstrations the audio capabilities of X the 4D/25. Require the built-in modules 'stdwin' and X 'audio'. X Xgl Demonstrations of the Graphics Library (GL). X Require the built-in module 'gl'. X Xgl_panel Demonstrations of the Panel Library by NASA Ames. X Require the built-in modules 'gl' and 'pnl'. EOF fi if test -s 'demo/sgi/audio/README' then echo '*** I will not over-write existing file demo/sgi/audio/README' else echo 'x - demo/sgi/audio/README' sed 's/^X//' > 'demo/sgi/audio/README' << 'EOF' XPrograms that demonstrate the use of the audio device on the SGI 4D/25. XThese require the built-in module 'audio'. X Xplay Read a sound sample from a file and play it through the X speaker. Options to set volume, sampling rate etc. EOF fi if test -s 'demo/sgi/audio_stdwin/vumeter.py' then echo '*** I will not over-write existing file demo/sgi/audio_stdwin/vumeter.py' else echo 'x - demo/sgi/audio_stdwin/vumeter.py' sed 's/^X//' > 'demo/sgi/audio_stdwin/vumeter.py' << 'EOF' X#! /ufs/guido/bin/sgi/python X Ximport audio Ximport stdwin X Xfrom VUMeter import VUMeter Xfrom WindowParent import WindowParent Ximport MainLoop X XNBUFS=20 XBUFSIZE = NBUFS*48 XSCALE=128 X Xclass MyVUMeter() = VUMeter(): X def init_reactivity(self): X self.parent.need_mouse(self) X def mouse_down(self, detail): X if self.enabled: X self.stop() X else: X self.start() X def mouse_move(self, detail): pass X def mouse_up(self, detail): pass X Xdef main(): X audio.setrate(3) X audio.setoutgain(0) X w = WindowParent().create('VU Meter', (200, 100)) X v = MyVUMeter().define(w) X v.start() X w.realize() X while 1: X w.dispatch(stdwin.getevent()) X Xmain() EOF chmod +x 'demo/sgi/audio_stdwin/vumeter.py' fi if test -s 'demo/sgi/gl/README' then echo '*** I will not over-write existing file demo/sgi/gl/README' else echo 'x - demo/sgi/gl/README' sed 's/^X//' > 'demo/sgi/gl/README' << 'EOF' XThese demos run only on SGI machines and require the 'gl' built-in module. XThe demonstrate the abilities of SGI's GL library as well as the ease of XGL programming in Python. Most demos require the Z-buffer (aka X24-bitplane) option. X Xbackface Demonstrates the 'backface' GL function. X Xkites Show 3 flying kites. Demonstrates the rendering speed X obtainable by Python programs. X Xmclock A colorful clock with more options than you can X remember. Works on 8-bit machines (but allows more X colors on 24-bit machines). X Xmixing Demonstrates the effect of color mixing: through X frequent color switching it gives the effect of white X light. X Xnurbs A simple demonstration of the 'nurbs' GL functions. X Xzrgb Displays a 3-D Gouraud-shaded figure which can be moved X around with the mouse. EOF fi if test -s 'demo/sgi/gl_panel/README' then echo '*** I will not over-write existing file demo/sgi/gl_panel/README' else echo 'x - demo/sgi/gl_panel/README' sed 's/^X//' > 'demo/sgi/gl_panel/README' << 'EOF' XThis directory contains demos that use the Panel Library by NASA Ames. XThey only run on SGI machines and require the 'pnl' and 'gl' built-in Xmodules. Each subdirectory contains one demo. X Xapanel A trivial user interface to the audio capabilities of X the 4D/25 (Personal IRIS). Lets you record a sample and X play it back at different volumes. Requires the 'audio' X built-in module. X Xflying A large demonstration that can display several X differently shaped objects through space. Control X panels let you manipulate light sources, material X properties and drawing modes. X Xnurbs A demo of the capabilities of the GL 'nurbs' functions X that can display the control points. (It was intended X to let you move these as well, but there was a problem X with the mapping of mouse movements in a 3-D world.) X Xtwoview A demo of GL's transformation primitives. Two views on X a scene are given, and the position and orientation of a X viewer in one of the views can be changed through X various buttons and dials in a control panel. EOF fi if test -s 'demo/sgi/gl_panel/apanel/apanel.py' then echo '*** I will not over-write existing file demo/sgi/gl_panel/apanel/apanel.py' else echo 'x - demo/sgi/gl_panel/apanel/apanel.py' sed 's/^X//' > 'demo/sgi/gl_panel/apanel/apanel.py' << 'EOF' X#! /ufs/guido/bin/sgi/python X X# A (too) trivial control panel to record a sound sample and play it back. X# Requires the audio built-in module. X# Requires the NASA AMES Panel Library. X Ximport sys X Ximport gl Ximport panel X Xpanel.block(1) X Ximport audio X Xdef main(): X gl.foreground() X gl.noport() X #gl.prefposition(700, 850, 950, 970) X wid = gl.winopen('audio demo') X # X panels = panel.defpanellist('apanel.s') # XXX X p = panels[0] X p.playbackbutton.back = p X p.recordbutton.back = p X p.sample = '' X # X def quit(a): X sys.exit(0) X # X p.quitbutton.downfunc = quit X # X def playback(a): X p = a.back X gain = int(255.0*p.outputgain.val) X a.val = 1.0 X a.fixact() X panel.drawpanel() X audio.setoutgain(gain) X audio.write(p.sample) X audio.setoutgain(0) X a.val = 0.0 X a.fixact() X # X p.playbackbutton.downfunc = playback X # X def record(a): X p = a.back X size = int(10.0 * 8192.0 * p.recordsize.val) X a.val = 1.0 X a.fixact() X panel.drawpanel() X audio.setoutgain(0) X p.sample = audio.read(size) X a.val = 0.0 X a.fixact() X # X p.recordbutton.downfunc = record X # X while 1: X act = panel.dopanel() X Xmain() EOF chmod +x 'demo/sgi/gl_panel/apanel/apanel.py' fi if test -s 'demo/sgi/gl_panel/flying/material.py' then echo '*** I will not over-write existing file demo/sgi/gl_panel/flying/material.py' else echo 'x - demo/sgi/gl_panel/flying/material.py' sed 's/^X//' > 'demo/sgi/gl_panel/flying/material.py' << 'EOF' Ximport light X Xdef mkmatdict () : X m = {} X m['material 1'] = light.m1 X m['material 2'] = light.m2 X m['material 3'] = light.m3 X m['material 4'] = light.m4 X m['material 5'] = light.m5 X m['material 6'] = light.m6 X m['material 7'] = light.m7 X m['material 8'] = light.m8 X m['material 9'] = light.m9 X # X return m X Xmaterdict = mkmatdict () X Xdef mklichtdict () : X m = {} X m['light 1'] = light.light1 X m['light 2'] = light.light2 X # X return m X Xlichtdict = mklichtdict () EOF fi if test -s 'demo/sgi/gl_panel/flying/objdict.py' then echo '*** I will not over-write existing file demo/sgi/gl_panel/flying/objdict.py' else echo 'x - demo/sgi/gl_panel/flying/objdict.py' sed 's/^X//' > 'demo/sgi/gl_panel/flying/objdict.py' << 'EOF' X Xfrom data import * X X# X#the color light-blue X# XLightBlue = lightblue X X# the 'object' dictionary contains the strings of the menu items X# that denote the objects Xobjects = {} X X# object dictionary initialization Xobjects['sphere'] = [ZERO, o1] Xobjects['cylinder'] = [ZERO, o2] Xobjects['cube'] = [ONE, o3] Xobjects['icecream'] = [ZERO, o4] Xobjects['disk'] = [ZERO, o5] Xobjects['diamond'] = [ZERO, o6] X#objects['glass'] = [ZERO] Xobjects['pyramid'] = [ZERO, o7] Xobjects['table'] = [ZERO, o8] X X# 'putDict' sets the value of entry 'key' of dictionary 'dict' Xdef putDict(dict, key, val) : X dict[key][0] = val X X# X# 'getDict' get the contents of entry i of key 'key' X# of dictionary 'dict' X# Xdef getDict(dict, key, i) : X return dict[key][i] X X# the 'options' dictionary contains the strings of the menu items X# that denote the options Xoptions = {} X X# option dictionary initialization Xoptions['wire'] = [ZERO] Xoptions['filled'] = [ONE] EOF fi if test -s 'demo/sgi/gl_panel/twoview/topview.s' then echo '*** I will not over-write existing file demo/sgi/gl_panel/twoview/topview.s' else echo 'x - demo/sgi/gl_panel/twoview/topview.s' sed 's/^X//' > 'demo/sgi/gl_panel/twoview/topview.s' << 'EOF' X;;; This file was automatically generated by the panel editor. X;;; If you read it into gnu emacs, it will automagically format itself. X X(panel (prop help creator:user-panel-help) X(prop user-panel #t) X(label "Top View Control") X(x 1020) X(y 287) X(al (pnl_hslider (name "xpos") X(prop help creator:user-act-help) X(label "X") X(x 2) X(y 0.5) X(w 3.85) X(h 0.4) X(val 0.5) X(downfunc move-then-resize) X) X(pnl_vslider (name "zpos") X(prop help creator:user-act-help) X(label "Z") X(x 1.25) X(y 1.3) X(w 0.4) X(h 3.6) X(val 0.5) X(downfunc move-then-resize) X) X(pnl_dial (name "direction") X(prop help creator:user-act-help) X(label "looking direction") X(x 2.15) X(y 1.4) X(w 3.5) X(h 3.45) X(val 0.5) X(downfunc move-then-resize) X) X) X) X;;; Local Variables: X;;; mode: scheme X;;; eval: (save-excursion (goto-char (point-min)) (kill-line 3)) X;;; eval: (save-excursion (goto-char (point-min)) (replace-regexp "[ \n]*)" ")")) X;;; eval: (indent-region (point-min) (point-max) nil) X;;; eval: (progn (kill-line -3) (delete-backward-char 1) (save-buffer)) X;;; End: EOF fi if test -s 'doc/README' then echo '*** I will not over-write existing file doc/README' else echo 'x - doc/README' sed 's/^X//' > 'doc/README' << 'EOF' XThis directory contains the LaTeX source to the Python documentation. XThe documentation is not all finished, but good enough to get you Xstarted. X XThe following are the important latex source files: X X tut.tex A tutorial X mod.tex The library reference X XThey both read the style option file "myformat.sty". X XYou can use the Makefile to format, preview and print the documents. XType "make tut" or "make mod" to preview either document with xdvi. XType "make print" to print them both (this only works if your print Xspooler is set up just like mine...), or "make all" to create postscript Xfiles that you can you can print using your local printing commands. XType "make clean" to get rid of all the intermediate files produced by Xthe latex process, and other junk files. X XYou can just as well ignore the Makefile; all you really need is: X latex tut X latex tut X dvips tut | lpr Xand similar for the "mod" document. EOF fi if test -s 'doc/SetClass.py' then echo '*** I will not over-write existing file doc/SetClass.py' else echo 'x - doc/SetClass.py' sed 's/^X//' > 'doc/SetClass.py' << 'EOF' Xclass Set(): X def new(self): X self.elements = [] X return self X def add(self, e): X if e not in self.elements: X self.elements.append(e) X def remove(self, e): X if e in self.elements: X for i in range(len(self.elements)): X if self.elements[i] = e: X del self.elements[i] X break X def is_element(self, e): X return e in self.elements X def size(self): X return len(self.elements) EOF fi if test -s 'doc/fibo.py' then echo '*** I will not over-write existing file doc/fibo.py' else echo 'x - doc/fibo.py' sed 's/^X//' > 'doc/fibo.py' << 'EOF' X# Fibonacci numbers demo X Xdef fib(n): # write Fibonacci series up to n X a, b = 0, 1 X while b <= n: X print b, X a, b = b, a+b X Xdef fib2(n): # return Fibonacci series up to n X ret = [] X a, b = 0, 1 X while b <= n: X ret.append(b) X a, b = b, a+b X return ret EOF fi if test -s 'doc/mod.tex' then echo '*** I will not over-write existing file doc/mod.tex' else echo 'x - doc/mod.tex' sed 's/^X//' > 'doc/mod.tex' << 'EOF' X% Format this file with latex. X X%\documentstyle[garamond,11pt,myformat]{article} X\documentstyle[11pt,myformat]{article} X X% A command to force the text after an item to start on a new line X\newcommand{\itembreak}{ X \mbox{}\\*[0mm] X} X X% A command to define a function item X\newcommand{\funcitem}[2]{\item[#1(#2)]} X X% A command to define an exception item X\newcommand{\excitem}[2]{ X\item[#1 = {\tt '#2'}] X\itembreak X} X X\title{\bf X Python Library Reference \\ X (DRAFT) X} X X\author{ X Guido van Rossum \\ X Dept. CST, CWI, Kruislaan 413 \\ X 1098 SJ Amsterdam, The Netherlands \\ X E-mail: {\tt guido@cwi.nl} X} X X\begin{document} X X\pagenumbering{roman} X X\maketitle X X\begin{abstract} X X\noindent XThis document describes the built-in types, exceptions and functions and Xthe standard modules that come with the {\Python} system. XIt assumes basic knowledge about the {\Python} language. XFor an informal introduction to the language, see the Tutorial document. XThe Language Reference document (XXX not yet existing) Xgives a more formal reference to the language. X X\end{abstract} X X\pagebreak X X\tableofcontents X X\pagebreak X X\pagenumbering{arabic} X X\input{mod1.tex} X\input{mod2.tex} X\input{mod3.tex} X X\end{document} EOF fi if test -s 'doc/myformat.sty' then echo '*** I will not over-write existing file doc/myformat.sty' else echo 'x - doc/myformat.sty' sed 's/^X//' > 'doc/myformat.sty' << 'EOF' X% Style parameters and macros used by all documents here X X% Page lay-out parameters X\textwidth = 160mm X\textheight = 240mm X\topmargin = -11mm X\oddsidemargin = 0mm X\evensidemargin = 0mm X%\parindent = 0mm X X% Frequently used system names X\newcommand{\Python}{Python} % Sometimes I want this italicized X\newcommand{\UNIX}{U{\sc nix}} X X% Variable used by begin code command X\newlength{\codewidth} X X\newcommand{\bcode}{ X % Calculate the text width for the minipage: X \setlength{\codewidth}{\linewidth} X \addtolength{\codewidth}{-\parindent} X % X \vspace{3mm} X \par X \indent X \begin{minipage}[t]{\codewidth} X} X X\newcommand{\ecode}{ X \end{minipage} X \vspace{3mm} X \par X \noindent X} EOF fi if test -s 'doc/pytry' then echo '*** I will not over-write existing file doc/pytry' else echo 'x - doc/pytry' sed 's/^X//' > 'doc/pytry' << 'EOF' XTMP=/usr/tmp/pytry$$ Xtrap 'rm -f $TMP; exit 1' 1 2 3 13 14 15 X Xcat $* >$TMP X X( X cat $TMP X X sed ' X s/^>>> // X s/^>>>$// X s/^\.\.\. // X s/^\.\.\.$// X ' $TMP | X python X X echo '>>> ' X) 2>&1 X Xrm $TMP EOF chmod +x 'doc/pytry' fi if test -s 'lib/Histogram.py' then echo '*** I will not over-write existing file lib/Histogram.py' else echo 'x - lib/Histogram.py' sed 's/^X//' > 'lib/Histogram.py' << 'EOF' X# Module 'Histogram' X Xfrom Buttons import * X X# A Histogram displays a histogram of numeric data. X# Xclass HistogramAppearance() = LabelAppearance(), Define(): X # X def define(self, parent): X Define.define(self, (parent, '')) X self.ydata = [] X self.scale = (0, 100) X return self X # X def setdata(self, (ydata, scale)): X self.ydata = ydata X self.scale = scale # (min, max) X self.parent.change(self.bounds) X # X def drawpict(self, d): X (left, top), (right, bottom) = self.bounds X min, max = self.scale X size = max-min X width, height = right-left, bottom-top X ydata = self.ydata X npoints = len(ydata) X v1 = top + height # constant X h1 = left # changed in loop X for i in range(npoints): X h0 = h1 X v0 = top + height - (ydata[i]-min)*height/size X h1 = left + (i+1) * width/npoints X d.paint((h0, v0), (h1, v1)) X # X Xclass Histogram() = NoReactivity(), HistogramAppearance(): pass EOF fi if test -s 'lib/Soundogram.py' then echo '*** I will not over-write existing file lib/Soundogram.py' else echo 'x - lib/Soundogram.py' sed 's/^X//' > 'lib/Soundogram.py' << 'EOF' X# Module 'Soundogram' X Ximport audio Xfrom Histogram import Histogram X Xclass Soundogram() = Histogram(): X # X def define(self, (win, chunk)): X width, height = corner = win.getwinsize() X bounds = (0, 0), corner X self.chunk = chunk X self.step = (len(chunk)-1)/(width/2+1) + 1 X ydata = _make_ydata(chunk, self.step) X return Histogram.define(self, (win, bounds, ydata, (0, 128))) X # X def setchunk(self, chunk): X self.chunk = chunk X self.recompute() X # X def recompute(self): X (left, top), (right, bottom) = self.bounds X width = right - left X self.step = (len(chunk)-1)/width + 1 X ydata = _make_ydata(chunk, self.step) X self.setdata(ydata, (0, 128)) X # X X Xdef _make_ydata(chunk, step): X ydata = [] X for i in range(0, len(chunk), step): X piece = audio.chr2num(chunk[i:i+step]) X mi, ma = min(piece), max(piece) X y = max(abs(mi), abs(ma)) X ydata.append(y) X return ydata EOF fi if test -s 'lib/TestCSplit.py' then echo '*** I will not over-write existing file lib/TestCSplit.py' else echo 'x - lib/TestCSplit.py' sed 's/^X//' > 'lib/TestCSplit.py' << 'EOF' X# TestCSplit X Ximport stdwin Xfrom stdwinevents import WE_CLOSE Xfrom WindowParent import WindowParent Xfrom Buttons import PushButton X Xdef main(n): X from CSplit import CSplit X X the_window = WindowParent().create('TestCSplit', (0, 0)) X the_csplit = CSplit().create(the_window) X X for i in range(n): X the_child = PushButton().define(the_csplit) X the_child.settext(`(i+n-1)%n+1`) X X the_window.realize() X X while 1: X the_event = stdwin.getevent() X if the_event[0] = WE_CLOSE: break X the_window.dispatch(the_event) X the_window.destroy() X Xmain(12) EOF fi if test -s 'lib/VUMeter.py' then echo '*** I will not over-write existing file lib/VUMeter.py' else echo 'x - lib/VUMeter.py' sed 's/^X//' > 'lib/VUMeter.py' << 'EOF' X# Module 'VUMeter' X Ximport audio Xfrom StripChart import StripChart X XK = 1024 XRates = [0, 32*K, 16*K, 8*K] X Xclass VUMeter() = StripChart(): X # X # Override define() and timer() methods X # X def define(self, parent): X self = StripChart.define(self, (parent, 128)) X self.parent.need_timer(self) X self.sampling = 0 X self.rate = 3 X self.enable(0) X return self X # X def timer(self): X if self.sampling: X chunk = audio.wait_recording() X self.sampling = 0 X nums = audio.chr2num(chunk) X ampl = max(abs(min(nums)), abs(max(nums))) X self.append(ampl) X if self.enabled and not self.sampling: X audio.setrate(self.rate) X size = Rates[self.rate]/10 X size = size/48*48 X audio.start_recording(size) X self.sampling = 1 X if self.sampling: X self.parent.settimer(1) X # X # New methods: start() and stop() X # X def stop(self): X if self.sampling: X chunk = audio.stop_recording() X self.sampling = 0 X self.enable(0) X # X def start(self): X self.enable(1) X self.timer() EOF fi if test -s 'lib/anywin.py' then echo '*** I will not over-write existing file lib/anywin.py' else echo 'x - lib/anywin.py' sed 's/^X//' > 'lib/anywin.py' << 'EOF' X# Module 'anywin' X# Open a file or directory in a window X Ximport dirwin Ximport filewin Ximport path X Xdef open(name): X print 'opening', name, '...' X if path.isdir(name): X w = dirwin.open(name) X else: X w = filewin.open(name) X return w EOF fi if test -s 'lib/dircache.py' then echo '*** I will not over-write existing file lib/dircache.py' else echo 'x - lib/dircache.py' sed 's/^X//' > 'lib/dircache.py' << 'EOF' X# Module 'dircache' X# X# Return a sorted list of the files in a POSIX directory, using a cache X# to avoid reading the directory more often than necessary. X# Also contains a subroutine to append slashes to directories. X Ximport posix Ximport path X Xcache = {} X Xdef listdir(path): # List directory contents, using cache X try: X cached_mtime, list = cache[path] X del cache[path] X except RuntimeError: X cached_mtime, list = -1, [] X try: X mtime = posix.stat(path)[8] X except posix.error: X return [] X if mtime <> cached_mtime: X try: X list = posix.listdir(path) X except posix.error: X return [] X list.sort() X cache[path] = mtime, list X return list X Xopendir = listdir # XXX backward compatibility X Xdef annotate(head, list): # Add '/' suffixes to directories X for i in range(len(list)): X if path.isdir(path.cat(head, list[i])): X list[i] = list[i] + '/' EOF fi if test -s 'lib/dirwin.py' then echo '*** I will not over-write existing file lib/dirwin.py' else echo 'x - lib/dirwin.py' sed 's/^X//' > 'lib/dirwin.py' << 'EOF' X# Module 'dirwin' X X# Directory windows, a subclass of listwin X Ximport gwin Ximport listwin Ximport anywin Ximport path Ximport dircache X Xdef action(w, string, i, detail): X (h, v), clicks, button, mask = detail X if clicks = 2: X name = path.cat(w.name, string) X try: X w2 = anywin.open(name) X w2.parent = w X except posix.error, why: X stdwin.message('Can\'t open ' + name + ': ' + why[1]) X Xdef open(name): X name = path.cat(name, '') X list = dircache.opendir(name)[:] X list.sort() X dircache.annotate(name, list) X w = listwin.open(name, list) X w.name = name X w.action = action X return w EOF fi if test -s 'lib/fact.py' then echo '*** I will not over-write existing file lib/fact.py' else echo 'x - lib/fact.py' sed 's/^X//' > 'lib/fact.py' << 'EOF' X# Factorize numbers -- slow, could use a table of all primes <= 2*16 X Ximport sys Ximport math X Xerror = 'fact.error' # exception X Xdef fact(n): X if n < 1: raise error # fact() argument should be >= 1 X if n = 1: return [] # special case X res = [] X _fact(n, 2, res) X return res X Xdef _fact(n, lowest, res): X highest = int(math.sqrt(float(n+1))) X for i in range(lowest, highest+1): X if n%i = 0: X res.append(i) X _fact(n/i, i, res) X break X else: X res.append(n) X Xdef main(): X if len(sys.argv) > 1: X for arg in sys.argv[1:]: X n = eval(arg) X print n, fact(n) X else: X try: X while 1: X print fact(input()) X except EOFError: X pass X Xmain() EOF fi if test -s 'lib/filewin.py' then echo '*** I will not over-write existing file lib/filewin.py' else echo 'x - lib/filewin.py' sed 's/^X//' > 'lib/filewin.py' << 'EOF' X# Module 'filewin' X# File windows, a subclass of textwin (which is a subclass of gwin) X Ximport textwin Xfrom util import readfile X X X# FILE WINDOW X Xdef open_readonly(fn): # Open a file window X w = textwin.open_readonly(fn, readfile(fn)) X w.fn = fn X return w X Xdef open(fn): # Open a file window X w = textwin.open(fn, readfile(fn)) X w.fn = fn X return w EOF fi if test -s 'lib/fnmatch.py' then echo '*** I will not over-write existing file lib/fnmatch.py' else echo 'x - lib/fnmatch.py' sed 's/^X//' > 'lib/fnmatch.py' << 'EOF' X# module 'fnmatch' -- filename matching with shell patterns X X# XXX [] patterns are not supported (but recognized) X Xdef fnmatch(name, pat): X if '*' in pat or '?' in pat or '[' in pat: X return fnmatch1(name, pat) X return name = pat X Xdef fnmatch1(name, pat): X for i in range(len(pat)): X c = pat[i] X if c = '*': X restpat = pat[i+1:] X if '*' in restpat or '?' in restpat or '[' in restpat: X for i in range(i, len(name)): X if fnmatch1(name[i:], restpat): X return 1 X return 0 X else: X return name[len(name)-len(restpat):] = restpat X elif c = '?': X if len(name) <= i : return 0 X elif c = '[': X return 0 # XXX X else: X if name[i:i+1] <> c: X return 0 X return 1 X Xdef fnmatchlist(names, pat): X res = [] X for name in names: X if fnmatch(name, pat): res.append(name) X return res EOF fi if test -s 'lib/glob.py' then echo '*** I will not over-write existing file lib/glob.py' else echo 'x - lib/glob.py' sed 's/^X//' > 'lib/glob.py' << 'EOF' X# Module 'glob' -- filename globbing. X Ximport posix Ximport path Ximport fnmatch X Xdef glob(pathname): X if not has_magic(pathname): return [pathname] X dirname, basename = path.split(pathname) X if dirname[-1:] = '/' and dirname <> '/': X dirname = dirname[:-1] X if has_magic(dirname): X list = glob(dirname) X else: X list = [dirname] X if not has_magic(basename): X result = [] X for dirname in list: X if basename or path.isdir(dirname): X name = path.cat(dirname, basename) X if path.exists(name): X result.append(name) X else: X result = [] X for dirname in list: X sublist = glob1(dirname, basename) X for name in sublist: X result.append(path.cat(dirname, name)) X return result X Xdef glob1(dirname, pattern): X if not dirname: dirname = '.' X try: X names = posix.listdir(dirname) X except posix.error: X return [] X result = [] X for name in names: X if name[0] <> '.' or pattern[0] = '.': X if fnmatch.fnmatch(name, pattern): result.append(name) X return result X Xdef has_magic(s): X return '*' in s or '?' in s or '[' in s EOF fi if test -s 'lib/grep.py' then echo '*** I will not over-write existing file lib/grep.py' else echo 'x - lib/grep.py' sed 's/^X//' > 'lib/grep.py' << 'EOF' X# 'grep' X Ximport regexp Ximport string X Xdef grep(expr, filename): X prog = regexp.compile(expr) X fp = open(filename, 'r') X lineno = 0 X while 1: X line = fp.readline() X if not line: break X lineno = lineno + 1 X res = prog.exec(line) X if res: X #print res X start, end = res[0] X if line[-1:] = '\n': line = line[:-1] X prefix = string.rjust(`lineno`, 3) + ': ' X print prefix + line X if 0: X line = line[:start] X if '\t' not in line: X prefix = ' ' * (len(prefix) + start) X else: X prefix = ' ' * len(prefix) X for c in line: X if c <> '\t': c = ' ' X prefix = prefix + c X if start = end: prefix = prefix + '\\' X else: prefix = prefix + '^'*(end-start) X print prefix EOF fi if test -s 'lib/maccache.py' then echo '*** I will not over-write existing file lib/maccache.py' else echo 'x - lib/maccache.py' sed 's/^X//' > 'lib/maccache.py' << 'EOF' X# Module 'maccache' X# X# Maintain a cache of listdir(), isdir(), isfile() or exists() outcomes. X Ximport mac Ximport macpath X X X# The cache. X# Keys are absolute pathnames; X# values are 0 (nothing), 1 (file) or [...] (dir). X# Xcache = {} X X X# Current working directory. X# Xcwd = mac.getcwd() X X X# Constants. X# XNONE = 0 XFILE = 1 XLISTTYPE = type([]) X Xdef _stat(name): X name = macpath.cat(cwd, name) X if cache.has_key(name): X return cache[name] X if macpath.isfile(name): X cache[name] = FILE X return FILE X try: X list = mac.listdir(name) X except: X cache[name] = NONE X return NONE X cache[name] = list X if name[-1:] = ':': cache[name[:-1]] = list X else: cache[name+':'] = list X return list X Xdef isdir(name): X st = _stat(name) X return type(st) = LISTTYPE X Xdef isfile(name): X st = _stat(name) X return st = FILE X Xdef exists(name): X st = _stat(name) X return st <> NONE X Xdef listdir(name): X st = _stat(name) X if type(st) = LISTTYPE: X return st X else: X raise RuntimeError, 'list non-directory' EOF fi if test -s 'lib/macglob.py' then echo '*** I will not over-write existing file lib/macglob.py' else echo 'x - lib/macglob.py' sed 's/^X//' > 'lib/macglob.py' << 'EOF' X# Module 'macglob' -- version of 'glob' for the Macintosh. X X# XXX At least one bug is left: a pattern like '*:' is treated X# XXX as a relative pathname (and returns as if it was ':*:'). X Ximport mac Ximport macpath Ximport fnmatch X Xdef glob(pathname): X if not has_magic(pathname): return [pathname] X dirname, basename = macpath.split(pathname) X if has_magic(dirname): X if dirname[-1:] = ':': dirname = dirname[:-1] X list = glob(dirname) X else: X list = [dirname] X if not has_magic(basename): X result = [] X for dirname in list: X if basename or macpath.isdir(dirname): X name = macpath.cat(dirname, basename) X if macpath.exists(name): X result.append(name) X else: X result = [] X for dirname in list: X sublist = glob1(dirname, basename) X for name in sublist: X result.append(macpath.cat(dirname, name)) X return result X Xdef glob1(dirname, pattern): X if not dirname: dirname = ':' X try: X names = mac.listdir(dirname) X except mac.error: X return [] X result = [] X for name in names: X if name[0] <> '.' or pattern[0] = '.': X if fnmatch.fnmatch(name, pattern): result.append(name) X return result X Xdef has_magic(s): X return '*' in s or '?' in s or '[' in s EOF fi if test -s 'lib/minmax.py' then echo '*** I will not over-write existing file lib/minmax.py' else echo 'x - lib/minmax.py' sed 's/^X//' > 'lib/minmax.py' << 'EOF' X# Module 'minmax' X# These are now built in functions. X# For compatibility, we export the builtins X Xmin = min Xmax = max EOF fi if test -s 'lib/packmail.py' then echo '*** I will not over-write existing file lib/packmail.py' else echo 'x - lib/packmail.py' sed 's/^X//' > 'lib/packmail.py' << 'EOF' X# Module 'packmail' -- create a shell script out of some files. X Ximport mac Ximport macpath Xfrom stat import ST_MTIME X X# Pack one file Xdef pack(outfp, file, name): X fp = open(file, 'r') X outfp.write('sed "s/^X//" >' + name + ' <<"!"\n') X while 1: X line = fp.readline() X if not line: break X if line[-1:] <> '\n': X line = line + '\n' X outfp.write('X' + line) X outfp.write('!\n') X X# Pack some files from a directory Xdef packsome(outfp, dirname, names): X for name in names: X print name X file = macpath.cat(dirname, name) X pack(outfp, file, name) X X# Pack all files from a directory Xdef packall(outfp, dirname): X names = mac.listdir(dirname) X names.sort() X packsome(outfp, dirname, names) X X# Pack all files from a directory that are not older than a give one Xdef packnotolder(outfp, dirname, oldest): X names = mac.listdir(dirname) X oldest = macpath.cat(dirname, oldest) X st = mac.stat(oldest) X mtime = st[ST_MTIME] X todo = [] X for name in names: X print name, '...', X st = mac.stat(macpath.cat(dirname, name)) X if st[ST_MTIME] >= mtime: X print 'Yes.' X todo.append(name) X else: X print 'No.' X todo.sort() X packsome(outfp, dirname, todo) EOF fi if test -s 'lib/rand.py' then echo '*** I will not over-write existing file lib/rand.py' else echo 'x - lib/rand.py' sed 's/^X//' > 'lib/rand.py' << 'EOF' X# Module 'rand' X Ximport whrandom X Xdef srand(seed): X whrandom.seed(seed%256, seed/256%256, seed/65536%256) X Xdef rand(): X return int(whrandom.random() * 32768.0) % 32768 X Xdef choice(seq): X return seq[rand() % len(seq)] EOF fi if test -s 'lib/stat.py' then echo '*** I will not over-write existing file lib/stat.py' else echo 'x - lib/stat.py' sed 's/^X//' > 'lib/stat.py' << 'EOF' X# Module 'stat' X X# Defines constants and functions for interpreting stat/lstat struct X# as returned by posix.stat() and posix.lstat() (if it exists). X X# XXX This module may have to be adapted for UNIXoid systems whose X# <sys/stat.h> deviates from AT&T or BSD UNIX; their S_IF* constants X# may differ. X X# Suggested usage: from stat import * X X# Tuple indices for stat struct members X XST_MODE = 0 XST_INO = 1 XST_DEV = 2 XST_NLINK = 3 XST_UID = 4 XST_GID = 5 XST_SIZE = 6 XST_ATIME = 7 XST_MTIME = 8 XST_CTIME = 9 X Xdef S_IMODE(mode): X return mode%4096 Xdef S_IFMT(mode): X return mode - mode%4096 X XS_IFDIR = 0040000 XS_IFCHR = 0020000 XS_IFBLK = 0060000 XS_IFREG = 0100000 XS_IFIFO = 0010000 XS_IFLNK = 0120000 XS_IFSOCK = 0140000 X Xdef S_ISDIR(mode): X return S_IFMT(mode) = S_IFDIR X Xdef S_ISCHR(mode): X return S_IFMT(mode) = S_IFCHR X Xdef S_ISBLK(mode): X return S_IFMT(mode) = S_IFBLK X Xdef S_ISREG(mode): X return S_IFMT(mode) = S_IFREG X Xdef S_ISFIFO(mode): X return S_IFMT(mode) = S_IFIFO X Xdef S_ISLNK(mode): X return S_IFMT(mode) = S_IFLNK X Xdef S_ISSOCK(mode): X return S_IFMT(mode) = S_IFSOCK EOF fi if test -s 'lib/stdwinsupport.py' then echo '*** I will not over-write existing file lib/stdwinsupport.py' else echo 'x - lib/stdwinsupport.py' sed 's/^X//' > 'lib/stdwinsupport.py' << 'EOF' X# Module 'stdwinsupport' X Ximport stdwin X Xeventnames = ['null', 'activate', 'char', 'command'] Xeventnames = eventnames + ['mouse_down', 'mouse_move', 'mouse_up', 'menu'] Xeventnames = eventnames + ['size', 'move', 'draw', 'timer', 'deactivate'] X Xwe_null = 0 Xwe_activate = 1 Xwe_char = 2 Xwe_command = 3 Xwe_mouse_down = 4 Xwe_mouse_move = 5 Xwe_mouse_up = 6 Xwe_menu = 7 Xwe_size = 8 Xwe_move = 9 Xwe_draw = 10 Xwe_timer = 11 Xwe_deactivate = 12 X Xcommandnames = ['?', 'close', 'left', 'right', 'up', 'down', 'cancel'] Xcommandnames = commandnames + ['backspace', 'tab', 'return'] X Xwc_close = 1 Xwc_left = 2 Xwc_right = 3 Xwc_up = 4 Xwc_down = 5 Xwc_cancel = 6 # not reported -- turned into KeyboardInterrupt Xwc_backspace = 7 Xwc_tab = 8 Xwc_return = 9 EOF fi if test -s 'lib/util.py' then echo '*** I will not over-write existing file lib/util.py' else echo 'x - lib/util.py' sed 's/^X//' > 'lib/util.py' << 'EOF' X# Module 'util' -- some useful functions that don't fit elsewhere X X X# Remove an item from a list. X# No complaints if it isn't in the list at all. X# If it occurs more than once, remove the first occurrence. X# Xdef remove(item, list): X for i in range(len(list)): X if list[i] = item: X del list[i] X break X X X# Return a string containing a file's contents. X# Xdef readfile(fn): X return readopenfile(open(fn, 'r')) X X X# Read an open file until EOF. X# Xdef readopenfile(fp): X BUFSIZE = 512*8 X data = '' X while 1: X buf = fp.read(BUFSIZE) X if not buf: break X data = data + buf X return data EOF fi if test -s 'src/To.do' then echo '*** I will not over-write existing file src/To.do' else echo 'x - src/To.do' sed 's/^X//' > 'src/To.do' << 'EOF' X- return better errors for file objects (also check read/write allowed, etc.) X X- introduce more specific exceptions (e.g., zero divide, index failure, ...) X X- why do reads from stdin fail when I suspend the process? X X- introduce macros to set/inspect errno for syscalls, to support things X like getoserr() X X- fix interrupt handling (interruptable system calls should call X intrcheck() to clear the interrupt status) EOF fi if test -s 'src/assert.h' then echo '*** I will not over-write existing file src/assert.h' else echo 'x - src/assert.h' sed 's/^X//' > 'src/assert.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X#define assert(e) { if (!(e)) { printf("Assertion failed\n"); abort(); } } EOF fi if test -s 'src/bltinmodule.h' then echo '*** I will not over-write existing file src/bltinmodule.h' else echo 'x - src/bltinmodule.h' sed 's/^X//' > 'src/bltinmodule.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X/* Built-in module interface */ X Xextern object *getbuiltin PROTO((char *)); EOF fi if test -s 'src/fgetsintr.h' then echo '*** I will not over-write existing file src/fgetsintr.h' else echo 'x - src/fgetsintr.h' sed 's/^X//' > 'src/fgetsintr.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X Xextern int fgets_intr PROTO((char *, int, FILE *)); EOF fi if test -s 'src/rltokenizer.c' then echo '*** I will not over-write existing file src/rltokenizer.c' else echo 'x - src/rltokenizer.c' sed 's/^X//' > 'src/rltokenizer.c' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X#define USE_READLINE X#include "tokenizer.c" EOF fi if test -s 'src/stubcode.h' then echo '*** I will not over-write existing file src/stubcode.h' else echo 'x - src/stubcode.h' sed 's/^X//' > 'src/stubcode.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X X#define CAP 0 X#define STUBC 1 X#define NAME 2 EOF fi echo 'Part 21 out of 21 of pack.out complete.' exit 0