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 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