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 18 out of 21:' if test -s 'demo/sgi/gl/backface.py' then echo '*** I will not over-write existing file demo/sgi/gl/backface.py' else echo 'x - demo/sgi/gl/backface.py' sed 's/^X//' > 'demo/sgi/gl/backface.py' << 'EOF' X#! /ufs/guido/bin/sgi/python X X# backface X# X# draw a cube that can run with backface() turned on or off. X# cube is moved when LEFTMOUSE is pressed and mouse itself is moved. X Xfrom gl import * Xfrom DEVICE import * Xfrom GL import * X XCUBE_SIZE = 200.0 XCUBE_OBJ = 1 X Xdef main () : X # X x = 0 X y = 0 X moveit = 0 X # X initialize() X # X while (1) : X # X while (qtest()) : X dev, val = qread() X # X if dev = ESCKEY : X backface(0) X return X # X elif dev = REDRAW : X reshapeviewport() X drawcube(x,y) X # X elif dev = LEFTMOUSE : X # X # LEFTMOUSE down X moveit = val X # X elif dev = BKEY : X backface(1) X drawcube(x,y) X # X elif dev = FKEY : X backface(0) X drawcube(x,y) X # X if moveit : X x = getvaluator(MOUSEX) X y = getvaluator(MOUSEY) X drawcube(x,y) X X Xdef initialize () : X foreground () X keepaspect (1, 1) X gid = winopen('backface') X winset(gid) X winconstraints() X # X doublebuffer() X gconfig() X shademodel(FLAT) X # X ortho(-1024.0, 1024.0, -1024.0, 1024.0, -1024.0, 1024.0) X # X qdevice(ESCKEY) X qdevice(REDRAW) X qdevice(LEFTMOUSE) X qdevice(BKEY) X qdevice(FKEY) X qenter(REDRAW,gid) X # X backface(1) X X# X# define a cube Xdef cube () : X # X # front face X pushmatrix() X translate(0.0,0.0,CUBE_SIZE) X color(RED) X rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE) X popmatrix() X # X # right face X pushmatrix() X translate(CUBE_SIZE, 0.0, 0.0) X rotate(900, 'y') X color(GREEN) X rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE) X popmatrix() X # X # back face X pushmatrix() X translate(0.0, 0.0, -CUBE_SIZE) X rotate(1800, 'y') X color(BLUE) X rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE) X popmatrix() X # X # left face X pushmatrix() X translate(-CUBE_SIZE, 0.0, 0.0) X rotate(-900, 'y') X color(CYAN) X rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE) X popmatrix() X # X # top face X pushmatrix() X translate(0.0, CUBE_SIZE, 0.0) X rotate(-900, 'x') X color(MAGENTA) X rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE) X popmatrix() X # X # bottom face X pushmatrix() X translate(0.0, -CUBE_SIZE, 0.0) X rotate(900, 'x') X color(YELLOW) X rectf(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE) X popmatrix() X Xdef drawcube(x,y) : X # X pushmatrix() X rotate(2*x, 'x') X rotate(2*y, 'y') X color(BLACK) X clear() X cube() X popmatrix() X swapbuffers() X X Xmain () EOF chmod +x 'demo/sgi/gl/backface.py' fi if test -s 'demo/sgi/gl/mclock.doc' then echo '*** I will not over-write existing file demo/sgi/gl/mclock.doc' else echo 'x - demo/sgi/gl/mclock.doc' sed 's/^X//' > 'demo/sgi/gl/mclock.doc' << 'EOF' XNewsgroups: cwi.sgi XSubject: Re: new clock XDistribution: cwi.sgi XReferences: <2246@charon.cwi.nl> X XLast week I wrote: X X>For your enjoyment I have implemented a colorful clock. X XThe clock has now been extended with some new facilities: a menu, an Xalarm and a gong. These may require some explanation beyond what's in Xthe usage message. X XMenu X---- XThe right mouse button now pops up a menu that allows you to turn the Xseconds hand on or off and to switch the alarm off. X XAlarm X----- X XThe left and middle buttons set the alarm. When it is on, the alarm Xtime is displayed as a time on a 24 hour clock in the bottom left Xcorner. It is also indicated by two red triangles, corresponding to the Xlittle (hours) and big (minutes) hand. These hands can be moved around: Xthe left mouse button moves the minutes hand, the middle button moves Xthe hourds hand. Watch out for differences of twelve hours (always Xcheck the digital display); these can be corrected by dragging the hours Xhand once around the dial. X XWhen the alarm goes off, two things happen: a shell command specified on Xthe command line with the -a option is executed (in the background), and Xthe clock's colors change every two seconds, for five minutes. You can Xalso turn the alarm off by using the menu accessible through the right Xmouse button. X XThere is no default command for the -a option; if it is not specified, Xonly the changing of the colors happens. If you have an 8 ohm speaker Xconnected to the audio output of your Personal Iris, a suitable command Xwould be: X X mclock -a '/ufs/guido/bin/sgi/play /ufs/guido/lib/sounds/alarm' X XGong X---- X XSome people like a clock that makes noises every hour, or even more Xoften. This is supported by the -g and -G options. With -g you specify Xa shell command to be executed to sound the gong; with -G you can Xspecify the interval between gong calls, in seconds (default is one hour). XThe shell command is executed in the background. It is given two Xarguments: the hours (on a 24 hour clock!) and the minutes. The Xexecutable Python script /ufs/guido/bin/sgi/chime is a suitable example. XAgain, this only works if you have installed a speaker (I bet 8 ohm Xspeakers are going to be in demand!) X X-- XGuido van Rossum, Centre for Mathematics and Computer Science (CWI), Amsterdam Xguido@cwi.nl or ..!hp4nl!cwi.nl!guido or guido%cwi.nl@uunet.uu.net X"A thing of beauty is a joy till sunrise" EOF fi if test -s 'demo/sgi/gl/mixing.py' then echo '*** I will not over-write existing file demo/sgi/gl/mixing.py' else echo 'x - demo/sgi/gl/mixing.py' sed 's/^X//' > 'demo/sgi/gl/mixing.py' << 'EOF' X#! /ufs/guido/bin/sgi/python X X# Use Gouraud shading to mix colors. Requires Z-buffer. X# It changes the color assignments so fast that you see white. X# Left button pauses, middle rotates the square. ESC to quit. X# Experiment with a larger window (too slow) or smaller window (really white). X Xfrom GL import * Xfrom gl import * Ximport DEVICE Xfrom math import * X X# X# tekenvlak : draw a square. with bgnpolygon X# Xdef tekenvlak (vc) : X bgnpolygon() X #vcarray (vc) X for i in vc : X c3f (i[1]) X v3f (i[0]) X endpolygon() X X# X# tekendoos : draw a box X# Xdef tekendoos (col) : X v = [(-5.0,0.0,0.0),(0.0,5.0,0.0),(5.0,0.0,0.0),(0.0,-5.0,0.0)] X vc = [(v[0],col[0]),(v[1],col[1]),(v[2],col[2]),(v[3],col[1])] X tekenvlak (vc) X X# X# initialize gl X# Xdef initgl () : X # X # open window X # X foreground () X keepaspect (1, 1) X prefposition (100, 500, 100, 500) X w = winopen ('PYTHON RGB') X keepaspect (1, 1) X winconstraints() X # X # configure pipeline (2buf, GOURAUD and RGBmode) X # X doublebuffer () X zbuffer (1) X shademodel (GOURAUD) X RGBmode () X gconfig () X # X # set viewing X # X perspective (900, 1, 1.0, 10.0) X polarview (10.0, 0, 0, 0) X # X # ask for the REDRAW and ESCKEY events X # X qdevice(DEVICE.MOUSE2) X qdevice(DEVICE.MOUSE3) X qdevice(DEVICE.REDRAW) X qdevice(DEVICE.ESCKEY) X X X# X# the color black X# Xblack = 0 X# X# GoForIT : use 2buf to redraw the object 2n times. index i is used as X# the (smoothly changing) rotation angle X# Xdef GoForIt(i) : X col = [(255.0,0.0,0.0), (0.0,255.0,0.0), (0.0,0.0,255.0)] X twist = 0 X freeze = 1 X while 1 : X if freeze <> 0 : X col[0],col[1],col[2] = col[1],col[2],col[0] X # X # clear z-buffer and clear background to light-blue X # X zclear() X cpack (black) X clear() X # X tekendoos (col) X # X swapbuffers() X # X if qtest() <> 0 : X dev, val = qread() X if dev = DEVICE.ESCKEY : X break X elif dev = DEVICE.REDRAW : X reshapeviewport () X elif dev = DEVICE.MOUSE2 and val <> 0 : X twist = twist + 30 X perspective (900, 1, 1.0, 10.0) X polarview (10.0, 0, 0, twist) X elif dev = DEVICE.MOUSE3 and val <> 0 : X freeze = 1 - freeze X X X# the main program X# Xdef main () : X initgl () X GoForIt (0) X X# X# exec main X# Xmain () EOF chmod +x 'demo/sgi/gl/mixing.py' fi if test -s 'demo/sgi/gl_panel/twoview/observer.s' then echo '*** I will not over-write existing file demo/sgi/gl_panel/twoview/observer.s' else echo 'x - demo/sgi/gl_panel/twoview/observer.s' sed 's/^X//' > 'demo/sgi/gl_panel/twoview/observer.s' << 'EOF' X;;; This file was automatically generated by the panel editor. X;;; If you read it into gnu emacs, it will automagically format itself. X X(panel (prop help creator:user-panel-help) X(prop user-panel #t) X(label "Observer Control") X(x 876) X(y 10) X(al (pnl_right_arrow_button (name "right") X(prop help creator:user-act-help) X(x 3.2) X(y 2.09) X(downfunc move-then-resize) X) X(pnl_up_double_arrow_button (name "fast_forward") X(prop help creator:user-act-help) X(label "step forward") X(x 2.66) X(y 3.13) X(h 0.45) X(labeltype 4) X(downfunc move-then-resize) X) X(pnl_up_arrow_button (name "forward") X(prop help creator:user-act-help) X(x 2.66) X(y 2.64) X(downfunc move-then-resize) X) X(pnl_down_arrow_button (name "reverse") X(prop help creator:user-act-help) X(x 2.66) X(y 1.49) X(h 0.45) X(labeltype 12) X(downfunc move-then-resize) X) X(pnl_down_double_arrow_button (name "fast_reverse") X(prop help creator:user-act-help) X(label "step back") X(x 2.66) X(y 1) X(labeltype 12) X(downfunc move-then-resize) X) X(pnl_left_arrow_button (name "left") X(prop help creator:user-act-help) X(x 2.11) X(y 2.09) X(downfunc move-then-resize) X) X(pnl_right_double_arrow_button (name "fast_right") X(prop help creator:user-act-help) X(label "turn right") X(x 3.75) X(y 2.09) X(downfunc move-then-resize) X) X(pnl_left_double_arrow_button (name "fast_left") X(prop help creator:user-act-help) X(label "turn left") X(x 1.57) X(y 2.09) X(labeltype 8) X(downfunc move-then-resize) X) X(pnl_vslider (name "ypos") X(prop help creator:user-act-help) X(x 6.25) X(y 1) X(w 0.4) X(h 2.9) X(val 0.0758) X(downfunc move-then-resize) X) X(pnl_down_arrow_button (name "down") X(prop help creator:user-act-help) X(label "eye height") X(x 6.25) X(y 0.5) X(labeltype 12) X(downfunc move-then-resize) X) X(pnl_up_arrow_button (name "up") X(prop help creator:user-act-help) X(x 6.25) X(y 4) X(downfunc move-then-resize) X) X) X) X;;; Local Variables: X;;; mode: scheme X;;; eval: (save-excursion (goto-char (point-min)) (kill-line 3)) X;;; eval: (save-excursion (goto-char (point-min)) (replace-regexp "[ \n]*)" ")")) X;;; eval: (indent-region (point-min) (point-max) nil) X;;; eval: (progn (kill-line -3) (delete-backward-char 1) (save-buffer)) X;;; End: EOF fi if test -s 'lib/CSplit.py' then echo '*** I will not over-write existing file lib/CSplit.py' else echo 'x - lib/CSplit.py' sed 's/^X//' > 'lib/CSplit.py' << 'EOF' X# A CSplit is a Clock-shaped split: the children are grouped in a circle. X# The numbering is a little different from a real clock: the 12 o'clock X# position is called 0, not 12. This is a little easier since Python X# usually counts from zero. (BTW, there needn't be exactly 12 children.) X X Xfrom math import pi, sin, cos Xfrom Split import Split X Xclass CSplit() = Split(): X # X def minsize(self, m): X # Since things look best if the children are spaced evenly X # along the circle (and often all children have the same X # size anyway) we compute the max child size and assume X # this is each child's size. X width, height = 0, 0 X for child in self.children: X wi, he = child.minsize(m) X width = max(width, wi) X height = max(height, he) X # In approximation, the diameter of the circle we need is X # (diameter of box) * (#children) / pi. X # We approximate pi by 3 (so we slightly overestimate X # our minimal size requirements -- not so bad). X # Because the boxes stick out of the circle we add the X # box size to each dimension. X # Because we really deal with ellipses, do everything X # separate in each dimension. X n = len(self.children) X return width + (width*n + 2)/3, height + (height*n + 2)/3 X # X def getbounds(self): X return self.bounds X # X def setbounds(self, bounds): X self.bounds = bounds X # Place the children. This involves some math. X # Compute center positions for children as if they were X # ellipses with a diameter about 1/N times the X # circumference of the big ellipse. X # (There is some rounding involved to make it look X # reasonable for small and large N alike.) X # XXX One day Python will have automatic conversions... X n = len(self.children) X fn = float(n) X if n = 0: return X (left, top), (right, bottom) = bounds X width, height = right-left, bottom-top X child_width, child_height = width*3/(n+4), height*3/(n+4) X half_width, half_height = \ X float(width-child_width)/2.0, \ X float(height-child_height)/2.0 X center_h, center_v = center = (left+right)/2, (top+bottom)/2 X fch, fcv = float(center_h), float(center_v) X alpha = 2.0 * pi / fn X for i in range(n): X child = self.children[i] X fi = float(i) X fh, fv = \ X fch + half_width*sin(fi*alpha), \ X fcv - half_height*cos(fi*alpha) X left, top = \ X int(fh) - child_width/2, \ X int(fv) - child_height/2 X right, bottom = \ X left + child_width, \ X top + child_height X child.setbounds((left, top), (right, bottom)) X # EOF fi if test -s 'lib/TransParent.py' then echo '*** I will not over-write existing file lib/TransParent.py' else echo 'x - lib/TransParent.py' sed 's/^X//' > 'lib/TransParent.py' << 'EOF' X# A class that sits transparently between a parent and one child. X# First create the parent, then this thing, then the child. X# Use this as a base class for objects that are almost transparent. X# Don't use as a base class for parents with multiple children. X XError = 'TransParent.Error' # Exception X Xclass ManageOneChild(): X # X # Upcalls shared with other single-child parents X # X def addchild(self, child): X if self.child: X raise Error, 'addchild: one child only' X if not child: X raise Error, 'addchild: bad child' X self.child = child X # X def delchild(self, child): X if not self.child: X raise Error, 'delchild: no child' X if child <> self.child: X raise Error, 'delchild: not my child' X self.child = 0 X Xclass TransParent() = ManageOneChild(): X # X # Calls from creator X # NB derived classes may add parameters to create() X # X def create(self, parent): X parent.addchild(self) X self.parent = parent X self.child = 0 # No child yet X # X # Downcalls from parent to child X # X def destroy(self): X del self.parent X if self.child: self.child.destroy() X del self.child X # X def minsize(self, m): X if not self.child: X return 0, 0 X else: X return self.child.minsize(m) X def getbounds(self, bounds): X if not self.child: X raise Error, 'getbounds w/o child' X else: X return self.child.getbounds() X def setbounds(self, bounds): X if not self.child: X raise Error, 'setbounds w/o child' X else: X self.child.setbounds(bounds) X def draw(self, args): X if self.child: X self.child.draw(args) X # X # Downcalls only made after certain upcalls X # X def mouse_down(self, detail): X if self.child: self.child.mouse_down(detail) X def mouse_move(self, detail): X if self.child: self.child.mouse_move(detail) X def mouse_up(self, detail): X if self.child: self.child.mouse_up(detail) X # X def timer(self): X if self.child: self.child.timer() X # X # Upcalls from child to parent X # X def need_mouse(self, child): X self.parent.need_mouse(self) X def no_mouse(self, child): X self.parent.no_mouse(self) X # X def need_timer(self, child): X self.parent.need_timer(self) X def no_timer(self, child): X self.parent.no_timer(self) X # X def begindrawing(self): X return self.parent.begindrawing() X def beginmeasuring(self): X return self.parent.beginmeasuring() X # X def change(self, area): X self.parent.change(area) X def scroll(self, args): X self.parent.scroll(args) X def settimer(self, itimer): X self.parent.settimer(itimer) EOF fi if test -s 'lib/auds.py' then echo '*** I will not over-write existing file lib/auds.py' else echo 'x - lib/auds.py' sed 's/^X//' > 'lib/auds.py' << 'EOF' Ximport audio X XRATE = 8192 X X# Initialize the audio stuff Xaudio.setrate(3) Xaudio.setoutgain(100) # for speaker X Xplay = audio.write X Xdef samp(n): X savegain = audio.getoutgain() X try: X audio.setoutgain(0) X x = raw_input('Hit Enter to sample ' + `n` + ' seconds: ') X return audio.read(n*RATE) X finally: X audio.setoutgain(savegain) X Xdef echo(s, delay, gain): X return s[:delay] + audio.add(s[delay:], audio.amplify(s, gain, gain)) X Xdef save(s, file): X f = open(file, 'w') X f.write(s) X Xdef load(file): X return loadfp(open(file, 'r')) X Xdef loadfp(fp): X s = '' X while 1: X buf = fp.read(16*1024) X if not buf: break X s = s + buf X return s X Xdef unbias(s): X if not s: return s X a = audio.chr2num(s) X sum = 0 X for i in a: sum = sum + i X bias = (sum + len(a)/2) / len(a) X print 'Bias value:', bias X if bias: X for i in range(len(a)): X a[i] = a[i] - bias X s = audio.num2chr(a) X return s X X# Stretch by a/b. X# Think of this as converting the sampling rate from a samples/sec X# to b samples/sec. Or, if the input is a bytes long, the output X# will be b bytes long. X# Xdef stretch(s, a, b): X y = audio.chr2num(s) X m = len(y) X out = [] X n = m * b / a X # i, j will walk through y and out (step 1) X # ib, ja are i*b, j*a and are kept as close together as possible X i, ib = 0, 0 X j, ja = 0, 0 X for j in range(n): X ja = ja+a X while ib < ja: X i = i+1 X ib = ib+b X if i >= m: X break X if ib = ja: X out.append(y[i]) X else: X out.append((y[i]*(ja-(ib-b)) + y[i-1]*(ib-ja)) / b) X return audio.num2chr(out) X Xdef sinus(freq): # return a 1-second sine wave X from math import sin, pi X factor = 2.0*pi*float(freq)/float(RATE) X list = range(RATE) X for i in list: X list[i] = int(sin(float(i) * factor) * 127.0) X return audio.num2chr(list) X Xdef softclip(s): X if '\177' not in s and '\200' not in s: X return s X num = audio.chr2num(s) X extremes = (-128, 127) X for i in range(1, len(num)-1): X if num[i] in extremes: X num[i] = (num[i-1] + num[i+1]) / 2 X return audio.num2chr(num) X Xdef demo(): X gday = load('gday')[1000:6000] X save(gday, 'gday0') X gg = [gday] X for i in range(1, 10): X for g in gg: play(g) X g = stretch(gday, 10, 10-i) X save(g, 'gday' + `i`) X gg.append(g) X while 1: X for g in gg: play(g) EOF fi if test -s 'lib/listwin.py' then echo '*** I will not over-write existing file lib/listwin.py' else echo 'x - lib/listwin.py' sed 's/^X//' > 'lib/listwin.py' << 'EOF' X# Module 'listwin' X# List windows, a subclass of gwin X Ximport gwin Ximport stdwin X Xdef maxlinewidth(a): # Compute maximum textwidth of lines in a sequence X max = 0 X for line in a: X width = stdwin.textwidth(line) X if width > max: max = width X return max X Xdef action(w, string, i, detail): # Default item selection method X pass X Xdef mup(w, detail): # Mouse up method X (h, v), clicks, button, mask = detail X i = divmod(v, w.lineheight)[0] X if 0 <= i < len(w.data): X w.action(w, w.data[i], i, detail) X Xdef draw(w, ((left, top), (right, bottom))): # Text window draw method X data = w.data X d = w.begindrawing() X lh = w.lineheight X itop = top/lh X ibot = (bottom-1)/lh + 1 X if itop < 0: itop = 0 X if ibot > len(data): ibot = len(data) X for i in range(itop, ibot): d.text((0, i*lh), data[i]) X Xdef open(title, data): # Display a list of texts in a window X lineheight = stdwin.lineheight() X h, v = maxlinewidth(data), len(data)*lineheight X h0, v0 = h + stdwin.textwidth(' '), v + lineheight X if h0 > stdwin.textwidth(' ')*80: h0 = 0 X if v0 > stdwin.lineheight()*24: v0 = 0 X stdwin.setdefwinsize(h0, v0) X w = gwin.open(title) X w.setdocsize(h, v) X w.lineheight = lineheight X w.data = data X w.draw = draw X w.action = action X w.mup = mup X return w EOF fi if test -s 'lib/macpath.py' then echo '*** I will not over-write existing file lib/macpath.py' else echo 'x - lib/macpath.py' sed 's/^X//' > 'lib/macpath.py' << 'EOF' X# module 'macpath' -- pathname (or -related) operations for the Macintosh X Ximport mac X Xfrom stat import * X X X# Return true if a path is absolute. X# On the Mac, relative paths begin with a colon, X# but as a special case, paths with no colons at all are also relative. X# Anything else is absolute (the string up to the first colon is the X# volume name). X Xdef isabs(s): X return ':' in s and s[0] <> ':' X X X# Concatenate two pathnames. X# The result is equivalent to what the second pathname would refer to X# if the first pathname were the current directory. X Xdef cat(s, t): X if (not s) or isabs(t): return t X if t[:1] = ':': t = t[1:] X if ':' not in s: X s = ':' + s X if s[-1:] <> ':': X s = s + ':' X return s + t X X X# Split a pathname in two parts: the directory leading up to the final bit, X# and the basename (the filename, without colons, in that directory). X# The result (s, t) is such that cat(s, t) yields the original argument. X Xdef split(s): X if ':' not in s: return '', s X colon = 0 X for i in range(len(s)): X if s[i] = ':': colon = i+1 X return s[:colon], s[colon:] X X X# Normalize a pathname: get rid of '::' sequences by backing up, X# e.g., 'foo:bar::bletch' becomes 'foo:bletch'. X# Raise the exception norm_error below if backing up is impossible, X# e.g., for '::foo'. X Xnorm_error = 'macpath.norm_error: path cannot be normalized' X Xdef norm(s): X import string X if ':' not in s: X return ':' + s X f = string.splitfields(s, ':') X pre = [] X post = [] X if not f[0]: X pre = f[:1] X f = f[1:] X if not f[len(f)-1]: X post = f[-1:] X f = f[:-1] X res = [] X for seg in f: X if seg: X res.append(seg) X else: X if not res: raise norm_error, 'path starts with ::' X del res[len(res)-1] X if not (pre or res): X raise norm_error, 'path starts with volume::' X if pre: res = pre + res X if post: res = res + post X s = res[0] X for seg in res[1:]: X s = s + ':' + seg X return s X X X# Return true if the pathname refers to an existing directory. X Xdef isdir(s): X try: X st = mac.stat(s) X except mac.error: X return 0 X return S_ISDIR(st[ST_MODE]) X X X# Return true if the pathname refers to an existing regular file. X Xdef isfile(s): X try: X st = mac.stat(s) X except mac.error: X return 0 X return S_ISREG(st[ST_MODE]) X X X# Return true if the pathname refers to an existing file or directory. X Xdef exists(s): X try: X st = mac.stat(s) X except mac.error: X return 0 X return 1 EOF fi if test -s 'lib/textwin.py' then echo '*** I will not over-write existing file lib/textwin.py' else echo 'x - lib/textwin.py' sed 's/^X//' > 'lib/textwin.py' << 'EOF' X# Module 'textwin' X X# Text windows, a subclass of gwin X Ximport stdwin Ximport stdwinsupport Ximport gwin X XS = stdwinsupport # Shorthand X X Xdef fixsize(w): X docwidth, docheight = w.text.getrect()[1] X winheight = w.getwinsize()[1] X if winheight > docheight: docheight = winheight X w.setdocsize(0, docheight) X fixeditmenu(w) X Xdef cut(w, m, id): X s = w.text.getfocustext() X if s: X stdwin.setcutbuffer(0, s) X w.text.replace('') X fixsize(w) X Xdef copy(w, m, id): X s = w.text.getfocustext() X if s: X stdwin.setcutbuffer(0, s) X fixeditmenu(w) X Xdef paste(w, m, id): X w.text.replace(stdwin.getcutbuffer(0)) X fixsize(w) X Xdef addeditmenu(w): X m = w.editmenu = w.menucreate('Edit') X m.action = [] X m.additem('Cut', 'X') X m.action.append(cut) X m.additem('Copy', 'C') X m.action.append(copy) X m.additem('Paste', 'V') X m.action.append(paste) X Xdef fixeditmenu(w): X m = w.editmenu X f = w.text.getfocus() X can_copy = (f[0] < f[1]) X m.enable(1, can_copy) X if not w.readonly: X m.enable(0, can_copy) X m.enable(2, (stdwin.getcutbuffer(0) <> '')) X Xdef draw(w, area): # Draw method X w.text.draw(area) X Xdef size(w, newsize): # Size method X w.text.move((0, 0), newsize) X fixsize(w) X Xdef close(w): # Close method X del w.text # Break circular ref X gwin.close(w) X Xdef char(w, c): # Char method X w.text.replace(c) X fixsize(w) X Xdef backspace(w): # Backspace method X void = w.text.event(S.we_command, w, S.wc_backspace) X fixsize(w) X Xdef arrow(w, detail): # Arrow method X w.text.arrow(detail) X fixeditmenu(w) X Xdef mdown(w, detail): # Mouse down method X void = w.text.event(S.we_mouse_down, w, detail) X fixeditmenu(w) X Xdef mmove(w, detail): # Mouse move method X void = w.text.event(S.we_mouse_move, w, detail) X Xdef mup(w, detail): # Mouse up method X void = w.text.event(S.we_mouse_up, w, detail) X fixeditmenu(w) X Xdef activate(w): # Activate method X fixeditmenu(w) X Xdef open(title, str): # Display a string in a window X w = gwin.open(title) X w.readonly = 0 X w.text = w.textcreate((0, 0), w.getwinsize()) X w.text.replace(str) X w.text.setfocus(0, 0) X addeditmenu(w) X fixsize(w) X w.draw = draw X w.size = size X w.close = close X w.mdown = mdown X w.mmove = mmove X w.mup = mup X w.char = char X w.backspace = backspace X w.arrow = arrow X w.activate = activate X return w X Xdef open_readonly(title, str): # Same with char input disabled X w = open(title, str) X w.readonly = 1 X w.char = w.backspace = gwin.nop X # Disable Cut and Paste menu item; leave Copy alone X w.editmenu.enable(0, 0) X w.editmenu.enable(2, 0) X return w EOF fi if test -s 'lib/zmod.py' then echo '*** I will not over-write existing file lib/zmod.py' else echo 'x - lib/zmod.py' sed 's/^X//' > 'lib/zmod.py' << 'EOF' X# module 'zmod' X X# Compute properties of mathematical "fields" formed by taking X# Z/n (the whole numbers modulo some whole number n) and an X# irreducible polynomial (i.e., a polynomial with only complex zeros), X# e.g., Z/5 and X**2 + 2. X# X# The field is formed by taking all possible linear combinations of X# a set of d base vectors (where d is the degree of the polynomial). X# X# Note that this procedure doesn't yield a field for all combinations X# of n and p: it may well be that some numbers have more than one X# inverse and others have none. This is what we check. X# X# Remember that a field is a ring where each element has an inverse. X# A ring has commutative addition and multiplication, a zero and a one: X# 0*x = x*0 = 0, 0+x = x+0 = x, 1*x = x*1 = x. Also, the distributive X# property holds: a*(b+c) = a*b + b*c. X# (XXX I forget if this is an axiom or follows from the rules.) X Ximport poly X X X# Example N and polynomial X XN = 5 XP = poly.plus(poly.one(0, 2), poly.one(2, 1)) # 2 + x**2 X X X# Return x modulo y. Returns >= 0 even if x < 0. X Xdef mod(x, y): X return divmod(x, y)[1] X X X# Normalize a polynomial modulo n and modulo p. X Xdef norm(a, n, p): X a = poly.modulo(a, p) X a = a[:] X for i in range(len(a)): a[i] = mod(a[i], n) X a = poly.normalize(a) X return a X X X# Make a list of all n^d elements of the proposed field. X Xdef make_all(mat): X all = [] X for row in mat: X for a in row: X all.append(a) X return all X Xdef make_elements(n, d): X if d = 0: return [poly.one(0, 0)] X sub = make_elements(n, d-1) X all = [] X for a in sub: X for i in range(n): X all.append(poly.plus(a, poly.one(d-1, i))) X return all X Xdef make_inv(all, n, p): X x = poly.one(1, 1) X inv = [] X for a in all: X inv.append(norm(poly.times(a, x), n, p)) X return inv X Xdef checkfield(n, p): X all = make_elements(n, len(p)-1) X inv = make_inv(all, n, p) X all1 = all[:] X inv1 = inv[:] X all1.sort() X inv1.sort() X if all1 = inv1: print 'BINGO!' X else: X print 'Sorry:', n, p X print all X print inv X Xdef rj(s, width): X if type(s) <> type(''): s = `s` X n = len(s) X if n >= width: return s X return ' '*(width - n) + s X Xdef lj(s, width): X if type(s) <> type(''): s = `s` X n = len(s) X if n >= width: return s X return s + ' '*(width - n) EOF fi if test -s 'src/PROTO.h' then echo '*** I will not over-write existing file src/PROTO.h' else echo 'x - src/PROTO.h' sed 's/^X//' > 'src/PROTO.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X/* XThe macro PROTO(x) is used to put function prototypes in the source. XThis is defined differently for compilers that support prototypes than Xfor compilers that don't. It should be used as follows: X int some_function PROTO((int arg1, char *arg2)); XA variant FPROTO(x) is used for cases where Standard C allows prototypes Xbut Think C doesn't (mostly function pointers). X XThis file also defines the macro HAVE_PROTOTYPES if and only if Xthe PROTO() macro expands the prototype. It is also allowed to predefine XHAVE_PROTOTYPES to force prototypes on. X*/ X X#ifndef PROTO X X#ifdef __STDC__ X#define HAVE_PROTOTYPES X#endif X X#ifdef THINK_C X#undef HAVE_PROTOTYPES X#define HAVE_PROTOTYPES X#endif X X#ifdef sgi X#ifdef mips X#define HAVE_PROTOTYPES X#endif X#endif X X#ifdef HAVE_PROTOTYPES X#define PROTO(x) x X#else X#define PROTO(x) () X#endif X X#endif /* PROTO */ X X X/* FPROTO() is for cases where Think C doesn't like prototypes */ X X#ifdef THINK_C X#define FPROTO(arglist) () X#else /* !THINK_C */ X#define FPROTO(arglist) PROTO(arglist) X#endif /* !THINK_C */ X X#ifndef HAVE_PROTOTYPES X#define const /*empty*/ X#else /* HAVE_PROTOTYPES */ X#ifdef THINK_C X#undef const X#define const /*empty*/ X#endif /* THINK_C */ X#endif /* HAVE_PROTOTYPES */ EOF fi if test -s 'src/bitset.c' then echo '*** I will not over-write existing file src/bitset.c' else echo 'x - src/bitset.c' sed 's/^X//' > 'src/bitset.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/* Bitset primitives used by the parser generator */ X X#include "pgenheaders.h" X#include "bitset.h" X Xbitset Xnewbitset(nbits) X int nbits; X{ X int nbytes = NBYTES(nbits); X bitset ss = NEW(BYTE, nbytes); X X if (ss == NULL) X fatal("no mem for bitset"); X X ss += nbytes; X while (--nbytes >= 0) X *--ss = 0; X return ss; X} X Xvoid Xdelbitset(ss) X bitset ss; X{ X DEL(ss); X} X Xint Xaddbit(ss, ibit) X bitset ss; X int ibit; X{ X int ibyte = BIT2BYTE(ibit); X BYTE mask = BIT2MASK(ibit); X X if (ss[ibyte] & mask) X return 0; /* Bit already set */ X ss[ibyte] |= mask; X return 1; X} X X#if 0 /* Now a macro */ Xint Xtestbit(ss, ibit) X bitset ss; X int ibit; X{ X return (ss[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0; X} X#endif X Xint Xsamebitset(ss1, ss2, nbits) X bitset ss1, ss2; X int nbits; X{ X int i; X X for (i = NBYTES(nbits); --i >= 0; ) X if (*ss1++ != *ss2++) X return 0; X return 1; X} X Xvoid Xmergebitset(ss1, ss2, nbits) X bitset ss1, ss2; X int nbits; X{ X int i; X X for (i = NBYTES(nbits); --i >= 0; ) X *ss1++ |= *ss2++; X} EOF fi if test -s 'src/configmac.c' then echo '*** I will not over-write existing file src/configmac.c' else echo 'x - src/configmac.c' sed 's/^X//' > 'src/configmac.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/* Configuration using STDWIN on the Mac (THINK_C or MPW) */ X X#ifdef THINK_C X#define USE_STDWIN X#endif X X#ifdef USE_STDWIN X#include "stdwin.h" X#endif X Xvoid Xinitargs(p_argc, p_argv) X int *p_argc; X char ***p_argv; X{ X#ifdef USE_STDWIN X X#ifdef THINK_C_3_0 X wsetstdio(1); X#else X /* This printf() statement is really needed only X to initialize THINK C 4.0's stdio: */ X printf( X"Python 4.0, Copyright 1990 Stichting Mathematisch Centrum, Amsterdam\n"); X#endif X X wargs(p_argc, p_argv); X#endif X} X Xvoid Xinitcalls() X{ X} X Xvoid Xdonecalls() X{ X#ifdef USE_STDWIN X wdone(); X#endif X} X X#ifndef PYTHONPATH X/* On the Mac, the search path is a space-separated list of directories */ X#define PYTHONPATH ": :lib :lib:stdwin :lib:mac :lib:demo" X#endif X Xchar * Xgetpythonpath() X{ X return PYTHONPATH; X} X X X/* Table of built-in modules. X These are initialized when first imported. */ X X/* Standard modules */ Xextern void inittime(); Xextern void initmath(); Xextern void initregexp(); X X/* Mac-specific modules */ Xextern void initmac(); X#ifdef USE_STDWIN Xextern void initstdwin(); X#endif X Xstruct { X char *name; X void (*initfunc)(); X} inittab[] = { X /* Standard modules */ X {"time", inittime}, X {"math", initmath}, X {"regexp", initregexp}, X X /* Mac-specific modules */ X {"mac", initmac}, X#ifdef USE_STDWIN X {"stdwin", initstdwin}, X#endif X {0, 0} /* Sentinel */ X}; EOF fi if test -s 'src/fgetsintr.c' then echo '*** I will not over-write existing file src/fgetsintr.c' else echo 'x - src/fgetsintr.c' sed 's/^X//' > 'src/fgetsintr.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/* Interruptable version of fgets(). X Return < 0 for interrupted, 1 for EOF, 0 for valid input. */ X X/* XXX This uses longjmp() from a signal out of fgets(). X Should use read() instead?! */ X X#include "pgenheaders.h" X X#include <signal.h> X#include <setjmp.h> X X#include "errcode.h" X#include "sigtype.h" X#include "fgetsintr.h" X X#ifndef AMOEBA X#define sig_block() /*empty*/ X#define sig_unblock() /*empty*/ X#endif X Xstatic jmp_buf jback; X Xstatic void catcher PROTO((int)); X Xstatic void Xcatcher(sig) X int sig; X{ X longjmp(jback, 1); X} X Xint Xfgets_intr(buf, size, fp) X char *buf; X int size; X FILE *fp; X{ X int ret; X SIGTYPE (*sigsave)(); X X if (setjmp(jback)) { X clearerr(fp); X signal(SIGINT, sigsave); X#ifdef THINK_C_3_0 X Set_Echo(1); X#endif X return E_INTR; X } X X /* The casts to (SIGTYPE(*)()) are needed by THINK_C only */ X X sigsave = signal(SIGINT, (SIGTYPE(*)()) SIG_IGN); X if (sigsave != (SIGTYPE(*)()) SIG_IGN) X signal(SIGINT, (SIGTYPE(*)()) catcher); X X#ifndef THINK_C X if (intrcheck()) X ret = E_INTR; X else X#endif X { X sig_block(); X ret = (fgets(buf, size, fp) == NULL) ? E_EOF : E_OK; X sig_unblock(); X } X X if (sigsave != (SIGTYPE(*)()) SIG_IGN) X signal(SIGINT, (SIGTYPE(*)()) sigsave); X return ret; X} EOF fi if test -s 'src/getcwd.c' then echo '*** I will not over-write existing file src/getcwd.c' else echo 'x - src/getcwd.c' sed 's/^X//' > 'src/getcwd.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/* Two PD getcwd() implementations. X Author: Guido van Rossum, CWI Amsterdam, Jan 1991, <guido@cwi.nl>. */ X X/* #define NO_GETWD /* Turn this on to popen pwd instead of calling getwd() */ X X#include <stdio.h> X#include <errno.h> X Xextern int errno; X X#ifndef NO_GETWD X X/* Default: Version for BSD systems -- use getwd() */ X X#include "sys/param.h" X Xextern char *getwd(); X Xchar * Xgetcwd(buf, size) X char *buf; X int size; X{ X char localbuf[MAXPATHLEN+1]; X char *ret; X X if (size <= 0) { X errno = EINVAL; X return NULL; X } X ret = getwd(localbuf); X if (ret != NULL && strlen(localbuf) >= size) { X errno = ERANGE; X return NULL; X } X if (ret == NULL) { X errno = EACCES; /* Most likely error */ X return NULL; X } X strncpy(buf, localbuf, size); X return buf; X} X X#else X X/* NO_GETWD defined: Version for backward UNIXes -- popen /bin/pwd */ X X#define PWD_CMD "/bin/pwd" X Xchar * Xgetcwd(buf, size) X char *buf; X int size; X{ X FILE *fp; X char *p; X int sts; X if (size <= 0) { X errno = EINVAL; X return NULL; X } X if ((fp = popen(PWD_CMD, "r")) == NULL) X return NULL; X if (fgets(buf, size, fp) == NULL || (sts = pclose(fp)) != 0) { X errno = EACCES; /* Most likely error */ X return NULL; X } X for (p = buf; *p != '\n'; p++) { X if (*p == '\0') { X errno = ERANGE; X return NULL; X } X } X *p = '\0'; X return buf; X} X X#endif EOF fi if test -s 'src/graminit.h' then echo '*** I will not over-write existing file src/graminit.h' else echo 'x - src/graminit.h' sed 's/^X//' > 'src/graminit.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X#define single_input 256 X#define file_input 257 X#define expr_input 258 X#define eval_input 259 X#define funcdef 260 X#define parameters 261 X#define fplist 262 X#define fpdef 263 X#define stmt 264 X#define simple_stmt 265 X#define expr_stmt 266 X#define print_stmt 267 X#define del_stmt 268 X#define pass_stmt 269 X#define flow_stmt 270 X#define break_stmt 271 X#define return_stmt 272 X#define raise_stmt 273 X#define import_stmt 274 X#define compound_stmt 275 X#define if_stmt 276 X#define while_stmt 277 X#define for_stmt 278 X#define try_stmt 279 X#define except_clause 280 X#define suite 281 X#define test 282 X#define and_test 283 X#define not_test 284 X#define comparison 285 X#define comp_op 286 X#define expr 287 X#define term 288 X#define factor 289 X#define atom 290 X#define trailer 291 X#define subscript 292 X#define exprlist 293 X#define testlist 294 X#define classdef 295 X#define baselist 296 X#define arguments 297 EOF fi if test -s 'src/listnode.c' then echo '*** I will not over-write existing file src/listnode.c' else echo 'x - src/listnode.c' sed 's/^X//' > 'src/listnode.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/* List a node on a file */ X X#include "pgenheaders.h" X#include "token.h" X#include "node.h" X X/* Forward */ Xstatic void list1node PROTO((FILE *, node *)); X Xvoid Xlisttree(n) X node *n; X{ X listnode(stdout, n); X} X Xstatic int level, atbol; X Xvoid Xlistnode(fp, n) X FILE *fp; X node *n; X{ X level = 0; X atbol = 1; X list1node(fp, n); X} X Xstatic void Xlist1node(fp, n) X FILE *fp; X node *n; X{ X if (n == 0) X return; X if (ISNONTERMINAL(TYPE(n))) { X int i; X for (i = 0; i < NCH(n); i++) X list1node(fp, CHILD(n, i)); X } X else if (ISTERMINAL(TYPE(n))) { X switch (TYPE(n)) { X case INDENT: X ++level; X break; X case DEDENT: X --level; X break; X default: X if (atbol) { X int i; X for (i = 0; i < level; ++i) X fprintf(fp, "\t"); X atbol = 0; X } X if (TYPE(n) == NEWLINE) { X if (STR(n) != NULL) X fprintf(fp, "%s", STR(n)); X fprintf(fp, "\n"); X atbol = 1; X } X else X fprintf(fp, "%s ", STR(n)); X break; X } X } X else X fprintf(fp, "? "); X} EOF fi if test -s 'src/listobject.h' then echo '*** I will not over-write existing file src/listobject.h' else echo 'x - src/listobject.h' sed 's/^X//' > 'src/listobject.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X/* List object interface */ X X/* X123456789-123456789-123456789-123456789-123456789-123456789-123456789-12 X XAnother generally useful object type is an list of object pointers. XThis is a mutable type: the list items can be changed, and items can be Xadded or removed. Out-of-range indices or non-list objects are ignored. X X*** WARNING *** setlistitem does not increment the new item's reference Xcount, but does decrement the reference count of the item it replaces, Xif not nil. It does *decrement* the reference count if it is *not* Xinserted in the list. Similarly, getlistitem does not increment the Xreturned item's reference count. X*/ X Xtypedef struct { X OB_VARHEAD X object **ob_item; X} listobject; X Xextern typeobject Listtype; X X#define is_listobject(op) ((op)->ob_type == &Listtype) X Xextern object *newlistobject PROTO((int size)); Xextern int getlistsize PROTO((object *)); Xextern object *getlistitem PROTO((object *, int)); Xextern int setlistitem PROTO((object *, int, object *)); Xextern int inslistitem PROTO((object *, int, object *)); Xextern int addlistitem PROTO((object *, object *)); Xextern int sortlist PROTO((object *)); X X/* Macro, trading safety for speed */ X#define GETLISTITEM(op, i) ((op)->ob_item[i]) EOF fi if test -s 'src/node.c' then echo '*** I will not over-write existing file src/node.c' else echo 'x - src/node.c' sed 's/^X//' > 'src/node.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/* Parse tree node implementation */ X X#include "pgenheaders.h" X#include "node.h" X Xnode * Xnewtree(type) X int type; X{ X node *n = NEW(node, 1); X if (n == NULL) X return NULL; X n->n_type = type; X n->n_str = NULL; X n->n_lineno = 0; X n->n_nchildren = 0; X n->n_child = NULL; X return n; X} X X#define XXX 3 /* Node alignment factor to speed up realloc */ X#define XXXROUNDUP(n) ((n) == 1 ? 1 : ((n) + XXX - 1) / XXX * XXX) X Xnode * Xaddchild(n1, type, str, lineno) X register node *n1; X int type; X char *str; X int lineno; X{ X register int nch = n1->n_nchildren; X register int nch1 = nch+1; X register node *n; X if (XXXROUNDUP(nch) < nch1) { X n = n1->n_child; X nch1 = XXXROUNDUP(nch1); X RESIZE(n, node, nch1); X if (n == NULL) X return NULL; X n1->n_child = n; X } X n = &n1->n_child[n1->n_nchildren++]; X n->n_type = type; X n->n_str = str; X n->n_lineno = lineno; X n->n_nchildren = 0; X n->n_child = NULL; X return n; X} X X/* Forward */ Xstatic void freechildren PROTO((node *)); X X Xvoid Xfreetree(n) X node *n; X{ X if (n != NULL) { X freechildren(n); X DEL(n); X } X} X Xstatic void Xfreechildren(n) X node *n; X{ X int i; X for (i = NCH(n); --i >= 0; ) X freechildren(CHILD(n, i)); X if (n->n_child != NULL) X DEL(n->n_child); X if (STR(n) != NULL) X DEL(STR(n)); X} EOF fi if test -s 'src/stringobject.h' then echo '*** I will not over-write existing file src/stringobject.h' else echo 'x - src/stringobject.h' sed 's/^X//' > 'src/stringobject.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X/* String object interface */ X X/* X123456789-123456789-123456789-123456789-123456789-123456789-123456789-12 X XType stringobject represents a character string. An extra zero byte is Xreserved at the end to ensure it is zero-terminated, but a size is Xpresent so strings with null bytes in them can be represented. This Xis an immutable object type. X XThere are functions to create new string objects, to test Xan object for string-ness, and to get the Xstring value. The latter function returns a null pointer Xif the object is not of the proper type. XThere is a variant that takes an explicit size as well as a Xvariant that assumes a zero-terminated string. Note that none of the Xfunctions should be applied to nil objects. X*/ X X/* NB The type is revealed here only because it is used in dictobject.c */ X Xtypedef struct { X OB_VARHEAD X char ob_sval[1]; X} stringobject; X Xextern typeobject Stringtype; X X#define is_stringobject(op) ((op)->ob_type == &Stringtype) X Xextern object *newsizedstringobject PROTO((char *, int)); Xextern object *newstringobject PROTO((char *)); Xextern unsigned int getstringsize PROTO((object *)); Xextern char *getstringvalue PROTO((object *)); Xextern void joinstring PROTO((object **, object *)); Xextern int resizestring PROTO((object **, int)); X X/* Macro, trading safety for speed */ X#define GETSTRINGVALUE(op) ((op)->ob_sval) EOF fi if test -s 'src/structmember.h' then echo '*** I will not over-write existing file src/structmember.h' else echo 'x - src/structmember.h' sed 's/^X//' > 'src/structmember.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X/* Interface to map C struct members to Python object attributes */ X X/* The offsetof() macro calculates the offset of a structure member X in its structure. Unfortunately this cannot be written down X portably, hence it is provided by a Standard C header file. X For pre-Standard C compilers, here is a version that usually works X (but watch out!): */ X X#ifndef offsetof X#define offsetof(type, member) ( (int) & ((type*)0) -> member ) X#endif X X/* An array of memberlist structures defines the name, type and offset X of selected members of a C structure. These can be read by X getmember() and set by setmember() (except if their READONLY flag X is set). The array must be terminated with an entry whose name X pointer is NULL. */ X Xstruct memberlist { X char *name; X int type; X int offset; X int readonly; X}; X X/* Types */ X#define T_SHORT 0 X#define T_INT 1 X#define T_LONG 2 X#define T_FLOAT 3 X#define T_DOUBLE 4 X#define T_STRING 5 X#define T_OBJECT 6 X X/* Readonly flag */ X#define READONLY 1 X#define RO READONLY /* Shorthand */ X Xobject *getmember PROTO((char *, struct memberlist *, char *)); Xint setmember PROTO((char *, struct memberlist *, char *, object *)); EOF fi if test -s 'src/tokenizer.h' then echo '*** I will not over-write existing file src/tokenizer.h' else echo 'x - src/tokenizer.h' sed 's/^X//' > 'src/tokenizer.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X/* Tokenizer interface */ X X#include "token.h" /* For token types */ X X#define MAXINDENT 100 /* Max indentation level */ X X/* Tokenizer state */ Xstruct tok_state { X /* Input state; buf <= cur <= inp <= end */ X /* NB an entire token must fit in the buffer */ X char *buf; /* Input buffer */ X char *cur; /* Next character in buffer */ X char *inp; /* End of data in buffer */ X char *end; /* End of input buffer */ X int done; /* 0 normally, 1 at EOF, -1 after error */ X FILE *fp; /* Rest of input; NULL if tokenizing a string */ X int tabsize; /* Tab spacing */ X int indent; /* Current indentation index */ X int indstack[MAXINDENT]; /* Stack of indents */ X int atbol; /* Nonzero if at begin of new line */ X int pendin; /* Pending indents (if > 0) or dedents (if < 0) */ X char *prompt, *nextprompt; /* For interactive prompting */ X int lineno; /* Current line number */ X}; X Xextern struct tok_state *tok_setups PROTO((char *)); Xextern struct tok_state *tok_setupf PROTO((FILE *, char *ps1, char *ps2)); Xextern void tok_free PROTO((struct tok_state *)); Xextern int tok_get PROTO((struct tok_state *, char **, char **)); EOF fi if test -s 'src/tupleobject.h' then echo '*** I will not over-write existing file src/tupleobject.h' else echo 'x - src/tupleobject.h' sed 's/^X//' > 'src/tupleobject.h' << 'EOF' X/*********************************************************** XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The XNetherlands. X X All Rights Reserved X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation, and that the names of Stichting Mathematisch XCentrum or CWI not be used in advertising or publicity pertaining to Xdistribution of the software without specific, written prior permission. X XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. X X******************************************************************/ X X/* Tuple object interface */ X X/* X123456789-123456789-123456789-123456789-123456789-123456789-123456789-12 X XAnother generally useful object type is an tuple of object pointers. XThis is a mutable type: the tuple items can be changed (but not their Xnumber). Out-of-range indices or non-tuple objects are ignored. X X*** WARNING *** settupleitem does not increment the new item's reference Xcount, but does decrement the reference count of the item it replaces, Xif not nil. It does *decrement* the reference count if it is *not* Xinserted in the tuple. Similarly, gettupleitem does not increment the Xreturned item's reference count. X*/ X Xtypedef struct { X OB_VARHEAD X object *ob_item[1]; X} tupleobject; X Xextern typeobject Tupletype; X X#define is_tupleobject(op) ((op)->ob_type == &Tupletype) X Xextern object *newtupleobject PROTO((int size)); Xextern int gettuplesize PROTO((object *)); Xextern object *gettupleitem PROTO((object *, int)); Xextern int settupleitem PROTO((object *, int, object *)); X X/* Macro, trading safety for speed */ X#define GETTUPLEITEM(op, i) ((op)->ob_item[i]) EOF fi echo 'Part 18 out of 21 of pack.out complete.' exit 0