aboutsummaryrefslogtreecommitdiff
path: root/shar/python-0.9.1-13-21.shar
diff options
context:
space:
mode:
Diffstat (limited to 'shar/python-0.9.1-13-21.shar')
-rw-r--r--shar/python-0.9.1-13-21.shar2811
1 files changed, 2811 insertions, 0 deletions
diff --git a/shar/python-0.9.1-13-21.shar b/shar/python-0.9.1-13-21.shar
new file mode 100644
index 0000000..1d0e2ec
--- /dev/null
+++ b/shar/python-0.9.1-13-21.shar
@@ -0,0 +1,2811 @@
+: 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 13 out of 21:'
+if test -s 'demo/sgi/audio_stdwin/jukebox.py'
+then echo '*** I will not over-write existing file demo/sgi/audio_stdwin/jukebox.py'
+else
+echo 'x - demo/sgi/audio_stdwin/jukebox.py'
+sed 's/^X//' > 'demo/sgi/audio_stdwin/jukebox.py' << 'EOF'
+X#! /ufs/guido/bin/sgi/python
+X
+X# JUKEBOX: browse directories full of sampled sound files.
+X#
+X# One or more "list windows" display the files and subdirectories of
+X# the arguments. Double-clicking on a subdirectory opens a new window
+X# displaying its contents (and so on recursively). Double clicking
+X# on a file plays it as a sound file (assuming it is one).
+X#
+X# Playing is asynchronous: the application keeps listening to events
+X# while the sample is playing, so you can change the volume (gain)
+X# during playing, cancel playing or start a new sample right away.
+X#
+X# The control window displays the current output gain and a primitive
+X# "stop button" to cancel the current play request.
+X#
+X# Sound files must currently be in Dik Winter's compressed Mac format.
+X# Since decompression is costly, decompressed samples are saved in
+X# /usr/tmp/@j* until the application is left. The files are read
+X# afresh each time, though.
+X
+Ximport audio
+Ximport sunaudio
+Ximport commands
+Ximport getopt
+Ximport path
+Ximport posix
+Ximport rand
+Ximport stdwin
+Xfrom stdwinevents import *
+Ximport string
+Ximport sys
+X
+Xfrom WindowParent import WindowParent
+Xfrom HVSplit import VSplit
+Xfrom Buttons import PushButton
+Xfrom Sliders import ComplexSlider
+X
+X# Pathnames
+X
+XHOME_BIN_SGI = '/ufs/guido/bin/sgi/' # Directory where macsound2sgi lives
+XDEF_DB = '/ufs/dik/sounds/Mac/HCOM' # Default directory of sounds
+X
+X
+X# Global variables
+X
+Xclass struct(): pass # Class to define featureless structures
+X
+XG = struct() # Holds writable global variables
+X
+X
+X# Main program
+X
+Xdef main():
+X G.synchronous = 0 # If set, use synchronous audio.write()
+X G.debug = 0 # If set, print debug messages
+X G.gain = 75 # Output gain
+X G.rate = 3 # Sampling rate
+X G.busy = 0 # Set while asynchronous playing is active
+X G.windows = [] # List of open windows (except control)
+X G.mode = 'mac' # Macintosh mode
+X G.tempprefix = '/usr/tmp/@j' + `rand.rand()` + '-'
+X #
+X optlist, args = getopt.getopt(sys.argv[1:], 'dg:r:sSa')
+X for optname, optarg in optlist:
+X if optname = '-d':
+X G.debug = 1
+X elif optname = '-g':
+X G.gain = string.atoi(optarg)
+X if not (0 < G.gain < 256):
+X raise optarg.error, '-g gain out of range'
+X elif optname = '-r':
+X G.rate = string.atoi(optarg)
+X if not (1 <= G.rate <= 3):
+X raise optarg.error, '-r rate out of range'
+X elif optname = '-s':
+X G.synchronous = 1
+X elif optname = '-S':
+X G.mode = 'sgi'
+X elif optname = '-a':
+X G.mode = 'sun'
+X #
+X if not args:
+X args = [DEF_DB]
+X #
+X G.cw = opencontrolwindow()
+X for dirname in args:
+X G.windows.append(openlistwindow(dirname))
+X #
+X #
+X savegain = audio.getoutgain()
+X try:
+X # Initialize stdaudio
+X audio.setoutgain(0)
+X audio.start_playing('')
+X dummy = audio.wait_playing()
+X audio.setoutgain(0)
+X maineventloop()
+X finally:
+X audio.setoutgain(savegain)
+X audio.done()
+X clearcache()
+X
+Xdef maineventloop():
+X mouse_events = WE_MOUSE_DOWN, WE_MOUSE_MOVE, WE_MOUSE_UP
+X while G.windows:
+X type, w, detail = event = stdwin.getevent()
+X if w = G.cw.win:
+X if type = WE_CLOSE:
+X return
+X G.cw.dispatch(event)
+X else:
+X if type = WE_DRAW:
+X w.drawproc(w, detail)
+X elif type in mouse_events:
+X w.mouse(w, type, detail)
+X elif type = WE_CLOSE:
+X w.close(w)
+X del w, event
+X else:
+X if G.debug: print type, w, detail
+X
+X# Control window -- to set gain and cancel play operations in progress
+X
+Xdef opencontrolwindow():
+X cw = WindowParent().create('Jukebox', (0, 0))
+X v = VSplit().create(cw)
+X #
+X gain = ComplexSlider().define(v)
+X gain.setminvalmax(0, G.gain, 255)
+X gain.settexts(' ', ' ')
+X gain.sethook(gain_setval_hook)
+X #
+X stop = PushButton().definetext(v, 'Stop')
+X stop.hook = stop_hook
+X #
+X cw.realize()
+X return cw
+X
+Xdef gain_setval_hook(self):
+X G.gain = self.val
+X if G.busy: audio.setoutgain(G.gain)
+X
+Xdef stop_hook(self):
+X if G.busy:
+X audio.setoutgain(0)
+X dummy = audio.stop_playing()
+X G.busy = 0
+X
+X
+X# List windows -- to display list of files and subdirectories
+X
+Xdef openlistwindow(dirname):
+X list = posix.listdir(dirname)
+X list.sort()
+X i = 0
+X while i < len(list):
+X if list[i] = '.' or list[i] = '..':
+X del list[i]
+X else:
+X i = i+1
+X for i in range(len(list)):
+X name = list[i]
+X if path.isdir(path.cat(dirname, name)):
+X list[i] = list[i] + '/'
+X width = maxwidth(list)
+X width = width + stdwin.textwidth(' ') # XXX X11 stdwin bug workaround
+X height = len(list) * stdwin.lineheight()
+X stdwin.setdefwinsize(width, min(height, 500))
+X w = stdwin.open(dirname)
+X stdwin.setdefwinsize(0, 0)
+X w.setdocsize(width, height)
+X w.drawproc = drawlistwindow
+X w.mouse = mouselistwindow
+X w.close = closelistwindow
+X w.dirname = dirname
+X w.list = list
+X w.selected = -1
+X return w
+X
+Xdef maxwidth(list):
+X width = 1
+X for name in list:
+X w = stdwin.textwidth(name)
+X if w > width: width = w
+X return width
+X
+Xdef drawlistwindow(w, area):
+X d = w.begindrawing()
+X d.erase((0, 0), (1000, 10000))
+X lh = d.lineheight()
+X h, v = 0, 0
+X for name in w.list:
+X d.text((h, v), name)
+X v = v + lh
+X showselection(w, d)
+X
+Xdef hideselection(w, d):
+X if w.selected >= 0:
+X invertselection(w, d)
+X
+Xdef showselection(w, d):
+X if w.selected >= 0:
+X invertselection(w, d)
+X
+Xdef invertselection(w, d):
+X lh = d.lineheight()
+X h1, v1 = p1 = 0, w.selected*lh
+X h2, v2 = p2 = 1000, v1 + lh
+X d.invert(p1, p2)
+X
+Xdef mouselistwindow(w, type, detail):
+X (h, v), clicks, button = detail[:3]
+X d = w.begindrawing()
+X lh = d.lineheight()
+X if 0 <= v < lh*len(w.list):
+X i = v / lh
+X else:
+X i = -1
+X if w.selected <> i:
+X hideselection(w, d)
+X w.selected = i
+X showselection(w, d)
+X if type = WE_MOUSE_DOWN and clicks >= 2 and i >= 0:
+X name = path.cat(w.dirname, w.list[i])
+X if name[-1:] = '/':
+X if clicks = 2:
+X G.windows.append(openlistwindow(name[:-1]))
+X else:
+X playfile(name)
+X
+Xdef closelistwindow(w):
+X remove(G.windows, w)
+X
+Xdef remove(list, item):
+X for i in range(len(list)):
+X if list[i] = item:
+X del list[i]
+X break
+X
+X
+X# Playing tools
+X
+Xcache = {}
+X
+Xdef clearcache():
+X for x in cache.keys():
+X try:
+X sts = posix.system('rm -f ' + cache[x])
+X if sts:
+X print cmd
+X print 'Exit status', sts
+X except:
+X print cmd
+X print 'Exception?!'
+X del cache[x]
+X
+Xdef playfile(name):
+X if G.mode <> 'mac':
+X tempname = name
+X elif cache.has_key(name):
+X tempname = cache[name]
+X else:
+X tempname = G.tempprefix + `rand.rand()`
+X cmd = HOME_BIN_SGI + 'macsound2sgi'
+X cmd = cmd + ' ' + commands.mkarg(name)
+X cmd = cmd + ' >' + tempname
+X if G.debug: print cmd
+X sts = posix.system(cmd)
+X if sts:
+X print cmd
+X print 'Exit status', sts
+X stdwin.fleep()
+X return
+X cache[name] = tempname
+X fp = open(tempname, 'r')
+X try:
+X hdr = sunaudio.gethdr(fp)
+X except sunaudio.error, msg:
+X hdr = ()
+X if hdr:
+X data_size = hdr[0]
+X data = fp.read(data_size)
+X # XXX this doesn't work yet, need to convert from uLAW!!!
+X del fp
+X else:
+X del fp
+X data = readfile(tempname)
+X if G.debug: print len(data), 'bytes read from', tempname
+X if G.busy:
+X G.busy = 0
+X dummy = audio.stop_playing()
+X #
+X # Completely reset the audio device
+X audio.setrate(G.rate)
+X audio.setduration(0)
+X audio.setoutgain(G.gain)
+X #
+X if G.synchronous:
+X audio.write(data)
+X audio.setoutgain(0)
+X else:
+X try:
+X audio.start_playing(data)
+X G.busy = 1
+X except:
+X stdwin.fleep()
+X del data
+X
+Xdef readfile(filename):
+X return readfp(open(filename, 'r'))
+X
+Xdef readfp(fp):
+X data = ''
+X while 1:
+X buf = fp.read(102400) # Reads most samples in one fell swoop
+X if not buf:
+X return data
+X data = data + buf
+X
+Xmain()
+EOF
+chmod +x 'demo/sgi/audio_stdwin/jukebox.py'
+fi
+if test -s 'demo/sgi/gl_panel/twoview/twoview.py'
+then echo '*** I will not over-write existing file demo/sgi/gl_panel/twoview/twoview.py'
+else
+echo 'x - demo/sgi/gl_panel/twoview/twoview.py'
+sed 's/^X//' > 'demo/sgi/gl_panel/twoview/twoview.py' << 'EOF'
+X#! /ufs/guido/bin/sgi/python
+X
+X# A demo of GL's viewing transformations, showing two views on one scene.
+X# Requires the NASA AMES Panel Library. Requires Z buffer.
+X
+Xfrom gl import *
+Xfrom GL import *
+Ximport panel
+Xfrom math import sin, cos, pi
+X
+Xinf = 1000000.0
+Xfar = 1000.0
+Xnear = 100.0
+X
+Xdef main():
+X foreground()
+X #
+X keepaspect(1, 1)
+X prefposition(10, 610, 10, 610)
+X obswid = winopen('Observer View')
+X doublebuffer()
+X RGBmode()
+X gconfig()
+X #
+X keepaspect(1, 1)
+X prefposition(10, 310, 650, 950)
+X topwid = winopen('Top View')
+X doublebuffer()
+X RGBmode()
+X gconfig()
+X #
+X panels = panel.defpanellist('observer.s')
+X panels = panels + panel.defpanellist('camera.s')
+X panels = panels + panel.defpanellist('topview.s')
+X #
+X p = panels[0]
+X q = panels[1]
+X r = panels[2]
+X #
+X p.farclip = q.farclip
+X p.nearclip = q.nearclip
+X p.zoom = q.zoom
+X p.quitbutton = q.quitbutton
+X #
+X p.xpos = r.xpos
+X p.zpos = r.zpos
+X p.direction = r.direction
+X #
+X p.direction.winds = 1.0 # allow full rotation
+X #
+X def quit(act):
+X import sys
+X sys.exit(0)
+X p.quitbutton.downfunc = quit
+X #
+X p.left.back = p
+X p.fast_left.back = p
+X p.right.back = p
+X p.fast_right.back = p
+X p.forward.back = p
+X p.fast_forward.back = p
+X p.reverse.back = p
+X p.fast_reverse.back = p
+X p.up.back = p
+X p.down.back = p
+X #
+X p.left.activefunc = left
+X p.fast_left.activefunc = fast_left
+X p.right.activefunc = right
+X p.fast_right.activefunc = fast_right
+X p.forward.activefunc = forward
+X p.fast_forward.activefunc = fast_forward
+X p.reverse.activefunc = reverse
+X p.fast_reverse.activefunc = fast_reverse
+X p.up.activefunc = up
+X p.down.activefunc = down
+X #
+X makeobjects()
+X #
+X drawall(p, obswid, topwid)
+X panel.needredraw()
+X while 1:
+X act = panel.dopanel()
+X if panel.userredraw() or act:
+X drawall(p, obswid, topwid)
+X
+Xdef left(a):
+X doturn(a.back, 0.01)
+X
+Xdef fast_left(a):
+X doturn(a.back, 0.1)
+X
+Xdef right(a):
+X doturn(a.back, -0.01)
+X
+Xdef fast_right(a):
+X doturn(a.back, -0.1)
+X
+Xdef doturn(p, angle):
+X alpha = lookangle(p) + angle
+X # Reverse the following assignment:
+X # alpha = pi*1.5 - p.direction.val*2.0*pi
+X val = (pi*1.5 - alpha) / 2.0 / pi
+X while val < 0.0: val = val + 1.0
+X while val > 1.0: val = val - 1.0
+X p.direction.val = val
+X p.direction.fixact()
+X
+Xdef forward(a):
+X dostep(a.back, 1.0)
+X
+Xdef fast_forward(a):
+X dostep(a.back, 10.0)
+X
+Xdef reverse(a):
+X dostep(a.back, -1.0)
+X
+Xdef fast_reverse(a):
+X dostep(a.back, -10.0)
+X
+Xdef dostep(p, step):
+X x, y, z = observerpos(p)
+X alpha = lookangle(p)
+X x = x + step*cos(alpha)
+X z = z - step*sin(alpha)
+X # Reverse the following assignments:
+X # x = 2.0 * p.xpos.val * near - near
+X # z = near - 2.0 * p.zpos.val * near
+X p.xpos.val = (x + near) / 2.0 / near
+X p.zpos.val = - (z - near) / 2.0 / near
+X p.xpos.fixact()
+X p.zpos.fixact()
+X
+Xdef up(a):
+X doup(a.back, 0.2)
+X
+Xdef down(a):
+X doup(a.back, -0.2)
+X
+Xdef doup(p, step):
+X x, y, z = observerpos(p)
+X y = y + step
+X # Reverse:
+X # y = p.ypos.val * near
+X p.ypos.val = y/near
+X p.ypos.fixact()
+X
+Xdef drawall(p, obswid, topwid):
+X #
+X winset(obswid)
+X obsview(p)
+X drawscene()
+X swapbuffers()
+X #
+X winset(topwid)
+X topview(p)
+X drawscene()
+X drawobserver(p)
+X swapbuffers()
+X
+Xdef drawobserver(p):
+X x, y, z = observerpos(p)
+X alpha = lookangle(p)
+X fov = 2.0 + 1798.0 * p.zoom.val
+X beta = fov*pi/3600.0 # Half fov, expressed in radians
+X #
+X c3i(0, 255, 0)
+X #
+X move(x, y, z)
+X x1 = x + inf*cos(alpha+beta)
+X y1 = y
+X z1 = z - inf*sin(alpha+beta)
+X draw(x1, y1, z1)
+X #
+X move(x, y, z)
+X x1 = x + inf*cos(alpha-beta)
+X y1 = y
+X z1 = z - inf*sin(alpha-beta)
+X draw(x1, y1, z1)
+X
+Xdef observerlookat(p):
+X x, y, z = observerpos(p)
+X alpha = lookangle(p)
+X return x, y, z, x+near*cos(alpha), y, z-near*sin(alpha), 0
+X
+Xdef observerpos(p):
+X x = 2.0 * p.xpos.val * near - near
+X y = p.ypos.val * near
+X z = near - 2.0 * p.zpos.val * near
+X return x, y, z
+X
+Xdef lookangle(p):
+X return pi*1.5 - p.direction.val*2.0*pi
+X
+Xidmat = 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1
+X
+Xdef topview(p):
+X mmode(MVIEWING)
+X ortho(-far, far, -far, far, far, -far)
+X loadmatrix(idmat)
+X rotate(900, 'x')
+X
+Xdef obsview(p):
+X fov = 2.0 + 1798.0 * p.zoom.val
+X nearclip = p.nearclip.val * 10.0
+X farclip = p.farclip.val * 10.0*far
+X aspectratio = 1.0
+X mmode(MVIEWING)
+X perspective(int(fov), aspectratio, nearclip, farclip)
+X loadmatrix(idmat)
+X lookat(observerlookat(p))
+X
+Xdef drawscene():
+X #
+X # clear window
+X #
+X c3i(0, 0, 0)
+X clear()
+X #
+X # turn on z buffering and clear it
+X #
+X zbuffer(TRUE)
+X zclear()
+X #
+X # dark blue sky (depending on your gamma value!)
+X #
+X c3i(0, 0, 150)
+X callobj(41)
+X #
+X # bright red near and far units circle
+X # (use rotate since circ() always draws in x-y plane)
+X #
+X c3i(255, 0, 0)
+X pushmatrix()
+X rotate(900, 'x')
+X circ(0.0, 0.0, near)
+X circ(0.0, 0.0, far)
+X popmatrix()
+X #
+X # bright white striping
+X #
+X c3i(255, 255, 200)
+X callobj(42)
+X #
+X # building (does its own colors)
+X #
+X building()
+X #
+X # some other objects
+X #
+X dice()
+X
+Xdef makeobjects():
+X #
+X # sky object
+X #
+X makeobj(41)
+X pmv(-inf, 0.0, -far)
+X pdr(inf, 0.0, -far)
+X pdr(inf, inf, -far)
+X pdr(-inf, inf, -far)
+X pclos()
+X closeobj()
+X #
+X # road stripes object
+X #
+X makeobj(42)
+X stripes()
+X closeobj()
+X #
+X # lighting model definitions
+X #
+X deflight()
+X
+Xdef stripes():
+X #
+X # left line
+X #
+X botrect(-11, -10, far, -far)
+X #
+X # right line
+X #
+X botrect(10, 11, far, -far)
+X #
+X # center lines
+X #
+X z = far
+X while z > -far:
+X botrect(-0.5, 0.5, z, z - 4.0)
+X z = z - 10.0
+X
+Xdef dice():
+X from block import block
+X uselight()
+X pushmatrix()
+X translate(0.0, 1.0, -20.0)
+X rotate(200, 'y')
+X block(1, 0, 0, 0, 0, 0)
+X translate(1.0, 0.0, 3.0)
+X rotate(500, 'y')
+X block(2, 0, 0, 0, 0, 0)
+X popmatrix()
+X
+Xdef deflight():
+X # Material for first die (red)
+X lmdef(DEFMATERIAL, 1, (DIFFUSE, 1.0, 0.0, 0.0))
+X # Material for second die (green)
+X lmdef(DEFMATERIAL, 2, (DIFFUSE, 0.0, 1.0, 0.0))
+X # First light source (default: white, from front)
+X lmdef(DEFLIGHT, 1, ())
+X # Second light source (red, from back)
+X lmdef(DEFLIGHT, 2, (POSITION, 0.0, 1.0, -1.0, 0.0))
+X lmdef(DEFLIGHT, 2, (LCOLOR, 1.0, 0.0, 0.0))
+X # Lighting model
+X lmdef(DEFLMODEL, 1, (AMBIENT, 0.0, 0.0, 1.0))
+X
+Xdef uselight():
+X lmbind(LIGHT0, 1)
+X lmbind(LIGHT1, 2)
+X lmbind(LMODEL, 1)
+X # (materials are bound later)
+X
+Xdef building():
+X #
+X c3i(0, 255, 255)
+X #
+X # house bounding coordinates
+X #
+X x1 = 20.0
+X x1a = 25.0
+X x2 = 30.0
+X y1 = 0.0
+X y2 = 15.0
+X y2a = 20.0
+X z1 = -40.0
+X z2 = -55.0
+X #
+X # door y and z coordinates
+X #
+X dy1 = 0.0
+X dy2 = 4.0
+X dz1 = -45.0
+X dz2 = -47.0
+X #
+X # front side (seen from origin)
+X #
+X A1 = (x1, y1, z1)
+X B1 = (x2, y1, z1)
+X C1 = (x2, y2, z1)
+X D1 = (x1a, y2a, z1)
+X E1 = (x1, y2, z1)
+X #
+X # back size
+X #
+X A2 = (x1, y1, z2)
+X B2 = (x2, y1, z2)
+X C2 = (x2, y2, z2)
+X D2 = (x1a, y2a, z2)
+X E2 = (x1, y2, z2)
+X #
+X # door in the left side
+X #
+X P = x1, dy1, dz2
+X Q = x1, dy2, dz2
+X R = x1, dy2, dz1
+X S = x1, dy1, dz1
+X #
+X # draw it
+X #
+X concave(TRUE)
+X c3i(255, 0, 0)
+X face(A1, B1, C1, D1, E1)
+X c3i(127, 127, 0)
+X face(A1, E1, E2, A2, P, Q, R, S)
+X c3i(0, 255, 0)
+X face(E1, D1, D2, E2)
+X c3i(0, 127, 127)
+X face(D1, C1, C2, D2)
+X c3i(0, 0, 255)
+X face(C1, B1, B2, C2)
+X c3i(127, 0, 127)
+X face(E2, D2, C2, B2, A2)
+X concave(FALSE)
+X
+Xdef face(points):
+X bgnpolygon()
+X varray(points)
+X endpolygon()
+X
+X# draw a rectangle at y=0.0
+X#
+Xdef botrect(x1, x2, z1, z2):
+X polf(x1, 0.0, z1, x2, 0.0, z1, x2, 0.0, z2, x1, 0.0, z2)
+X
+Xmain()
+EOF
+chmod +x 'demo/sgi/gl_panel/twoview/twoview.py'
+fi
+if test -s 'lib/DEVICE.py'
+then echo '*** I will not over-write existing file lib/DEVICE.py'
+else
+echo 'x - lib/DEVICE.py'
+sed 's/^X//' > 'lib/DEVICE.py' << 'EOF'
+X#/**************************************************************************
+X# * *
+X# * Copyright (C) 1984, Silicon Graphics, Inc. *
+X# * *
+X# * These coded instructions, statements, and computer programs contain *
+X# * unpublished proprietary information of Silicon Graphics, Inc., and *
+X# * are protected by Federal copyright law. They may not be disclosed *
+X# * to third parties or copied or duplicated in any form, in whole or *
+X# * in part, without the prior written consent of Silicon Graphics, Inc. *
+X# * *
+X# **************************************************************************/
+X#/* file with device definitions (see /usr/include/device.h) */
+X
+XNULLDEV = 0
+XBUTOFFSET = 1
+XVALOFFSET = 256
+XTIMOFFSET = 515
+XXKBDOFFSET = 143
+XINOFFSET = 1024
+XOUTOFFSET = 1033
+XBUTCOUNT = 190
+XVALCOUNT = 27
+XTIMCOUNT = 4
+XXKBDCOUNT = 28
+XINCOUNT = 8
+XOUTCOUNT = 8
+X#
+X#
+X#
+X#
+XBUT0 = 1
+XBUT1 = 2
+XBUT2 = 3
+XBUT3 = 4
+XBUT4 = 5
+XBUT5 = 6
+XBUT6 = 7
+XBUT7 = 8
+XBUT8 = 9
+XBUT9 = 10
+XBUT10 = 11
+XBUT11 = 12
+XBUT12 = 13
+XBUT13 = 14
+XBUT14 = 15
+XBUT15 = 16
+XBUT16 = 17
+XBUT17 = 18
+XBUT18 = 19
+XBUT19 = 20
+XBUT20 = 21
+XBUT21 = 22
+XBUT22 = 23
+XBUT23 = 24
+XBUT24 = 25
+XBUT25 = 26
+XBUT26 = 27
+XBUT27 = 28
+XBUT28 = 29
+XBUT29 = 30
+XBUT30 = 31
+XBUT31 = 32
+XBUT32 = 33
+XBUT33 = 34
+XBUT34 = 35
+XBUT35 = 36
+XBUT36 = 37
+XBUT37 = 38
+XBUT38 = 39
+XBUT39 = 40
+XBUT40 = 41
+XBUT41 = 42
+XBUT42 = 43
+XBUT43 = 44
+XBUT44 = 45
+XBUT45 = 46
+XBUT46 = 47
+XBUT47 = 48
+XBUT48 = 49
+XBUT49 = 50
+XBUT50 = 51
+XBUT51 = 52
+XBUT52 = 53
+XBUT53 = 54
+XBUT54 = 55
+XBUT55 = 56
+XBUT56 = 57
+XBUT57 = 58
+XBUT58 = 59
+XBUT59 = 60
+XBUT60 = 61
+XBUT61 = 62
+XBUT62 = 63
+XBUT63 = 64
+XBUT64 = 65
+XBUT65 = 66
+XBUT66 = 67
+XBUT67 = 68
+XBUT68 = 69
+XBUT69 = 70
+XBUT70 = 71
+XBUT71 = 72
+XBUT72 = 73
+XBUT73 = 74
+XBUT74 = 75
+XBUT75 = 76
+XBUT76 = 77
+XBUT77 = 78
+XBUT78 = 79
+XBUT79 = 80
+XBUT80 = 81
+XBUT81 = 82
+XBUT82 = 83
+XMAXKBDBUT = 83
+XBUT100 = 101
+XBUT101 = 102
+XBUT102 = 103
+XBUT110 = 111
+XBUT111 = 112
+XBUT112 = 113
+XBUT113 = 114
+XBUT114 = 115
+XBUT115 = 116
+XBUT116 = 117
+XBUT117 = 118
+XBUT118 = 119
+XBUT119 = 120
+XBUT120 = 121
+XBUT121 = 122
+XBUT122 = 123
+XBUT123 = 124
+XBUT124 = 125
+XBUT125 = 126
+XBUT126 = 127
+XBUT127 = 128
+XBUT128 = 129
+XBUT129 = 130
+XBUT130 = 131
+XBUT131 = 132
+XBUT132 = 133
+XBUT133 = 134
+XBUT134 = 135
+XBUT135 = 136
+XBUT136 = 137
+XBUT137 = 138
+XBUT138 = 139
+XBUT139 = 140
+XBUT140 = 141
+XBUT141 = 142
+XBUT142 = 143
+XBUT143 = 144
+XBUT144 = 145
+XBUT145 = 146
+XBUT146 = 147
+XBUT147 = 148
+XBUT148 = 149
+XBUT149 = 150
+XBUT150 = 151
+XBUT151 = 152
+XBUT152 = 153
+XBUT153 = 154
+XBUT154 = 155
+XBUT155 = 156
+XBUT156 = 157
+XBUT157 = 158
+XBUT158 = 159
+XBUT159 = 160
+XBUT160 = 161
+XBUT161 = 162
+XBUT162 = 163
+XBUT163 = 164
+XBUT164 = 165
+XBUT165 = 166
+XBUT166 = 167
+XBUT167 = 168
+XBUT168 = 169
+XBUT181 = 182
+XBUT182 = 183
+XBUT183 = 184
+XBUT184 = 185
+XBUT185 = 186
+XBUT186 = 187
+XBUT187 = 188
+XBUT188 = 189
+XBUT189 = 190
+XMOUSE1 = 101
+XMOUSE2 = 102
+XMOUSE3 = 103
+XLEFTMOUSE = 103
+XMIDDLEMOUSE = 102
+XRIGHTMOUSE = 101
+XLPENBUT = 104
+XBPAD0 = 105
+XBPAD1 = 106
+XBPAD2 = 107
+XBPAD3 = 108
+XLPENVALID = 109
+XSWBASE = 111
+XSW0 = 111
+XSW1 = 112
+XSW2 = 113
+XSW3 = 114
+XSW4 = 115
+XSW5 = 116
+XSW6 = 117
+XSW7 = 118
+XSW8 = 119
+XSW9 = 120
+XSW10 = 121
+XSW11 = 122
+XSW12 = 123
+XSW13 = 124
+XSW14 = 125
+XSW15 = 126
+XSW16 = 127
+XSW17 = 128
+XSW18 = 129
+XSW19 = 130
+XSW20 = 131
+XSW21 = 132
+XSW22 = 133
+XSW23 = 134
+XSW24 = 135
+XSW25 = 136
+XSW26 = 137
+XSW27 = 138
+XSW28 = 139
+XSW29 = 140
+XSW30 = 141
+XSW31 = 142
+XSBBASE = 182
+XSBPICK = 182
+XSBBUT1 = 183
+XSBBUT2 = 184
+XSBBUT3 = 185
+XSBBUT4 = 186
+XSBBUT5 = 187
+XSBBUT6 = 188
+XSBBUT7 = 189
+XSBBUT8 = 190
+XAKEY = 11
+XBKEY = 36
+XCKEY = 28
+XDKEY = 18
+XEKEY = 17
+XFKEY = 19
+XGKEY = 26
+XHKEY = 27
+XIKEY = 40
+XJKEY = 34
+XKKEY = 35
+XLKEY = 42
+XMKEY = 44
+XNKEY = 37
+XOKEY = 41
+XPKEY = 48
+XQKEY = 10
+XRKEY = 24
+XSKEY = 12
+XTKEY = 25
+XUKEY = 33
+XVKEY = 29
+XWKEY = 16
+XXKEY = 21
+XYKEY = 32
+XZKEY = 20
+XZEROKEY = 46
+XONEKEY = 8
+XTWOKEY = 14
+XTHREEKEY = 15
+XFOURKEY = 22
+XFIVEKEY = 23
+XSIXKEY = 30
+XSEVENKEY = 31
+XEIGHTKEY = 38
+XNINEKEY = 39
+XBREAKKEY = 1
+XSETUPKEY = 2
+XCTRLKEY = 3
+XLEFTCTRLKEY = CTRLKEY
+XCAPSLOCKKEY = 4
+XRIGHTSHIFTKEY = 5
+XLEFTSHIFTKEY = 6
+XNOSCRLKEY = 13
+XESCKEY = 7
+XTABKEY = 9
+XRETKEY = 51
+XSPACEKEY = 83
+XLINEFEEDKEY = 60
+XBACKSPACEKEY = 61
+XDELKEY = 62
+XSEMICOLONKEY = 43
+XPERIODKEY = 52
+XCOMMAKEY = 45
+XQUOTEKEY = 50
+XACCENTGRAVEKEY = 55
+XMINUSKEY = 47
+XVIRGULEKEY = 53
+XBACKSLASHKEY = 57
+XEQUALKEY = 54
+XLEFTBRACKETKEY = 49
+XRIGHTBRACKETKEY = 56
+XLEFTARROWKEY = 73
+XDOWNARROWKEY = 74
+XRIGHTARROWKEY = 80
+XUPARROWKEY = 81
+XPAD0 = 59
+XPAD1 = 58
+XPAD2 = 64
+XPAD3 = 65
+XPAD4 = 63
+XPAD5 = 69
+XPAD6 = 70
+XPAD7 = 67
+XPAD8 = 68
+XPAD9 = 75
+XPADPF1 = 72
+XPADPF2 = 71
+XPADPF3 = 79
+XPADPF4 = 78
+XPADPERIOD = 66
+XPADMINUS = 76
+XPADCOMMA = 77
+XPADENTER = 82
+XLEFTALTKEY = 143
+XRIGHTALTKEY = 144
+XRIGHTCTRLKEY = 145
+XF1KEY = 146
+XF2KEY = 147
+XF3KEY = 148
+XF4KEY = 149
+XF5KEY = 150
+XF6KEY = 151
+XF7KEY = 152
+XF8KEY = 153
+XF9KEY = 154
+XF10KEY = 155
+XF11KEY = 156
+XF12KEY = 157
+XPRINTSCREENKEY = 158
+XSCROLLLOCKKEY = 159
+XPAUSEKEY = 160
+XINSERTKEY = 161
+XHOMEKEY = 162
+XPAGEUPKEY = 163
+XENDKEY = 164
+XPAGEDOWNKEY = 165
+XNUMLOCKKEY = 166
+XPADVIRGULEKEY = 167
+XPADASTERKEY = 168
+XPADPLUSKEY = 169
+XSGIRESERVED = 256
+XDIAL0 = 257
+XDIAL1 = 258
+XDIAL2 = 259
+XDIAL3 = 260
+XDIAL4 = 261
+XDIAL5 = 262
+XDIAL6 = 263
+XDIAL7 = 264
+XDIAL8 = 265
+XMOUSEX = 266
+XMOUSEY = 267
+XLPENX = 268
+XLPENY = 269
+XBPADX = 270
+XBPADY = 271
+XCURSORX = 272
+XCURSORY = 273
+XGHOSTX = 274
+XGHOSTY = 275
+XSBTX = 276
+XSBTY = 277
+XSBTZ = 278
+XSBRX = 279
+XSBRY = 280
+XSBRZ = 281
+XSBPERIOD = 282
+XTIMER0 = 515
+XTIMER1 = 516
+XTIMER2 = 517
+XTIMER3 = 518
+XKEYBD = 513
+XRAWKEYBD = 514
+XVALMARK = 523
+XGERROR = 524
+XREDRAW = 528
+XWMSEND = 529
+XWMREPLY = 530
+XWMGFCLOSE = 531
+XWMTXCLOSE = 532
+XMODECHANGE = 533
+XINPUTCHANGE = 534
+XQFULL = 535
+XPIECECHANGE = 536
+XWINCLOSE = 537
+XQREADERROR = 538
+XWINFREEZE = 539
+XWINTHAW = 540
+XREDRAWICONIC = 541
+XWINQUIT = 542
+XDEPTHCHANGE = 543
+XKEYBDFNAMES = 544
+XKEYBDFSTRINGS = 545
+XWINSHUT = 546
+XINPUT0 = 1024
+XINPUT1 = 1025
+XINPUT2 = 1026
+XINPUT3 = 1027
+XINPUT4 = 1028
+XINPUT5 = 1029
+XINPUT6 = 1030
+XINPUT7 = 1032
+XOUTPUT0 = 1033
+XOUTPUT1 = 1034
+XOUTPUT2 = 1035
+XOUTPUT3 = 1036
+XOUTPUT4 = 1037
+XOUTPUT5 = 1038
+XOUTPUT6 = 1039
+XOUTPUT7 = 1040
+XMAXSGIDEVICE = 20000
+XMENUBUTTON = RIGHTMOUSE
+EOF
+fi
+if test -s 'lib/GL.py'
+then echo '*** I will not over-write existing file lib/GL.py'
+else
+echo 'x - lib/GL.py'
+sed 's/^X//' > 'lib/GL.py' << 'EOF'
+X# Constants defined in <gl.h>
+X
+X#**************************************************************************
+X#* *
+X#* Copyright (C) 1984, Silicon Graphics, Inc. *
+X#* *
+X#* These coded instructions, statements, and computer programs contain *
+X#* unpublished proprietary information of Silicon Graphics, Inc., and *
+X#* are protected by Federal copyright law. They may not be disclosed *
+X#* to third parties or copied or duplicated in any form, in whole or *
+X#* in part, without the prior written consent of Silicon Graphics, Inc. *
+X#* *
+X#**************************************************************************
+X
+X# Graphics Libary constants
+X
+X# Booleans
+XTRUE = 1
+XFALSE = 0
+X
+X# maximum X and Y screen coordinates
+XXMAXSCREEN = 1279
+XYMAXSCREEN = 1023
+XXMAXMEDIUM = 1023 # max for medium res monitor
+XYMAXMEDIUM = 767
+XXMAX170 = 645 # max for RS-170
+XYMAX170 = 484
+XXMAXPAL = 779 # max for PAL
+XYMAXPAL = 574
+X
+X# various hardware/software limits
+XATTRIBSTACKDEPTH = 10
+XVPSTACKDEPTH = 8
+XMATRIXSTACKDEPTH = 32
+XNAMESTACKDEPTH = 1025
+XSTARTTAG = -2
+XENDTAG = -3
+XCPOSX_INVALID = -(2*XMAXSCREEN)
+X
+X# names for colors in color map loaded by greset
+XBLACK = 0
+XRED = 1
+XGREEN = 2
+XYELLOW = 3
+XBLUE = 4
+XMAGENTA = 5
+XCYAN = 6
+XWHITE = 7
+X
+X# popup colors
+XPUP_CLEAR = 0
+XPUP_COLOR = 1
+XPUP_BLACK = 2
+XPUP_WHITE = 3
+X
+X# defines for drawmode
+XNORMALDRAW = 0
+XPUPDRAW = 1
+XOVERDRAW = 2
+XUNDERDRAW = 3
+XCURSORDRAW = 4
+X
+X# defines for defpattern
+XPATTERN_16 = 16
+XPATTERN_32 = 32
+XPATTERN_64 = 64
+X
+XPATTERN_16_SIZE = 16
+XPATTERN_32_SIZE = 64
+XPATTERN_64_SIZE = 256
+X
+X# defines for readsource
+XSRC_AUTO = 0
+XSRC_FRONT = 1
+XSRC_BACK = 2
+XSRC_ZBUFFER = 3
+XSRC_PUP = 4
+XSRC_OVER = 5
+XSRC_UNDER = 6
+XSRC_FRAMEGRABBER = 7
+X
+X# defines for blendfunction
+XBF_ZERO = 0
+XBF_ONE = 1
+XBF_DC = 2
+XBF_SC = 2
+XBF_MDC = 3
+XBF_MSC = 3
+XBF_SA = 4
+XBF_MSA = 5
+XBF_DA = 6
+XBF_MDA = 7
+X
+X# defines for zfunction
+XZF_NEVER = 0
+XZF_LESS = 1
+XZF_EQUAL = 2
+XZF_LEQUAL = 3
+XZF_GREATER = 4
+XZF_NOTEQUAL = 5
+XZF_GEQUAL = 6
+XZF_ALWAYS = 7
+X
+X# defines for zsource
+XZSRC_DEPTH = 0
+XZSRC_COLOR = 1
+X
+X# defines for pntsmooth
+XSMP_OFF = 0
+XSMP_ON = 1
+X
+X# defines for linesmooth
+XSML_OFF = 0
+XSML_ON = 1
+X
+X# defines for setpup
+XPUP_NONE = 0
+XPUP_GREY = 1
+X
+X# defines for glcompat
+XGLC_OLDPOLYGON = 0
+XGLC_ZRANGEMAP = 1
+X
+X# defines for curstype
+XC16X1 = 0
+XC16X2 = 1
+XC32X1 = 2
+XC32X2 = 3
+XCCROSS = 4
+X
+X# defines for shademodel
+XFLAT = 0
+XGOURAUD = 1
+X
+X# defines for logicop
+X### LO_ZERO = 0x0
+X### LO_AND = 0x1
+X### LO_ANDR = 0x2
+X### LO_SRC = 0x3
+X### LO_ANDI = 0x4
+X### LO_DST = 0x5
+X### LO_XOR = 0x6
+X### LO_OR = 0x7
+X### LO_NOR = 0x8
+X### LO_XNOR = 0x9
+X### LO_NDST = 0xa
+X### LO_ORR = 0xb
+X### LO_NSRC = 0xc
+X### LO_ORI = 0xd
+X### LO_NAND = 0xe
+X### LO_ONE = 0xf
+X
+X
+X#
+X# START defines for getgdesc
+X#
+X
+XGD_XPMAX = 0
+XGD_YPMAX = 1
+XGD_XMMAX = 2
+XGD_YMMAX = 3
+XGD_ZMIN = 4
+XGD_ZMAX = 5
+XGD_BITS_NORM_SNG_RED = 6
+XGD_BITS_NORM_SNG_GREEN = 7
+XGD_BITS_NORM_SNG_BLUE = 8
+XGD_BITS_NORM_DBL_RED = 9
+XGD_BITS_NORM_DBL_GREEN = 10
+XGD_BITS_NORM_DBL_BLUE = 11
+XGD_BITS_NORM_SNG_CMODE = 12
+XGD_BITS_NORM_DBL_CMODE = 13
+XGD_BITS_NORM_SNG_MMAP = 14
+XGD_BITS_NORM_DBL_MMAP = 15
+XGD_BITS_NORM_ZBUFFER = 16
+XGD_BITS_OVER_SNG_CMODE = 17
+XGD_BITS_UNDR_SNG_CMODE = 18
+XGD_BITS_PUP_SNG_CMODE = 19
+XGD_BITS_NORM_SNG_ALPHA = 21
+XGD_BITS_NORM_DBL_ALPHA = 22
+XGD_BITS_CURSOR = 23
+XGD_OVERUNDER_SHARED = 24
+XGD_BLEND = 25
+XGD_CIFRACT = 26
+XGD_CROSSHAIR_CINDEX = 27
+XGD_DITHER = 28
+XGD_LINESMOOTH_CMODE = 30
+XGD_LINESMOOTH_RGB = 31
+XGD_LOGICOP = 33
+XGD_NSCRNS = 35
+XGD_NURBS_ORDER = 36
+XGD_NBLINKS = 37
+XGD_NVERTEX_POLY = 39
+XGD_PATSIZE_64 = 40
+XGD_PNTSMOOTH_CMODE = 41
+XGD_PNTSMOOTH_RGB = 42
+XGD_PUP_TO_OVERUNDER = 43
+XGD_READSOURCE = 44
+XGD_READSOURCE_ZBUFFER = 48
+XGD_STEREO = 50
+XGD_SUBPIXEL_LINE = 51
+XGD_SUBPIXEL_PNT = 52
+XGD_SUBPIXEL_POLY = 53
+XGD_TRIMCURVE_ORDER = 54
+XGD_WSYS = 55
+XGD_ZDRAW_GEOM = 57
+XGD_ZDRAW_PIXELS = 58
+XGD_SCRNTYPE = 61
+XGD_TEXTPORT = 62
+XGD_NMMAPS = 63
+XGD_FRAMEGRABBER = 64
+XGD_TIMERHZ = 66
+XGD_DBBOX = 67
+XGD_AFUNCTION = 68
+XGD_ALPHA_OVERUNDER = 69
+XGD_BITS_ACBUF = 70
+XGD_BITS_ACBUF_HW = 71
+XGD_BITS_STENCIL = 72
+XGD_CLIPPLANES = 73
+XGD_FOGVERTEX = 74
+XGD_LIGHTING_TWOSIDE = 76
+XGD_POLYMODE = 77
+XGD_POLYSMOOTH = 78
+XGD_SCRBOX = 79
+XGD_TEXTURE = 80
+X
+X# return value for inquiries when there is no limit
+XGD_NOLIMIT = 2
+X
+X# return values for GD_WSYS
+XGD_WSYS_NONE = 0
+XGD_WSYS_4S = 1
+X
+X# return values for GD_SCRNTYPE
+XGD_SCRNTYPE_WM = 0
+XGD_SCRNTYPE_NOWM = 1
+X
+X#
+X# END defines for getgdesc
+X#
+X
+X
+X#
+X# START NURBS interface definitions
+X#
+X
+X# NURBS Rendering Properties
+XN_PIXEL_TOLERANCE = 1
+XN_CULLING = 2
+XN_DISPLAY = 3
+XN_ERRORCHECKING = 4
+XN_SUBDIVISIONS = 5
+XN_S_STEPS = 6
+XN_T_STEPS = 7
+XN_TILES = 8
+X
+XN_SHADED = 1.0
+X
+X# ---------------------------------------------------------------------------
+X# FLAGS FOR NURBS SURFACES AND CURVES
+X#
+X# Bit: 9876 5432 1 0
+X# |tttt|nnnn|f|r| : r - 1 bit = 1 if rational coordinate exists
+X# : f - 1 bit = 1 if rational coordinate is before rest
+X# : = 0 if rational coordinate is after rest
+X# : nnnn - 4 bits for number of coordinates
+X# : tttt - 4 bits for type of data (color, position, etc.)
+X#
+X# NURBS data type
+X# N_T_ST 0 parametric space data
+X# N_T_XYZ 1 model space data
+X#
+X# rational or non-rational data and position in memory
+X# N_NONRATIONAL 0 non-rational data
+X# N_RATAFTER 1 rational data with rat coord after rest
+X# N_RATBEFORE 3 rational data with rat coord before rest
+X#
+X# N_MKFLAG(a,b,c) ((a<<6) | (b<<2) | c)
+X#
+X# ---------------------------------------------------------------------------
+X#
+XN_ST = 0x8 # N_MKFLAG( N_T_ST, 2, N_NONRATIONAL )
+XN_STW = 0xd # N_MKFLAG( N_T_ST, 3, N_RATAFTER )
+XN_WST = 0xf # N_MKFLAG( N_T_ST, 3, N_RATBEFORE )
+XN_XYZ = 0x4c # N_MKFLAG( N_T_XYZ, 3, N_NONRATIONAL )
+XN_XYZW = 0x51 # N_MKFLAG( N_T_XYZ, 4, N_RATAFTER )
+XN_WXYZ = 0x53 # N_MKFLAG( N_T_XYZ, 4, N_RATBEFORE )
+X
+X#
+X# END NURBS interface definitions
+X#
+X
+X
+X#
+X# START lighting model defines
+X#
+X
+XLMNULL = 0.0
+X
+X# MATRIX modes
+XMSINGLE = 0
+XMPROJECTION = 1
+XMVIEWING = 2
+X
+X# LIGHT constants
+XMAXLIGHTS = 8
+XMAXRESTRICTIONS = 4
+X
+X# MATERIAL properties
+XDEFMATERIAL = 0
+XEMISSION = 1
+XAMBIENT = 2
+XDIFFUSE = 3
+XSPECULAR = 4
+XSHININESS = 5
+XCOLORINDEXES = 6
+XALPHA = 7
+X
+X# LIGHT properties
+XDEFLIGHT = 100
+XLCOLOR = 101
+XPOSITION = 102
+X
+X# LIGHTINGMODEL properties
+XDEFLMODEL = 200
+XLOCALVIEWER = 201
+XATTENUATION = 202
+X
+X# TARGET constants
+XMATERIAL = 1000
+XLIGHT0 = 1100
+XLIGHT1 = 1101
+XLIGHT2 = 1102
+XLIGHT3 = 1103
+XLIGHT4 = 1104
+XLIGHT5 = 1105
+XLIGHT6 = 1106
+XLIGHT7 = 1107
+XLMODEL = 1200
+X
+X# lmcolor modes
+XLMC_COLOR = 0
+XLMC_EMISSION = 1
+XLMC_AMBIENT = 2
+XLMC_DIFFUSE = 3
+XLMC_SPECULAR = 4
+XLMC_AD = 5
+XLMC_NULL = 6
+X
+X#
+X# END lighting model defines
+X#
+X
+X
+X#
+X# START distributed graphics library defines
+X#
+X
+XDGLSINK = 0 # sink connection
+XDGLLOCAL = 1 # local connection
+XDGLTSOCKET = 2 # tcp socket connection
+XDGL4DDN = 3 # 4DDN (DECnet)
+X
+X#
+X# END distributed graphics library defines
+X#
+EOF
+fi
+if test -s 'lib/calendar.py'
+then echo '*** I will not over-write existing file lib/calendar.py'
+else
+echo 'x - lib/calendar.py'
+sed 's/^X//' > 'lib/calendar.py' << 'EOF'
+X# module calendar
+X
+X##############################
+X# Calendar support functions #
+X##############################
+X
+X# This is based on UNIX ctime() et al. (also Standard C and POSIX)
+X# Subtle but crucial differences:
+X# - the order of the elements of a 'struct tm' differs, to ease sorting
+X# - months numbers are 1-12, not 0-11; month arrays have a dummy element 0
+X# - Monday is the first day of the week (numbered 0)
+X
+X# These are really parameters of the 'time' module:
+Xepoch = 1970 # Time began on January 1 of this year (00:00:00 UCT)
+Xday_0 = 3 # The epoch begins on a Thursday (Monday = 0)
+X
+X# Return 1 for leap years, 0 for non-leap years
+Xdef isleap(year):
+X return year % 4 = 0 and (year % 100 <> 0 or year % 400 = 0)
+X
+X# Constants for months referenced later
+XJanuary = 1
+XFebruary = 2
+X
+X# Number of days per month (except for February in leap years)
+Xmdays = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
+X
+X# Exception raised for bad input (with string parameter for details)
+Xerror = 'calendar error'
+X
+X# Turn seconds since epoch into calendar time
+Xdef gmtime(secs):
+X if secs < 0: raise error, 'negative input to gmtime()'
+X mins, secs = divmod(secs, 60)
+X hours, mins = divmod(mins, 60)
+X days, hours = divmod(hours, 24)
+X wday = (days + day_0) % 7
+X year = epoch
+X # XXX Most of the following loop can be replaced by one division
+X while 1:
+X yd = 365 + isleap(year)
+X if days < yd: break
+X days = days - yd
+X year = year + 1
+X yday = days
+X month = January
+X while 1:
+X md = mdays[month] + (month = February and isleap(year))
+X if days < md: break
+X days = days - md
+X month = month + 1
+X return year, month, days + 1, hours, mins, secs, yday, wday
+X # XXX Week number also?
+X
+X# Return number of leap years in range [y1, y2)
+X# Assume y1 <= y2 and no funny (non-leap century) years
+Xdef leapdays(y1, y2):
+X return (y2+3)/4 - (y1+3)/4
+X
+X# Inverse of gmtime():
+X# Turn UCT calendar time (less yday, wday) into seconds since epoch
+Xdef mktime(year, month, day, hours, mins, secs):
+X days = day - 1
+X for m in range(January, month): days = days + mdays[m]
+X if isleap(year) and month > February: days = days+1
+X days = days + (year-epoch)*365 + leapdays(epoch, year)
+X return ((days*24 + hours)*60 + mins)*60 + secs
+X
+X# Full and abbreviated names of weekdays
+Xday_name = ('Monday', 'Tuesday', 'Wednesday', 'Thursday')
+Xday_name = day_name + ('Friday', 'Saturday', 'Sunday')
+Xday_abbr = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')
+X
+X# Full and abbreviated of months (1-based arrays!!!)
+Xmonth_name = ('', 'January', 'February', 'March', 'April')
+Xmonth_name = month_name + ('May', 'June', 'July', 'August')
+Xmonth_name = month_name + ('September', 'October', 'November', 'December')
+Xmonth_abbr = (' ', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun')
+Xmonth_abbr = month_abbr + ('Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
+X
+X# Zero-fill string to two positions (helper for asctime())
+Xdef dd(s):
+X while len(s) < 2: s = '0' + s
+X return s
+X
+X# Blank-fill string to two positions (helper for asctime())
+Xdef zd(s):
+X while len(s) < 2: s = ' ' + s
+X return s
+X
+X# Turn calendar time as returned by gmtime() into a string
+X# (the yday parameter is for compatibility with gmtime())
+Xdef asctime(year, month, day, hours, mins, secs, yday, wday):
+X s = day_abbr[wday] + ' ' + month_abbr[month] + ' ' + zd(`day`)
+X s = s + ' ' + dd(`hours`) + ':' + dd(`mins`) + ':' + dd(`secs`)
+X return s + ' ' + `year`
+X
+X# Localization: Minutes West from Greenwich
+X# timezone = -2*60 # Middle-European time with DST on
+Xtimezone = 5*60 # EST (sigh -- THINK time() doesn't return UCT)
+X
+X# Local time ignores DST issues for now -- adjust 'timezone' to fake it
+Xdef localtime(secs):
+X return gmtime(secs - timezone*60)
+X
+X# UNIX-style ctime (except it doesn't append '\n'!)
+Xdef ctime(secs):
+X return asctime(localtime(secs))
+X
+X######################
+X# Non-UNIX additions #
+X######################
+X
+X# Calendar printing etc.
+X
+X# Return weekday (0-6 ~ Mon-Sun) for year (1970-...), month (1-12), day (1-31)
+Xdef weekday(year, month, day):
+X secs = mktime(year, month, day, 0, 0, 0)
+X days = secs / (24*60*60)
+X return (days + day_0) % 7
+X
+X# Return weekday (0-6 ~ Mon-Sun) and number of days (28-31) for year, month
+Xdef monthrange(year, month):
+X day1 = weekday(year, month, 1)
+X ndays = mdays[month] + (month = February and isleap(year))
+X return day1, ndays
+X
+X# Return a matrix representing a month's calendar
+X# Each row represents a week; days outside this month are zero
+Xdef _monthcalendar(year, month):
+X day1, ndays = monthrange(year, month)
+X rows = []
+X r7 = range(7)
+X day = 1 - day1
+X while day <= ndays:
+X row = [0, 0, 0, 0, 0, 0, 0]
+X for i in r7:
+X if 1 <= day <= ndays: row[i] = day
+X day = day + 1
+X rows.append(row)
+X return rows
+X
+X# Caching interface to _monthcalendar
+Xmc_cache = {}
+Xdef monthcalendar(year, month):
+X key = `year` + month_abbr[month]
+X try:
+X return mc_cache[key]
+X except RuntimeError:
+X mc_cache[key] = ret = _monthcalendar(year, month)
+X return ret
+X
+X# Center a string in a field
+Xdef center(str, width):
+X n = width - len(str)
+X if n < 0: return str
+X return ' '*(n/2) + str + ' '*(n-n/2)
+X
+X# XXX The following code knows that print separates items with space!
+X
+X# Print a single week (no newline)
+Xdef prweek(week, width):
+X for day in week:
+X if day = 0: print ' '*width,
+X else:
+X if width > 2: print ' '*(width-3),
+X if day < 10: print '',
+X print day,
+X
+X# Return a header for a week
+Xdef weekheader(width):
+X str = ''
+X for i in range(7):
+X if str: str = str + ' '
+X str = str + day_abbr[i%7][:width]
+X return str
+X
+X# Print a month's calendar
+Xdef prmonth(year, month):
+X print weekheader(3)
+X for week in monthcalendar(year, month):
+X prweek(week, 3)
+X print
+X
+X# Spacing between month columns
+Xspacing = ' '
+X
+X# 3-column formatting for year calendars
+Xdef format3c(a, b, c):
+X print center(a, 20), spacing, center(b, 20), spacing, center(c, 20)
+X
+X# Print a year's calendar
+Xdef prcal(year):
+X header = weekheader(2)
+X format3c('', `year`, '')
+X for q in range(January, January+12, 3):
+X print
+X format3c(month_name[q], month_name[q+1], month_name[q+2])
+X format3c(header, header, header)
+X data = []
+X height = 0
+X for month in range(q, q+3):
+X cal = monthcalendar(year, month)
+X if len(cal) > height: height = len(cal)
+X data.append(cal)
+X for i in range(height):
+X for cal in data:
+X if i >= len(cal):
+X print ' '*20,
+X else:
+X prweek(cal[i], 2)
+X print spacing,
+X print
+EOF
+fi
+if test -s 'lib/panel.py'
+then echo '*** I will not over-write existing file lib/panel.py'
+else
+echo 'x - lib/panel.py'
+sed 's/^X//' > 'lib/panel.py' << 'EOF'
+X# Module 'panel'
+X#
+X# Support for the Panel library.
+X# Uses built-in module 'pnl'.
+X# Applciations should use 'panel.function' instead of 'pnl.function';
+X# most 'pnl' functions are transparently exported by 'panel',
+X# but dopanel() is overridden and you have to use this version
+X# if you want to use callbacks.
+X
+X
+Ximport pnl
+X
+X
+Xdebug = 0
+X
+X
+X# Test if an object is a list.
+X#
+Xdef is_list(x):
+X return type(x) = type([])
+X
+X
+X# Reverse a list.
+X#
+Xdef reverse(list):
+X res = []
+X for item in list:
+X res.insert(0, item)
+X return res
+X
+X
+X# Get an attribute of a list, which may itself be another list.
+X# Don't use 'prop' for name.
+X#
+Xdef getattrlist(list, name):
+X for item in list:
+X if item and is_list(item) and item[0] = name:
+X return item[1:]
+X return []
+X
+X
+X# Get a property of a list, which may itself be another list.
+X#
+Xdef getproplist(list, name):
+X for item in list:
+X if item and is_list(item) and item[0] = 'prop':
+X if len(item) > 1 and item[1] = name:
+X return item[2:]
+X return []
+X
+X
+X# Test if an actuator description contains the property 'end-of-group'
+X#
+Xdef is_endgroup(list):
+X x = getproplist(list, 'end-of-group')
+X return (x and x[0] = '#t')
+X
+X
+X# Neatly display an actuator definition given as S-expression
+X# the prefix string is printed before each line.
+X#
+Xdef show_actuator(prefix, a):
+X for item in a:
+X if not is_list(item):
+X print prefix, item
+X elif item and item[0] = 'al':
+X print prefix, 'Subactuator list:'
+X for a in item[1:]:
+X show_actuator(prefix + ' ', a)
+X elif len(item) = 2:
+X print prefix, item[0], '=>', item[1]
+X elif len(item) = 3 and item[0] = 'prop':
+X print prefix, 'Prop', item[1], '=>',
+X print item[2]
+X else:
+X print prefix, '?', item
+X
+X
+X# Neatly display a panel.
+X#
+Xdef show_panel(prefix, p):
+X for item in p:
+X if not is_list(item):
+X print prefix, item
+X elif item and item[0] = 'al':
+X print prefix, 'Actuator list:'
+X for a in item[1:]:
+X show_actuator(prefix + ' ', a)
+X elif len(item) = 2:
+X print prefix, item[0], '=>', item[1]
+X elif len(item) = 3 and item[0] = 'prop':
+X print prefix, 'Prop', item[1], '=>',
+X print item[2]
+X else:
+X print prefix, '?', item
+X
+X
+X# Exception raised by build_actuator or build_panel.
+X#
+Xpanel_error = 'panel error'
+X
+X
+X# Dummy callback used to initialize the callbacks.
+X#
+Xdef dummy_callback(arg):
+X pass
+X
+X
+X# Assign attributes to members of the target.
+X# Attribute names in exclist are ignored.
+X# The member name is the attribute name prefixed with the prefix.
+X#
+Xdef assign_members(target, attrlist, exclist, prefix):
+X for item in attrlist:
+X if is_list(item) and len(item) = 2 and item[0] not in exclist:
+X name, value = item[0], item[1]
+X ok = 1
+X if value[0] in '-0123456789':
+X value = eval(value)
+X elif value[0] = '"':
+X value = value[1:-1]
+X elif value = 'move-then-resize':
+X # Strange default set by Panel Editor...
+X ok = 0
+X else:
+X print 'unknown value', value, 'for', name
+X ok = 0
+X if ok:
+X lhs = 'target.' + prefix + name
+X stmt = lhs + '=' + `value`
+X if debug: print 'exec', stmt
+X try:
+X exec(stmt + '\n')
+X except KeyboardInterrupt: # Don't catch this!
+X raise KeyboardInterrupt
+X except:
+X print 'assign failed:', stmt
+X
+X
+X# Build a real actuator from an actuator descriptior.
+X# Return a pair (actuator, name).
+X#
+Xdef build_actuator(descr):
+X namelist = getattrlist(descr, 'name')
+X if namelist:
+X # Assume it is a string
+X actuatorname = namelist[0][1:-1]
+X else:
+X actuatorname = ''
+X type = descr[0]
+X if type[:4] = 'pnl_': type = type[4:]
+X act = pnl.mkact(type)
+X act.downfunc = act.activefunc = act.upfunc = dummy_callback
+X #
+X assign_members(act, descr[1:], ['al', 'data', 'name'], '')
+X #
+X # Treat actuator-specific data
+X #
+X datalist = getattrlist(descr, 'data')
+X prefix = ''
+X if type[-4:] = 'puck':
+X prefix = 'puck_'
+X elif type = 'mouse':
+X prefix = 'mouse_'
+X assign_members(act, datalist, [], prefix)
+X #
+X return act, actuatorname
+X
+X
+X# Build all sub-actuators and add them to the super-actuator.
+X# The super-actuator must already have been added to the panel.
+X# Sub-actuators with defined names are added as members to the panel
+X# so they can be referenced as p.name.
+X#
+X# Note: I have no idea how panel.endgroup() works when applied
+X# to a sub-actuator.
+X#
+Xdef build_subactuators(panel, super_act, al):
+X #
+X # This is nearly the same loop as below in build_panel(),
+X # except a call is made to addsubact() instead of addact().
+X #
+X for a in al:
+X act, name = build_actuator(a)
+X act.addsubact(super_act)
+X if name:
+X stmt = 'panel.' + name + ' = act'
+X if debug: print 'exec', stmt
+X exec(stmt + '\n')
+X if is_endgroup(a):
+X panel.endgroup()
+X sub_al = getattrlist(a, 'al')
+X if sub_al:
+X build_subactuators(panel, act, sub_al)
+X #
+X # Fix the actuator to which whe just added subactuators.
+X # This can't hurt (I hope) and is needed for the scroll actuator.
+X #
+X super_act.fixact()
+X
+X
+X# Build a real panel from a panel definition.
+X# Return a panel object p, where for each named actuator a, p.name is a
+X# reference to a.
+X#
+Xdef build_panel(descr):
+X #
+X # Sanity check
+X #
+X if (not descr) or descr[0] <> 'panel':
+X raise panel_error, 'panel description must start with "panel"'
+X #
+X if debug: show_panel('', descr)
+X #
+X # Create an empty panel
+X #
+X panel = pnl.mkpanel()
+X #
+X # Assign panel attributes
+X #
+X assign_members(panel, descr[1:], ['al'], '')
+X #
+X # Look for actuator list
+X #
+X al = getattrlist(descr, 'al')
+X #
+X # The order in which actuators are created is important
+X # because of the endgroup() operator.
+X # Unfortunately the Panel Editor outputs the actuator list
+X # in reverse order, so we reverse it here.
+X #
+X al = reverse(al)
+X #
+X for a in al:
+X act, name = build_actuator(a)
+X act.addact(panel)
+X if name:
+X stmt = 'panel.' + name + ' = act'
+X exec(stmt + '\n')
+X if is_endgroup(a):
+X panel.endgroup()
+X sub_al = getattrlist(a, 'al')
+X if sub_al:
+X build_subactuators(panel, act, sub_al)
+X #
+X return panel
+X
+X
+X# Wrapper around pnl.dopanel() which calls call-back functions.
+X#
+Xdef my_dopanel():
+X # Extract only the first 4 elements to allow for future expansion
+X a, down, active, up = pnl.dopanel()[:4]
+X if down:
+X down.downfunc(down)
+X if active:
+X active.activefunc(active)
+X if up:
+X up.upfunc(up)
+X return a
+X
+X
+X# Create one or more panels from a description file (S-expressions)
+X# generated by the Panel Editor.
+X#
+Xdef defpanellist(file):
+X import panelparser
+X descrlist = panelparser.parse_file(open(file, 'r'))
+X panellist = []
+X for descr in descrlist:
+X panellist.append(build_panel(descr))
+X return panellist
+X
+X
+X# Import everything from built-in method pnl, so the user can always
+X# use panel.foo() instead of pnl.foo().
+X# This gives *no* performance penalty once this module is imported.
+X#
+Xfrom pnl import * # for export
+X
+Xdopanel = my_dopanel # override pnl.dopanel
+EOF
+fi
+if test -s 'src/acceler.c'
+then echo '*** I will not over-write existing file src/acceler.c'
+else
+echo 'x - src/acceler.c'
+sed 's/^X//' > 'src/acceler.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/* Parser accelerator module */
+X
+X/* The parser as originally conceived had disappointing performance.
+X This module does some precomputation that speeds up the selection
+X of a DFA based upon a token, turning a search through an array
+X into a simple indexing operation. The parser now cannot work
+X without the accelerators installed. Note that the accelerators
+X are installed dynamically when the parser is initialized, they
+X are not part of the static data structure written on graminit.[ch]
+X by the parser generator. */
+X
+X#include "pgenheaders.h"
+X#include "grammar.h"
+X#include "token.h"
+X#include "parser.h"
+X
+X/* Forward references */
+Xstatic void fixdfa PROTO((grammar *, dfa *));
+Xstatic void fixstate PROTO((grammar *, dfa *, state *));
+X
+Xvoid
+Xaddaccelerators(g)
+X grammar *g;
+X{
+X dfa *d;
+X int i;
+X#ifdef DEBUG
+X printf("Adding parser accellerators ...\n");
+X#endif
+X d = g->g_dfa;
+X for (i = g->g_ndfas; --i >= 0; d++)
+X fixdfa(g, d);
+X g->g_accel = 1;
+X#ifdef DEBUG
+X printf("Done.\n");
+X#endif
+X}
+X
+Xstatic void
+Xfixdfa(g, d)
+X grammar *g;
+X dfa *d;
+X{
+X state *s;
+X int j;
+X s = d->d_state;
+X for (j = 0; j < d->d_nstates; j++, s++)
+X fixstate(g, d, s);
+X}
+X
+Xstatic void
+Xfixstate(g, d, s)
+X grammar *g;
+X dfa *d;
+X state *s;
+X{
+X arc *a;
+X int k;
+X int *accel;
+X int nl = g->g_ll.ll_nlabels;
+X s->s_accept = 0;
+X accel = NEW(int, nl);
+X for (k = 0; k < nl; k++)
+X accel[k] = -1;
+X a = s->s_arc;
+X for (k = s->s_narcs; --k >= 0; a++) {
+X int lbl = a->a_lbl;
+X label *l = &g->g_ll.ll_label[lbl];
+X int type = l->lb_type;
+X if (a->a_arrow >= (1 << 7)) {
+X printf("XXX too many states!\n");
+X continue;
+X }
+X if (ISNONTERMINAL(type)) {
+X dfa *d1 = finddfa(g, type);
+X int ibit;
+X if (type - NT_OFFSET >= (1 << 7)) {
+X printf("XXX too high nonterminal number!\n");
+X continue;
+X }
+X for (ibit = 0; ibit < g->g_ll.ll_nlabels; ibit++) {
+X if (testbit(d1->d_first, ibit)) {
+X if (accel[ibit] != -1)
+X printf("XXX ambiguity!\n");
+X accel[ibit] = a->a_arrow | (1 << 7) |
+X ((type - NT_OFFSET) << 8);
+X }
+X }
+X }
+X else if (lbl == EMPTY)
+X s->s_accept = 1;
+X else if (lbl >= 0 && lbl < nl)
+X accel[lbl] = a->a_arrow;
+X }
+X while (nl > 0 && accel[nl-1] == -1)
+X nl--;
+X for (k = 0; k < nl && accel[k] == -1;)
+X k++;
+X if (k < nl) {
+X int i;
+X s->s_accel = NEW(int, nl-k);
+X if (s->s_accel == NULL) {
+X fprintf(stderr, "no mem to add parser accelerators\n");
+X exit(1);
+X }
+X s->s_lower = k;
+X s->s_upper = nl;
+X for (i = 0; k < nl; i++, k++)
+X s->s_accel[i] = accel[k];
+X }
+X DEL(accel);
+X}
+EOF
+fi
+if test -s 'src/classobject.c'
+then echo '*** I will not over-write existing file src/classobject.c'
+else
+echo 'x - src/classobject.c'
+sed 's/^X//' > 'src/classobject.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/* Class object implementation */
+X
+X#include "allobjects.h"
+X
+X#include "structmember.h"
+X
+Xtypedef struct {
+X OB_HEAD
+X object *cl_bases; /* A tuple */
+X object *cl_methods; /* A dictionary */
+X} classobject;
+X
+Xobject *
+Xnewclassobject(bases, methods)
+X object *bases; /* NULL or tuple of classobjects! */
+X object *methods;
+X{
+X classobject *op;
+X op = NEWOBJ(classobject, &Classtype);
+X if (op == NULL)
+X return NULL;
+X if (bases != NULL)
+X INCREF(bases);
+X op->cl_bases = bases;
+X INCREF(methods);
+X op->cl_methods = methods;
+X return (object *) op;
+X}
+X
+X/* Class methods */
+X
+Xstatic void
+Xclass_dealloc(op)
+X classobject *op;
+X{
+X int i;
+X if (op->cl_bases != NULL)
+X DECREF(op->cl_bases);
+X DECREF(op->cl_methods);
+X free((ANY *)op);
+X}
+X
+Xstatic object *
+Xclass_getattr(op, name)
+X register classobject *op;
+X register char *name;
+X{
+X register object *v;
+X v = dictlookup(op->cl_methods, name);
+X if (v != NULL) {
+X INCREF(v);
+X return v;
+X }
+X if (op->cl_bases != NULL) {
+X int n = gettuplesize(op->cl_bases);
+X int i;
+X for (i = 0; i < n; i++) {
+X v = class_getattr(gettupleitem(op->cl_bases, i), name);
+X if (v != NULL)
+X return v;
+X err_clear();
+X }
+X }
+X err_setstr(NameError, name);
+X return NULL;
+X}
+X
+Xtypeobject Classtype = {
+X OB_HEAD_INIT(&Typetype)
+X 0,
+X "class",
+X sizeof(classobject),
+X 0,
+X class_dealloc, /*tp_dealloc*/
+X 0, /*tp_print*/
+X class_getattr, /*tp_getattr*/
+X 0, /*tp_setattr*/
+X 0, /*tp_compare*/
+X 0, /*tp_repr*/
+X 0, /*tp_as_number*/
+X 0, /*tp_as_sequence*/
+X 0, /*tp_as_mapping*/
+X};
+X
+X
+X/* We're not done yet: next, we define class member objects... */
+X
+Xtypedef struct {
+X OB_HEAD
+X classobject *cm_class; /* The class object */
+X object *cm_attr; /* A dictionary */
+X} classmemberobject;
+X
+Xobject *
+Xnewclassmemberobject(class)
+X register object *class;
+X{
+X register classmemberobject *cm;
+X if (!is_classobject(class)) {
+X err_badcall();
+X return NULL;
+X }
+X cm = NEWOBJ(classmemberobject, &Classmembertype);
+X if (cm == NULL)
+X return NULL;
+X INCREF(class);
+X cm->cm_class = (classobject *)class;
+X cm->cm_attr = newdictobject();
+X if (cm->cm_attr == NULL) {
+X DECREF(cm);
+X return NULL;
+X }
+X return (object *)cm;
+X}
+X
+X/* Class member methods */
+X
+Xstatic void
+Xclassmember_dealloc(cm)
+X register classmemberobject *cm;
+X{
+X DECREF(cm->cm_class);
+X if (cm->cm_attr != NULL)
+X DECREF(cm->cm_attr);
+X free((ANY *)cm);
+X}
+X
+Xstatic object *
+Xclassmember_getattr(cm, name)
+X register classmemberobject *cm;
+X register char *name;
+X{
+X register object *v = dictlookup(cm->cm_attr, name);
+X if (v != NULL) {
+X INCREF(v);
+X return v;
+X }
+X v = class_getattr(cm->cm_class, name);
+X if (v == NULL)
+X return v; /* class_getattr() has set the error */
+X if (is_funcobject(v)) {
+X object *w = newclassmethodobject(v, (object *)cm);
+X DECREF(v);
+X return w;
+X }
+X DECREF(v);
+X err_setstr(NameError, name);
+X return NULL;
+X}
+X
+Xstatic int
+Xclassmember_setattr(cm, name, v)
+X classmemberobject *cm;
+X char *name;
+X object *v;
+X{
+X if (v == NULL)
+X return dictremove(cm->cm_attr, name);
+X else
+X return dictinsert(cm->cm_attr, name, v);
+X}
+X
+Xtypeobject Classmembertype = {
+X OB_HEAD_INIT(&Typetype)
+X 0,
+X "class member",
+X sizeof(classmemberobject),
+X 0,
+X classmember_dealloc, /*tp_dealloc*/
+X 0, /*tp_print*/
+X classmember_getattr, /*tp_getattr*/
+X classmember_setattr, /*tp_setattr*/
+X 0, /*tp_compare*/
+X 0, /*tp_repr*/
+X 0, /*tp_as_number*/
+X 0, /*tp_as_sequence*/
+X 0, /*tp_as_mapping*/
+X};
+X
+X
+X/* And finally, here are class method objects */
+X/* (Really methods of class members) */
+X
+Xtypedef struct {
+X OB_HEAD
+X object *cm_func; /* The method function */
+X object *cm_self; /* The object to which this applies */
+X} classmethodobject;
+X
+Xobject *
+Xnewclassmethodobject(func, self)
+X object *func;
+X object *self;
+X{
+X register classmethodobject *cm;
+X if (!is_funcobject(func)) {
+X err_badcall();
+X return NULL;
+X }
+X cm = NEWOBJ(classmethodobject, &Classmethodtype);
+X if (cm == NULL)
+X return NULL;
+X INCREF(func);
+X cm->cm_func = func;
+X INCREF(self);
+X cm->cm_self = self;
+X return (object *)cm;
+X}
+X
+Xobject *
+Xclassmethodgetfunc(cm)
+X register object *cm;
+X{
+X if (!is_classmethodobject(cm)) {
+X err_badcall();
+X return NULL;
+X }
+X return ((classmethodobject *)cm)->cm_func;
+X}
+X
+Xobject *
+Xclassmethodgetself(cm)
+X register object *cm;
+X{
+X if (!is_classmethodobject(cm)) {
+X err_badcall();
+X return NULL;
+X }
+X return ((classmethodobject *)cm)->cm_self;
+X}
+X
+X/* Class method methods */
+X
+X#define OFF(x) offsetof(classmethodobject, x)
+X
+Xstatic struct memberlist classmethod_memberlist[] = {
+X {"cm_func", T_OBJECT, OFF(cm_func)},
+X {"cm_self", T_OBJECT, OFF(cm_self)},
+X {NULL} /* Sentinel */
+X};
+X
+Xstatic object *
+Xclassmethod_getattr(cm, name)
+X register classmethodobject *cm;
+X char *name;
+X{
+X return getmember((char *)cm, classmethod_memberlist, name);
+X}
+X
+Xstatic void
+Xclassmethod_dealloc(cm)
+X register classmethodobject *cm;
+X{
+X DECREF(cm->cm_func);
+X DECREF(cm->cm_self);
+X free((ANY *)cm);
+X}
+X
+Xtypeobject Classmethodtype = {
+X OB_HEAD_INIT(&Typetype)
+X 0,
+X "class method",
+X sizeof(classmethodobject),
+X 0,
+X classmethod_dealloc, /*tp_dealloc*/
+X 0, /*tp_print*/
+X classmethod_getattr, /*tp_getattr*/
+X 0, /*tp_setattr*/
+X 0, /*tp_compare*/
+X 0, /*tp_repr*/
+X 0, /*tp_as_number*/
+X 0, /*tp_as_sequence*/
+X 0, /*tp_as_mapping*/
+X};
+EOF
+fi
+if test -s 'src/intobject.c'
+then echo '*** I will not over-write existing file src/intobject.c'
+else
+echo 'x - src/intobject.c'
+sed 's/^X//' > 'src/intobject.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/* Integer object implementation */
+X
+X#include "allobjects.h"
+X
+X/* Standard Booleans */
+X
+Xintobject FalseObject = {
+X OB_HEAD_INIT(&Inttype)
+X 0
+X};
+X
+Xintobject TrueObject = {
+X OB_HEAD_INIT(&Inttype)
+X 1
+X};
+X
+Xstatic object *
+Xerr_ovf()
+X{
+X err_setstr(OverflowError, "integer overflow");
+X return NULL;
+X}
+X
+Xstatic object *
+Xerr_zdiv()
+X{
+X err_setstr(ZeroDivisionError, "integer division by zero");
+X return NULL;
+X}
+X
+X/* Integers are quite normal objects, to make object handling uniform.
+X (Using odd pointers to represent integers would save much space
+X but require extra checks for this special case throughout the code.)
+X Since, a typical Python program spends much of its time allocating
+X and deallocating integers, these operations should be very fast.
+X Therefore we use a dedicated allocation scheme with a much lower
+X overhead (in space and time) than straight malloc(): a simple
+X dedicated free list, filled when necessary with memory from malloc().
+X*/
+X
+X#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */
+X#define N_INTOBJECTS (BLOCK_SIZE / sizeof(intobject))
+X
+Xstatic intobject *
+Xfill_free_list()
+X{
+X intobject *p, *q;
+X p = NEW(intobject, N_INTOBJECTS);
+X if (p == NULL)
+X return (intobject *)err_nomem();
+X q = p + N_INTOBJECTS;
+X while (--q > p)
+X *(intobject **)q = q-1;
+X *(intobject **)q = NULL;
+X return p + N_INTOBJECTS - 1;
+X}
+X
+Xstatic intobject *free_list = NULL;
+X
+Xobject *
+Xnewintobject(ival)
+X long ival;
+X{
+X register intobject *v;
+X if (free_list == NULL) {
+X if ((free_list = fill_free_list()) == NULL)
+X return NULL;
+X }
+X v = free_list;
+X free_list = *(intobject **)free_list;
+X NEWREF(v);
+X v->ob_type = &Inttype;
+X v->ob_ival = ival;
+X return (object *) v;
+X}
+X
+Xstatic void
+Xint_dealloc(v)
+X intobject *v;
+X{
+X *(intobject **)v = free_list;
+X free_list = v;
+X}
+X
+Xlong
+Xgetintvalue(op)
+X register object *op;
+X{
+X if (!is_intobject(op)) {
+X err_badcall();
+X return -1;
+X }
+X else
+X return ((intobject *)op) -> ob_ival;
+X}
+X
+X/* Methods */
+X
+Xstatic void
+Xint_print(v, fp, flags)
+X intobject *v;
+X FILE *fp;
+X int flags;
+X{
+X fprintf(fp, "%ld", v->ob_ival);
+X}
+X
+Xstatic object *
+Xint_repr(v)
+X intobject *v;
+X{
+X char buf[20];
+X sprintf(buf, "%ld", v->ob_ival);
+X return newstringobject(buf);
+X}
+X
+Xstatic int
+Xint_compare(v, w)
+X intobject *v, *w;
+X{
+X register long i = v->ob_ival;
+X register long j = w->ob_ival;
+X return (i < j) ? -1 : (i > j) ? 1 : 0;
+X}
+X
+Xstatic object *
+Xint_add(v, w)
+X intobject *v;
+X register object *w;
+X{
+X register long a, b, x;
+X if (!is_intobject(w)) {
+X err_badarg();
+X return NULL;
+X }
+X a = v->ob_ival;
+X b = ((intobject *)w) -> ob_ival;
+X x = a + b;
+X if ((x^a) < 0 && (x^b) < 0)
+X return err_ovf();
+X return newintobject(x);
+X}
+X
+Xstatic object *
+Xint_sub(v, w)
+X intobject *v;
+X register object *w;
+X{
+X register long a, b, x;
+X if (!is_intobject(w)) {
+X err_badarg();
+X return NULL;
+X }
+X a = v->ob_ival;
+X b = ((intobject *)w) -> ob_ival;
+X x = a - b;
+X if ((x^a) < 0 && (x^~b) < 0)
+X return err_ovf();
+X return newintobject(x);
+X}
+X
+Xstatic object *
+Xint_mul(v, w)
+X intobject *v;
+X register object *w;
+X{
+X register long a, b;
+X double x;
+X if (!is_intobject(w)) {
+X err_badarg();
+X return NULL;
+X }
+X a = v->ob_ival;
+X b = ((intobject *)w) -> ob_ival;
+X x = (double)a * (double)b;
+X if (x > 0x7fffffff || x < (double) (long) 0x80000000)
+X return err_ovf();
+X return newintobject(a * b);
+X}
+X
+Xstatic object *
+Xint_div(v, w)
+X intobject *v;
+X register object *w;
+X{
+X if (!is_intobject(w)) {
+X err_badarg();
+X return NULL;
+X }
+X if (((intobject *)w) -> ob_ival == 0)
+X return err_zdiv();
+X return newintobject(v->ob_ival / ((intobject *)w) -> ob_ival);
+X}
+X
+Xstatic object *
+Xint_rem(v, w)
+X intobject *v;
+X register object *w;
+X{
+X if (!is_intobject(w)) {
+X err_badarg();
+X return NULL;
+X }
+X if (((intobject *)w) -> ob_ival == 0)
+X return err_zdiv();
+X return newintobject(v->ob_ival % ((intobject *)w) -> ob_ival);
+X}
+X
+Xstatic object *
+Xint_pow(v, w)
+X intobject *v;
+X register object *w;
+X{
+X register long iv, iw, ix;
+X register int neg;
+X if (!is_intobject(w)) {
+X err_badarg();
+X return NULL;
+X }
+X iv = v->ob_ival;
+X iw = ((intobject *)w)->ob_ival;
+X neg = 0;
+X if (iw < 0)
+X neg = 1, iw = -iw;
+X ix = 1;
+X for (; iw > 0; iw--)
+X ix = ix * iv;
+X if (neg) {
+X if (ix == 0)
+X return err_zdiv();
+X ix = 1/ix;
+X }
+X /* XXX How to check for overflow? */
+X return newintobject(ix);
+X}
+X
+Xstatic object *
+Xint_neg(v)
+X intobject *v;
+X{
+X register long a, x;
+X a = v->ob_ival;
+X x = -a;
+X if (a < 0 && x < 0)
+X return err_ovf();
+X return newintobject(x);
+X}
+X
+Xstatic object *
+Xint_pos(v)
+X intobject *v;
+X{
+X INCREF(v);
+X return (object *)v;
+X}
+X
+Xstatic number_methods int_as_number = {
+X int_add, /*tp_add*/
+X int_sub, /*tp_subtract*/
+X int_mul, /*tp_multiply*/
+X int_div, /*tp_divide*/
+X int_rem, /*tp_remainder*/
+X int_pow, /*tp_power*/
+X int_neg, /*tp_negate*/
+X int_pos, /*tp_plus*/
+X};
+X
+Xtypeobject Inttype = {
+X OB_HEAD_INIT(&Typetype)
+X 0,
+X "int",
+X sizeof(intobject),
+X 0,
+X int_dealloc, /*tp_dealloc*/
+X int_print, /*tp_print*/
+X 0, /*tp_getattr*/
+X 0, /*tp_setattr*/
+X int_compare, /*tp_compare*/
+X int_repr, /*tp_repr*/
+X &int_as_number, /*tp_as_number*/
+X 0, /*tp_as_sequence*/
+X 0, /*tp_as_mapping*/
+X};
+EOF
+fi
+echo 'Part 13 out of 21 of pack.out complete.'
+exit 0