Newsgroups: comp.sources.misc
From: ijp@doc.ic.ac.uk (Ian Palmer)
Subject:  v26i030:  scamper - Cellular Automata Simulator, Part07/10
Message-ID: <1991Nov20.234112.14798@sparky.imd.sterling.com>
X-Md4-Signature: 24cc3f6d0cc9aa1b663e4751b763fbdd
Date: Wed, 20 Nov 1991 23:41:12 GMT
Approved: kent@sparky.imd.sterling.com

Submitted-by: ijp@doc.ic.ac.uk (Ian Palmer)
Posting-number: Volume 26, Issue 30
Archive-name: scamper/part07
Environment: X11R4, SunOS

---- CUT HERE -------- CUT HERE -------- CUT HERE -------- CUT HERE ----
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  stats.c makefile setup sca/mz.uuenc sca/sf.uuenc
# Wrapped by ijp@swan.doc.ic.ac.uk on Thu Nov  7 10:34:29 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'stats.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stats.c'\"
else
echo shar: Extracting \"'stats.c'\" \(11136 characters\)
sed "s/^X//" >'stats.c' <<'END_OF_FILE'
X/*
X
X
X
X   *****                 *****                   *****                 *****
X  *     *               *     *                 *     *               *     *
X  *                     *     *                 *     *               *     *
X   **         *****     *     *    *       *    *     *     ******    *     *
X     *       *     *    *******    **     **    ******     *          ******
X      **     *          *     *    * *   * *    *          *          * *
X        *    *          *     *    *  * *  *    *          *          *  *
X  *     *    *          *     *    *   *   *    *           *****     *   *
X   *****     *          *     *    *       *    *          *          *    *
X             *                     *       *               *
X             *     *               *       *               *
X              *****                *       *                ******
X
X
X
X                                 by Ian Palmer
X
X                                      at
X
X              Imperial College of Science, Technology and Medicine
X                             University of London
X
X
X
X
X--------------------------------------------------------------------------------
X| Scamper is supplied "as is", without express or implied warranty.            |
X|                                                                              |
X| Permission to use, copy, modify and distribute this software, and any        |
X| documentation, for any non-commercial purpose is hereby granted without fee, |
X| provided that all copyright messages, and permission notices, remain intact. |
X|                                                                              |
X| Copyright 1991 by Ian Palmer of Imperial College of Science, Technology      |
X| and Medicine, University of London.                                          |
X--------------------------------------------------------------------------------
X
X   _____
X  /_  _/  Let Total Chaos reign forever !       I.J.Palmer,
X   / /  ___      ______________                 Department of Computing,
X  / /  / __\      |    _                        Imperial College,
X /_/  / /         | <> | /-\ |_                 180 Queen's Gate,
X      \ \__           /             _           London SW7 2BZ.
X       \___/          \ |-| /-\ <> <
X                      ______________>           ijp@doc.ic.ac.uk
X  PANIC NOW
X  and avoid       23. Add to Celt's pub meal and produce utter turmoil. (6,8)
X  the rush.       -----------------------------------------------------------
X
X
X*/
X
X/*
X      Program Segment      : stats.c
X
X      Task                 : Collect, store and display statistics.
X
X*/
X
X#include <X11/Xlib.h>
X#include <stdlib.h>
X#include <stdio.h>
X#include "windows.h"
X#include "automata.h"
X#include "stats.h"
X
Xint stat_type , mid_stat ;
X
Xstruct stat {
X  int value ;
X  struct stat *next ;
X} ;
X
Xtypedef struct stat *STAT ;
X
Xint max,num,omax ;
XSTAT first_stat , last_stat;
X
X/* ------------------------------------------------------------------------ */
X
Xvoid reset_stats()
X/* Reset the stats (clear old stats) */
X{
X  max = 0;
X  num = 0;
X  last_stat = NULL ;
X}
X
X/* ------------------------------------------------------------------------ */
X
Xvoid init_stats()
X/* Initialize stats, as clear stats but also initializing numnber of stats displayed, and stat type. */
X{
X  max = 0;
X  num = 0;
X  mid_stat = 25 ;
X  stat_type = 0 ;
X  last_stat = NULL ;
X}
X
X/* ------------------------------------------------------------------------ */
X
Xvoid StatButton(x,y) int x,y ;
X/* Pre : Button pressed, x,y is position of mouse pointer within window
X   Post: If inside stats option, change the stat displayed
X*/
X{
X  int sx,sy,fx,fy ;
X
X  sx = DispX-150 ;
X  sy = DispY-115 ;
X  fx = DispX-50 ;
X  fy = DispY-85 ;
X  if ((x>sx) && (y>sy) && (x<fx) && (y<fy)) {
X    stat_type = (stat_type + 1) % 3 ;
X    display_stats(0,1);
X    };
X}
X
X/* ------------------------------------------------------------------------ */
X
Xvoid add_stat( n ) int n ;
X/* Pre : n is the number of alive cells currently in the domain
X   Post: n has been added to the stats
X*/
X{
X  STAT newstat ;
X
X  if (last_stat)                          /* If we have already some stats */
X    if (last_stat -> next)                /* Locate the end if space already allocated */
X      newstat = last_stat -> next ;
X    else {
X      newstat = (struct stat *) malloc( sizeof( struct stat )) ;
X      newstat -> next = NULL ;            /* Allocate a new stat and add it */
X      last_stat -> next = newstat ;
X      }
X  else
X    if (first_stat)
X      newstat = first_stat ;              /* New set of stats */
X    else {
X      newstat = (struct stat *) malloc( sizeof( struct stat )) ;
X      newstat -> next = NULL ;
X      first_stat = newstat ;              /* New stats */
X      };
X
X  newstat -> value = n ;
X  last_stat = newstat ;
X  if (n > max ) max = n ;
X  ++num;
X}
X
X/* ------------------------------------------------------------------------ */
X
Xvoid Button()
X/* Draws the `Toggle Graph' option in the window */
X{
X  int sx,sy,fx,fy ;
X
X  sx = DispX-150 ;                            /* Set position of option */
X  sy = DispY-115 ;
X  fx = DispX-50 ;
X  fy = DispY-85 ;
X  SetWindow(Display_Window);                  /* Select correct window and font and colour */
X  SelectFont(Small_Font);
X  SetColour(cols[domainfg]);
X  FillRectangle(sx,sy,fx,fy);                 /* Draw the option */
X  FillRectangle(sx-1,sy+1,fx+1,fy-1);
X  FillRectangle(sx+1,sy-1,fx-1,fy+1);
X  FillRectangle(sx-2,sy+2,fx+2,fy-2);
X  FillRectangle(sx+2,sy-2,fx-2,fy+2);
X  SetColour(cols[domainbg]);
X  FillRectangle(sx+3,sy+3,fx-3,fy-3);
X  FillRectangle(sx+2,sy+4,fx-2,fy-4);
X  FillRectangle(sx+4,sy+2,fx-4,fy-2);
X  FillRectangle(sx+1,sy+5,fx-1,fy-5);
X  FillRectangle(sx+5,sy+1,fx-5,fy-1);
X  SetColour(cols[domainfg]);
X  Centre("Toggle Graph",sx,sy,fx,fy);
X}
X
X/* ------------------------------------------------------------------------ */
X
Xvoid alternstats()
X/* Draws the colour density graph */
X{
X  int levels[256],x,y,X,Y,dx,dy,highest ;
X  float scx,scy ;
X  char top[20] ;
X
X  for(x=0 ; x<256 ; ++x)                                  /* Reset the levels array */
X    levels[x] = 0 ;
X
X  Y = 0 ;
X  for(x=0 ; x<max_x ; ++x)                                /* Go through domain counting each states level */
X    for(y=0 ; y<max_y ; ++y)
X      if ((++levels[array[x][y] -> state[new]]) > Y)
X        Y = levels[array[x][y] -> state[new]] ;
X
X  highest = 256 ;                                         /* Calculate the highest state number with at least one cell */
X  do {
X    --highest ;
X  } while( levels[highest] == 0);
X  highest += 1 ;
X
X  dx = DispX-100 ;
X  dy = 300 ;
X  ClearScreen();                                          /* Clear the screen, display title */
X  SelectFont(Large_Font);
X  SetColour(cols[domainfg]);
X  Centre("Statistics",0,0,DispX,50);
X  SelectFont(Small_Font);
X  Button();
X  XDrawLine( dpy,win,gc,50,50,50,dy+50);                  /* Draw axes */
X  XDrawLine( dpy,win,gc,50,dy+50,dx+50,dy+50);
X  Centre("Colour Density",DispX-150,DispY-85,DispX-50,DispY);
X  Centre("0",0,dy,50,dy+100);
X  sprintf(top,"%d",Y);
X  Centre(top,0,0,50,100);
X
X  scy = ( (float) dy / (float) Y ) ;
X  scx = ( (float) dx / (float) highest) ;
X  for(y=0 ; y<highest ; ++y)                              /* Draw the bar chart */
X    if (levels[y]) {
X      x = 50 + (int) (scx * (float) y) ;
X      X = 50 + (int) (scx * (float) (y+1)) ;
X      Y = dy + 50 - (int) (scy * (float) levels[y]) ;
X      SetColour(states[y].colour);
X      XFillRectangle(dpy,win,gc,x,Y,(X-x),(dy+50-Y));
X      SetColour(cols[domainfg]);
X      XDrawLine(dpy,win,gc,x,Y,x,dy+50);
X      XDrawLine(dpy,win,gc,x,Y,X,Y);
X      XDrawLine(dpy,win,gc,X,Y,X,dy+50);
X      };
X}
X
X/* ------------------------------------------------------------------------ */
X
Xint display_stats( n , newstat ) int n, newstat ;
X/* Displays normal stats, starting at stat number n, if newstat then clears screen first. */ 
X{
X  int m,ox,oy,dx,dy,total,Ox,Oy,shuffle , size;
X  float y,x,X,Y ;
X  STAT pointer ;
X  char top[100];
X
X  DisplayOn();
X  SetWindow(Display_Window);                      /* Select window */
X  display = 3 ;
X  if (stat_type == 2) {
X    alternstats();
X    return 0 ;
X    };
X  shuffle = 0 ;
X  size = num ;
X  if ((stat_type == 1) && (num > mid_stat)) {     /* If only some stats are to be displayed, select them */
X    n = num - mid_stat ;
X    shuffle = 1 ;
X    size = mid_stat ;
X    };
X  m = 0 ;
X  dx = DispX-100 ;
X  dy = 300 ;
X  pointer = first_stat ;
X
X  while( pointer && m++ != n)                     /* Move to first stat */
X    if (pointer != last_stat)
X      pointer = pointer -> next ;
X    else
X      pointer = NULL ;
X
X  m = 0;
X  SetColour(cols[domainfg]);
X  if (newstat) {                                  /* Clear screen in new stat, also update title, etc. */
X    ClearScreen();
X    SelectFont(Large_Font);
X    Centre("Statistics",0,0,DispX,50);
X    SelectFont(Small_Font);
X    Centre("0",0,dy,50,dy+100);
X    };
X  if (newstat || (max != omax)) {
X    SetColour(cols[domainbg]);
X    XFillRectangle(dpy, win, gc,0,30,49,70);
X    SetColour(cols[domainfg]);
X    sprintf(top,"%d",max);
X    Centre(top,0,0,50,100);
X    };
X  XDrawLine( dpy,win,gc,50,50,50,dy+50);          /* Draw axes */
X  XDrawLine( dpy,win,gc,50,dy+50,dx+50,dy+50);
X  if (stat_type == 0) 
X    Centre("Total History",DispX-150,DispY-85,DispX-50,DispY);
X  else {
X    sprintf(top,"Last %d",mid_stat);
X    Centre(top,DispX-150,DispY-85,DispX-50,DispY);
X    };
X  total = 0 ;
X  while( pointer  && (max != 0)) {                /* Draw the graph */
X    if (! newstat) {
X      X = 50 + ((float) m) / ((float) (size-1)) * ((float) dx) ;
X      Y = ((float) pointer->value)/((float) omax)*((float)dy) ;
X      };
X    x = 50 + ((float) m) / ((float) size) * ((float) dx) ;
X    y = ((float) pointer->value)/((float)max)*((float)dy) ;
X    total += pointer->value ;
X    if (m++) {
X      if (! newstat) {
X        SetColour(cols[domainbg]);
X        if (! shuffle)
X          XDrawLine(dpy,win,gc,Ox,Oy,(int) X, 50 + dy - (int) Y) ;
X        else
X          FillRectangle(Ox+1,50,(int) (X+3),dy + 49);
X        SetColour(cols[domainfg]);
X        };
X      XDrawLine( dpy, win, gc, ox , oy , (int) x , 50 + dy - (int) y);
X      };
X    ox = (int) x ;
X    oy = 50 + dy - (int) y ;
X    if (! newstat) {
X      Ox = (int) X ;
X      Oy = 50 + dy - (int) Y;
X      };
X    if (pointer != last_stat)
X      pointer = pointer -> next ;
X    else
X      pointer = NULL ;
X    };
X  if (newstat) {
X    Centre("Average number cells alive : ",175,dy+80,200,dy+110);   /* Display some more stats */
X    Centre("Number of generations : ",175,dy+110,200,dy+140);
X    Centre("Number of cells alive : ",175,dy+140,200,dy+170);
X    Button();
X    }
X  else {
X    SetColour(cols[domainbg]);
X    XFillRectangle( dpy, win, gc, 199,dy+75,65,100);
X    SetColour(cols[domainfg]);
X    };
X  if (num)
X    sprintf(top,"%d",(int) total/num) ;
X  else
X    sprintf(top,"unknown");
X  Centre(top,200,dy+80,260,dy+110);
X  sprintf(top,"%d",num);
X  Centre(top,200,dy+110,260,dy+140);
X  if (last_stat)
X    sprintf(top,"%d",last_stat -> value);
X  else
X    sprintf(top,"unknown");
X  Centre(top,200,dy+140,260,dy+170);
X  omax = max ;
X  return m ;
X}
END_OF_FILE
if test 11136 -ne `wc -c <'stats.c'`; then
    echo shar: \"'stats.c'\" unpacked with wrong size!
fi
# end of 'stats.c'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(783 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X# Makefile for Scamper
X# by Ian Palmer 1991
X
XNORM = -O -c
X
XMAIN = -O -o
X
Xscamper: automata.o windows.o domain.o calscan.o stats.o colour.o rules.o
X	cc $(MAIN) scamper automata.o windows.o domain.o calscan.o stats.o colour.o rules.o -lX11 -lm
X
Xautomata.o: windows.h automata.c domain.h calscan.h automata.h stats.h colour.h
X	cc $(NORM) automata.c
X
Xwindows.o: curtain.h windows.h windows.c
X	cc $(NORM) windows.c
X
Xdomain.o: domain.c domain.h
X	cc $(NORM) domain.c
X
Xcalscan.o: calscan.c automata.h calscan.h domain.h
X	cc $(NORM) calscan.c
X
Xstats.o: stats.c stats.h windows.h automata.h
X	cc $(NORM) stats.c
X
Xcolour.o: colour.c colour.h windows.h automata.h
X	cc $(NORM) colour.c
X
Xrules.o: rules.c rules.h windows.h automata.h calscan.h
X	cc $(NORM) rules.c
X
Xclean:
X	rm -f *.o
X	strip scamper
END_OF_FILE
if test 783 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'setup' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'setup'\"
else
echo shar: Extracting \"'setup'\" \(263 characters\)
sed "s/^X//" >'setup' <<'END_OF_FILE'
X#!/bin/csh -f
X#
X# finish unpacking the files
X#
Xcd sca
Xif (! -e JB.uuenc2) goto error
Xcat JB.uuenc2 >> JB.uuenc
Xrm JB.uuenc2
Xuudecode JB.uuenc
Xrm JB.uuenc
Xuudecode mz.uuenc
Xrm mz.uuenc
Xuudecode sf.uuenc
Xrm sf.uuenc
Xexit(0)
X
Xerror:
Xecho "Already uudecoded"
Xexit(1)
END_OF_FILE
if test 263 -ne `wc -c <'setup'`; then
    echo shar: \"'setup'\" unpacked with wrong size!
fi
chmod +x 'setup'
# end of 'setup'
fi
if test -f 'sca/mz.uuenc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sca/mz.uuenc'\"
else
echo shar: Extracting \"'sca/mz.uuenc'\" \(3508 characters\)
sed "s/^X//" >'sca/mz.uuenc' <<'END_OF_FILE'
Xbegin 644 mazeB.sca
XM-3 @-3 @,34*!  ! 0<%  $  0 !  $# 0$! 0$! 0$! 0$! 0$! 0$! 0$!
XM 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!!             $!    
XM 0$       $    !       ! 0 !  $  0           0$! 0$  0$! 0$ 
XM  $  0   0$!  $  0 !     0 !   !  $    ! 0$! 0$! 0 ! 0     !
XM     0$  0 ! 0 !  $  0 !  $! 0$!  $!  $    !  $        !  $!
XM  $!  $  0 !   !   !     0$!  $! 0    $   $  0$! 0$    ! 0$!
XM  $  0$  0     !     0$!  $!  $!     0    $  0$  0         !
XM      $  0 ! 0 !  $!  $  0    $   $   $  0$!  $! 0 ! 0 !  $!
XM 0 ! 0$! 0$  0 !  $!  $  0   0 ! 0$  0$  0$  0    $    !   !
XM  $  0$!         0 !  $  0$! 0 !  $!     0     !   ! 0$  0 !
XM 0$!  $  0 !  $  0$! 0$!  $  0 ! 0    $   $! 0$!  $! 0$!  $ 
XM   !                 0           0 !  $!  $  0$       $     
XM  $  0 ! 0$  0$! 0$! 0$! 0$! 0$! 0$! 0 !  $  0$  0   0$  0$!
XM 0$! 0$    !                 0            $   $  0 ! 0 ! 0  
XM   !  $  0   0$! 0$  0$! 0$! 0$! 0 !  $! 0$! 0$  0 ! 0 !  $!
XM   ! 0 ! 0$  0 ! 0                     !  $          0 !   !
XM  $  0$!       !       !  $! 0$! 0$! 0$! 0$! 0$  0$! 0$! 0 !
XM  $!  $  0 ! 0   0 ! 0$  0$!  $  0 !      $  0              
XM   !  $  0   0 !  $!  $!   !      $    !  $!  $    !  $! 0 !
XM 0$  0$!  $  0 !  $!  $  0$  0   0$! 0$  0$! 0$      0 ! 0$ 
XM              $  0 !  $   $  0 ! 0$!  $! 0   0    $  0 ! 0 !
XM     0$!  $  0$!  $    !  $  0$  0 !  $!       ! 0 ! 0$  0 !
XM  $!  $! 0       0    $  0$!  $  0 !   !  $  0$  0 !   !    
XM 0 !  $        !  $! 0 ! 0$  0 !     0 !  $  0$  0 ! 0 !  $!
XM  $! 0 !  $  0 ! 0$!  $            ! 0$  0$!  $  0$! 0 !  $!
XM  $   $    !  $  0 !     0$  0$!  $! 0 !          $  0      
XM  $  0$  0$  0$!  $  0 !  $  0 !          $   $! 0 ! 0$! 0 !
XM 0$! 0$! 0 ! 0   0    $  0 !  $  0    $!  $  0$  0$   $!   !
XM   !              $!  $! 0$            ! 0$  0   0       0$!
XM 0   0$!  $! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$    ! 0 ! 0$ 
XM 0     !  $!     0             ! 0                   0 !   !
XM  $    ! 0$!  $      0 !  $  0$! 0$!  $!  $! 0 ! 0$! 0$! 0 !
XM  $!  $! 0 !      $  0 ! 0 !  $  0    $   $  0$   $    !    
XM   !  $   $    !     0$  0           0 ! 0$  0$  0 ! 0$  0$!
XM     0$  0$  0 ! 0$  0$  0   0    $! 0$! 0 !   ! 0   0    $!
XM 0 !  $! 0$!     0 !     0 ! 0$! 0$! 0 ! 0    $!  $!   ! 0$!
XM  $  0$   $  0$!     0    $! 0$!         0$! 0$   $   $  0$!
XM   ! 0$  0 ! 0 ! 0 !  $  0 !  $  0 ! 0$! 0$  0         ! 0 !
XM 0 !  $!   ! 0$!#@$!  $!  $    ! 0$! 0 !         0$! 0 !  $ 
XM 0$    !  $   $!  $  0$! 0$  0$  0 ! 0$       $  0$  0 !  $!
XM  $! 0 !   !  $  0$   $       $! 0   0 !  $!   !  $! 0 !   !
XM              $!  $    ! 0$  0$  0$   $! 0 !     0   0$    !
XM 0$! 0$! 0$! 0$  0$! 0$! 0$! 0$  0   0$!   ! 0$!  $! 0 !  $!
XM   !   ! 0$!      $       $      0$! 0 ! 0   0   0$! 0   0$ 
XM  $  0   0$!  $      0$  0 !  $  0 ! 0     !   ! 0 ! 0    $!
XM  $!   ! 0 ! 0 !  $  0 ! 0   0    $  0    $   $!  $  0$!  $!
XM 0 ! 0$  0$!  $          0     ! 0 ! 0$! 0 ! 0 ! 0$! 0      
XM       !  $! 0   0$  0$!  $! 0$!  $!  $        !  $        !
XM  $!  $! 0$!  $   $! 0$!     0$  0    $   $  0 ! 0$  0$  0$ 
XM 0$!  $  0        $  0$  0$   $! 0     !  $  0$  0 !       !
XM     0         !  $  0 ! 0 ! 0 ! 0 ! 0 ! 0$! 0$  0     !  $!
XM 0$!  $!  $!  $! 0$!  $  0$! 0$!  $!  $!               ! 0$!
XM  $           $  0           0               0$  0$! 0$! 0$!
XM 0$! 0$! 0$! 0$! 0$! 0 ! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0      
XM                                                          $!
XM 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$!
X$ 0$! 0$!
X 
Xend
END_OF_FILE
if test 3508 -ne `wc -c <'sca/mz.uuenc'`; then
    echo shar: \"'sca/mz.uuenc'\" unpacked with wrong size!
fi
# end of 'sca/mz.uuenc'
fi
if test -f 'sca/sf.uuenc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sca/sf.uuenc'\"
else
echo shar: Extracting \"'sca/sf.uuenc'\" \(3496 characters\)
sed "s/^X//" >'sca/sf.uuenc' <<'END_OF_FILE'
Xbegin 644 selfdom.sca
XM-3 @-3 @. H !0&N AP@!                                       
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                             @(" @(" @(                     
XM                                  (!!P !!  !! (             
XM                                         @ " @(" @(  @      
XM                                               "!P(      @$"
XM                                                      (! @  
XM   " 0(                                                     
XM @ "      (! @                                              
XM       "!P(      @$"                                        
XM              (! @(" @(" 0(" @("                            
XM                     @ ' 0 ' 0 ' 0$! 0$"                    
XM                             @(" @(" @(" @(" @              
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XM                                                            
XI                                                        
X 
Xend
END_OF_FILE
if test 3496 -ne `wc -c <'sca/sf.uuenc'`; then
    echo shar: \"'sca/sf.uuenc'\" unpacked with wrong size!
fi
# end of 'sca/sf.uuenc'
fi
echo shar: End of shell archive.
exit 0
---- CUT HERE -------- CUT HERE -------- CUT HERE -------- CUT HERE ----


-- 
   _____            _____________________        Ian Palmer
  /_  _/           |                     |       Department of Computing,
   / /  ___        |                     |       Imperial College, 
  / /  / __\       | This space for rent |       180 Queen's Gate,
 /_/  / /          |                     |       London SW7 2BZ.
      \ \__        |_____________________|       
       \___/                 | |                 ijp@doc.ic.ac.uk
                            \|_|/                ijp=ack@doc.ic.ac.uk
  PANIC NOW
  and avoid       23. Add to Celt's pub meal and produce utter turmoil. (6,8)
  the rush.       -----------------------------------------------------------
"I'd love to go out with you, but I'm staying home to work on my
cottage cheese sculpture."

exit 0 # Just in case...
-- 
Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
Sterling Software, IMD           UUCP:     uunet!sparky!kent
Phone:    (402) 291-8300         FAX:      (402) 291-4362
Please send comp.sources.misc-related mail to kent@uunet.uu.net.
