amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (08/18/90)
Submitted-by: thyssen@batserver.cs.uq.oz.au (Anthony Thyssen)
Posting-number: Volume 90, Issue 226
Archive-name: examples/crabs/part01
[ uuencoded executable, bitmaps, and icons included ...tad ]
This program is a hack I wanted to do for the amiga after seeing
an article about crabs in Scientific American. The program is my own
and is different to the original idea in that the crabs reproduce.
The source is included and is a good example of hacking the main
workbench screen directly
#!/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 archive 1 (of 1)."
# Contents: .info.uu blob blobmask crab16.uu crab8 crabmask16.uu
# crabmask8 crabs.c crabs.h crabs.info.uu crabs.uu intergerize.c
# makefile merge.c rotate.c
# Wrapped by tadguy@abcfd20 on Fri Aug 17 14:39:29 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f '.info.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'.info.uu'\"
else
echo shar: Extracting \"'.info.uu'\" \(66 characters\)
sed "s/^X//" >'.info.uu' <<'END_OF_FILE'
Xbegin 644 .info
X6\TP`$@``$2D```+-```*X&-R86)S"@``9
X``
Xend
Xsize 22
END_OF_FILE
if test 66 -ne `wc -c <'.info.uu'`; then
echo shar: \"'.info.uu'\" unpacked with wrong size!
fi
# end of '.info.uu'
fi
if test -f 'blob' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'blob'\"
else
echo shar: Extracting \"'blob'\" \(78 characters\)
sed "s/^X//" >'blob' <<'END_OF_FILE'
X............
X....****....
X..********..
X..********..
X....****....
X............
END_OF_FILE
if test 78 -ne `wc -c <'blob'`; then
echo shar: \"'blob'\" unpacked with wrong size!
fi
# end of 'blob'
fi
if test -f 'blobmask' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'blobmask'\"
else
echo shar: Extracting \"'blobmask'\" \(78 characters\)
sed "s/^X//" >'blobmask' <<'END_OF_FILE'
X...******...
X.**********.
X************
X************
X.**********.
X...******...
END_OF_FILE
if test 78 -ne `wc -c <'blobmask'`; then
echo shar: \"'blobmask'\" unpacked with wrong size!
fi
# end of 'blobmask'
fi
if test -f 'crab16.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crab16.uu'\"
else
echo shar: Extracting \"'crab16.uu'\" \(572 characters\)
sed "s/^X//" >'crab16.uu' <<'END_OF_FILE'
Xbegin 644 crab16
XM+BXN+BXN+BXN+BXN+BXN+@HN+BXN+BXN+BXN+BXN+BXN"BXN+BXJ*BXN+BXJ"
XM*BXN+BX*+BXN*BHJ+BXN+BHJ*BXN+@HN+BXJ*BXN+BXN+BHJ+BXN"BXN*BXNZ
XM+BHN+BHN+BXJ+BX*+BXJ+BXN*BHJ*BXN+BHN+@HN+BXJ*BHJ*BHJ*BHJ+BXN"
XM"BXN+BXN*BHJ*BHJ+BXN+BX*+BXJ*BHJ*BHJ*BHJ*BHN+@HN*BXN+BHJ*BHJ*
XM*BXN+BHN"BXN+BXJ+BHJ*BHN*BXN+BX*+BXN*BXN+BXN+BXN*BXN+@HN+BXJ^
XM*BXN+BXN+BHJ+BXN"BXN+BXN+BXN+BXN+BXN+BX*+BXN+BXN+BXN+BXN+BXN"
XM+@H:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:6
XM&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:2
X8&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:P
X``
Xend
Xsize 384
END_OF_FILE
if test 572 -ne `wc -c <'crab16.uu'`; then
echo shar: \"'crab16.uu'\" unpacked with wrong size!
fi
# end of 'crab16.uu'
fi
if test -f 'crab8' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crab8'\"
else
echo shar: Extracting \"'crab8'\" \(110 characters\)
sed "s/^X//" >'crab8' <<'END_OF_FILE'
X..........
X..**.***..
X.****.***.
X.*......*.
X.*.****.*.
X..******..
X..******..
X.********.
X..*....*..
X..........
END_OF_FILE
if test 110 -ne `wc -c <'crab8'`; then
echo shar: \"'crab8'\" unpacked with wrong size!
fi
# end of 'crab8'
fi
if test -f 'crabmask16.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crabmask16.uu'\"
else
echo shar: Extracting \"'crabmask16.uu'\" \(576 characters\)
sed "s/^X//" >'crabmask16.uu' <<'END_OF_FILE'
Xbegin 644 crabmask16
XM+BXN+BXN+BXN+BXN+BXN+@HN+BXN*BHJ+BXJ*BHN+BXN"BXN*BHJ*BHJ*BHJ2
XM*BHJ+BX*+BXJ*BHJ*BHJ*BHJ*BHN+@HN*BHJ*BHJ*BHJ*BHJ*BHN"BXJ*BHJF
XM*BHJ*BHJ*BHJ*BX*+BHJ*BHJ*BHJ*BHJ*BHJ+@HN+BHJ*BHJ*BHJ*BHJ*BXN^
XM"BXN*BHJ*BHJ*BHJ*BHJ+BX*+BHJ*BHJ*BHJ*BHJ*BHJ+@HN*BHJ*BHJ*BHJ>
XM*BHJ*BHN"BXJ*BHJ*BHJ*BHJ*BHJ*BX*+BXJ*BHJ*BHJ*BHJ*BHN+@HN+BHJF
XM*BHJ*BHJ*BHJ*BXN"BXN+BXJ*BHN+BHJ*BXN+BX*+BXN+BXN+BXN+BXN+BXN.
XM+@H:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:6
XM&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:2
X8&AH:&AH:&AH:&AH:&AH:&AH:&AH:&AH:P
X``
Xend
Xsize 384
END_OF_FILE
if test 576 -ne `wc -c <'crabmask16.uu'`; then
echo shar: \"'crabmask16.uu'\" unpacked with wrong size!
fi
# end of 'crabmask16.uu'
fi
if test -f 'crabmask8' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crabmask8'\"
else
echo shar: Extracting \"'crabmask8'\" \(111 characters\)
sed "s/^X//" >'crabmask8' <<'END_OF_FILE'
X..******..
X.********.
X**********
X**********
X**********
X**********
X**********
X**********
X.********.
X..******..
X
END_OF_FILE
if test 111 -ne `wc -c <'crabmask8'`; then
echo shar: \"'crabmask8'\" unpacked with wrong size!
fi
# end of 'crabmask8'
fi
if test -f 'crabs.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crabs.c'\"
else
echo shar: Extracting \"'crabs.c'\" \(14330 characters\)
sed "s/^X//" >'crabs.c' <<'END_OF_FILE'
X/************************************************************************/
X/* */
X/* ###################### */
X/* A n t h o n y ## ## ## */
X/* ########## */
X/* T h y s s e n #### ## #### */
X/* #### ## #### */
X/* #### ## #### */
X/* */
X/************************************************************************/
X
X/*
X** Crabs - also for AMIGA under lattace C
X*/
X
X#include <stdio.h>
X#include <string.h>
X#include <intuition/intuition.h>
X#include <graphics/gfxmacros.h>
X#include <exec/exec.h>
X#include <proto/all.h>
X#define BM_SRC 0xC0 /* minterm source only */
X#define BM_DST 0xA0 /* minterm destination only */
X
X#include "crabs.h"
X
X /* intuition variables */
Xstruct Library *IntuitionBase = NULL, *GfxBase = NULL;
Xstruct Screen *WBScrn = NULL;
Xstruct Window *Window = NULL; /* Window pointer */
Xstruct RastPort *RPwindow = NULL; /* windows raster port */
Xstruct Remember *Remember = NULL; /* memory allocation memory */
Xstruct Task *MyTask = NULL; /* my tasks address */
Xstruct IntuiMessage *message = NULL;
Xint WBScrX, WBScrY; /* size of workbench screen */
XULONG WindowSignal; /* IDCMP window signal */
Xstruct NewWindow NW = {
X 30, 200, 350, 40, 0, 1, /* position, size and colors */
X CLOSEWINDOW, /* IDCMP messages */
X ACTIVATE| SIMPLE_REFRESH| WINDOWDEPTH|
X WINDOWDRAG| WINDOWCLOSE, /* window flags */
X NULL, NULL, /* gadget, checkmark */
X (UBYTE *) " << CRABS >> ", /* name of window */
X NULL,NULL, /* screen-> , BitMap-> */
X 0,0,0,0, /* min and max size (disable) */
X WBENCHSCREEN /* screen type */
X };
X
X
X /* program varibles */
Xtypedef struct {
X int x, y;
X} point;
X
Xtypedef enum {
X Looking, /* crab is looking for food */
X Nibbling, /* crab took a nibble and is stepping back */
X Munching /* crab is eating the food (after step back) */
X} crabstatus;
X
Xstatic struct {
X crabstatus stat; /* current status of crab */
X point pos; /* upper left corner screen coords */
X point vel; /* velocity (pixels/cycle) */
X point old; /* last position for backward step */
X int lp; /* life points of this crab */
X struct RastPort *RP; /* which map is the crab using */
X} crab[MAXCRABS]; /* crabs' state */
X
Xint NumCrabs = 0; /* number of crabs on screen */
X
X/* Crab images to be drawen to the screen using the mask */
Xunsigned short chip crabup[] = /* facing up */
X# include "crabup.i"
X#ifndef ONEIMAGE
Xunsigned short chip crabdown[] = /* facing down */
X# include "crabdown.i"
Xunsigned short chip crabright[] = /* facing right */
X# include "crabright.i"
Xunsigned short chip crableft[] = /* facing left */
X# include "crableft.i"
X#endif
Xunsigned short chip crabmask[] = /* crabs mask */
X# include "crabmask.i"
X
X /* Bitmaps and raster ports of the screens */
Xstruct BitMap BMtemp, BMmask, BMup;
Xstruct RastPort RPtemp, RPmask, RPup, RPscreen;
X#ifndef ONEIMAGE
Xstruct BitMap BMdown, BMright, BMleft;
Xstruct RastPort RPdown, RPright, RPleft;
X#endif
X
X
X /* function declarations */
Xextern void Init(), OpenLibraries(), InitWindow(), InitRP(), Print();
Xextern void CrabsExit(), Cycle(), DrawCrab(), HideCrab(), ModVel(), NewVel();
Xextern BOOL MoveCrab(), TestCrab(), TestBackground();
Xextern void RandInit();
Xextern int RandInt();
X
X#ifdef CBACK
X /* Cback.o initializations */
XLONG _stack = 2000;
Xchar *_procname = "Crabs";
XLONG _priority = -1;
XLONG _BackGroundIO = 0;
X#endif
X
Xvoid
X_main()
X{
X Init();
X
X for (;;) {
X Cycle();
X }
X /* NOTREACHED */
X}
X
Xvoid
XInit()
X/* set up initial crab layer */
X{
X int i; /* crab # */
X
X OpenLibraries(); /* open the various system structures */
X
X if( ! (Window = OpenWindow( &NW )) )
X CrabsExit(NULL);
X RPwindow = Window->RPort;
X WindowSignal = 1<<Window->UserPort->mp_SigBit;
X
X InitWindow();
X
X MyTask = FindTask( NULL );
X WBScrn = Window->WScreen;
X WBScrX = WBScrn->Width -SIZE;
X WBScrY = WBScrn->Height -SIZE/2;
X
X memcpy((char *) &RPscreen, (char *) &(WBScrn->RastPort),
X sizeof( struct RastPort ));
X
X InitRP(&RPup, &BMup, &crabup);
X InitRP(&RPmask, &BMmask, &crabmask);
X InitRP(&RPtemp, &BMtemp, NULL);
X#ifndef ONEIMAGE
X InitRP(&RPdown, &BMdown, &crabdown);
X InitRP(&RPleft, &BMdown, &crableft);
X InitRP(&RPright, &BMright, &crabright);
X#endif
X
X RandInit();
X
X /* Create initial set of crabs: */
X for (NumCrabs = 0; NumCrabs < STARTCRABS; NumCrabs++) {
X for (i = PLACELIM; i > 0; i--) {
X crab[NumCrabs].pos.x = RandInt(0, WBScrX-1);
X crab[NumCrabs].pos.y = RandInt(0, WBScrY-1);
X crab[NumCrabs].old = crab[NumCrabs].pos;
X if( !TestBackground(NumCrabs) )
X break; /* space found */
X }
X if( !i ) /* did we reach the placement limit */
X CrabsExit("Can't place crabs! No empty space found!");
X crab[NumCrabs].lp = REPROlp / 2;
X crab[NumCrabs].stat = Looking;
X NewVel(NumCrabs);
X DrawCrab(NumCrabs);
X }
X}
X
Xvoid
XOpenLibraries()
X{
X if( ! (IntuitionBase = OpenLibrary( "intuition.library", 0 )) )
X CrabsExit("Can't open Intuition Library");
X if( ! (GfxBase = OpenLibrary( "graphics.library", 0 )) )
X CrabsExit("Can't Open Graphics Library");
X}
X
Xvoid
XInitWindow()
X{
X Move(RPwindow, Window->BorderLeft,
X Window->BorderTop + RPwindow->TxBaseline );
X SetAPen(RPwindow, 3);
X Print("Reproducing Crabs by Anthony Thyssen");
X SetAPen(RPwindow, 1);
X Print(" Original idea from Scientific American");
X}
X
Xvoid
XInitRP(rp, bm, image)
X struct RastPort *rp;
X struct BitMap *bm;
X short *image;
X{
X InitBitMap(bm, 1, SIZE,SIZE/2);
X if( image )
X bm->Planes[0] = (PLANEPTR) image;
X else
X if( !(bm->Planes[0] = (PLANEPTR)
X AllocRemember( &Remember, RASSIZE(SIZE,SIZE/2),
X MEMF_CHIP | MEMF_CLEAR) ) ) { /* allocate with memory */
X CrabsExit("Can't alloc raster");
X }
X InitRastPort( rp );
X rp->BitMap = bm;
X}
X
Xvoid
XPrint(str)
X char *str;
X{
X Text( RPwindow, str, strlen(str) );
X Move( RPwindow, Window->BorderLeft,
X RPwindow->cp_y + RPwindow->TxHeight); /* move to next line */
X}
X
Xvoid
XCrabsExit(exitmessage)
X char *exitmessage;
X/* exit crabs - remove all traces */
X{
X int i;
X
X for (i = 0; i < NumCrabs; ++i)
X HideCrab(i);
X
X RefreshWindowFrame(Window);
X InitWindow();
X if( Window && exitmessage ) {
X Print(exitmessage);
X /*printf("%s\n", exitmessage); /* Debugging */
X Delay(200);
X }
X
X FreeRemember( &Remember, TRUE ); /* Frre all allocated memory */
X
X if( Window ) CloseWindow( Window );
X if( GfxBase ) CloseLibrary( GfxBase );
X if( IntuitionBase ) CloseLibrary( IntuitionBase );
X
X _exit(0);
X}
X
Xvoid
XCycle()
X /* one motion cycle for all crabs */
X{
X int i;
X
X /* test for window closure */
X if( message = (struct IntuiMessage *)GetMsg(Window->UserPort) ) {
X ReplyMsg( (struct Message *)message );
X switch( message->Class ) {
X case CLOSEWINDOW : /* window closed message */
X CrabsExit("Crabs are Exiting");
X }
X } /* Message test */
X
X if( NumCrabs < 5 )
X Delay( DELAY ); /* slow down the small number of crabs */
X
X for (i = 0; i < NumCrabs; i++) {
X
X /* did something bite the crab - image corrupted ? */
X if (TestCrab(i)) { /* if so damage the crab */
X crab[i].lp -= BITElp;
X NewVel(i);
X }
X
X switch( crab[i].stat ) { /* do the nessary move */
X case Looking:
X HideCrab(i); /* erase crab from previous position */
X crab[i].old = crab[i].pos; /* record current position */
X if (MoveCrab(i)) /* find the new positioN */
X crab[i].lp -= BOUNCElp; /* crab bounced - that smarts */
X if (TestBackground(i)) /* Test if crab hits an object */
X crab[i].stat = Nibbling; /* if so crab will now nibble */
X crab[i].lp -= MOVElp; /* drain movement cost from crab */
X if (crab[i].lp < 0) { /* check on starvation */
X crab[i] = crab[--NumCrabs];
X if (NumCrabs == 0)
X CrabsExit("The last Crab just died!\n");
X i--;
X continue; /* repeat this crab as it is the next one */
X }
X DrawCrab(i); /* redraw crab here */
X ModVel(i, 1); /* very slight direction change */
X break;
X
X case Nibbling:
X HideCrab(i); /* erase crab from previous position */
X crab[i].pos = crab[i].old; /* move crab backwards */
X DrawCrab(i); /* draw crab here */
X crab[i].stat = Munching; /* chew over the food */
X break;
X
X case Munching:
X crab[i].lp += FEEDlp; /* feed the food to the crab */
X ModVel(i, FEEDVEL); /* look in roughly the same dir as before */
X crab[i].stat = Looking; /* time taken to eat - look for more */
X if (crab[i].lp >= REPROlp) { /* check for reproduction */
X HideCrab(i); /* remove parent */
X crab[i].lp /= 2; /* half life force */
X if (NumCrabs < MAXCRABS) { /* is a new crab is possible */
X crab[NumCrabs] = crab[i]; /* child is a copy of parent */
X crab[NumCrabs].vel.x = -crab[NumCrabs].vel.x; /* reverse dir */
X crab[NumCrabs].vel.y = -crab[NumCrabs].vel.y;
X crab[NumCrabs].lp -= BITElp; /* child is weak */
X MoveCrab(i); /* move crabs away from each other */
X MoveCrab(NumCrabs++); /* move child twice - inc number crabs */
X /* leave the child undrawen and corrupted! */
X }
X DrawCrab(i); /* draw parent regardless of child state */
X }
X break;
X }
X } /* move next crab */
X}
X
XBOOL
XMoveCrab(i)
X int i;
X/* move crab to on screen position - don't draw it */
X/* if the crab hits edge of screen return TRUE */
X{
X BOOL hit = FALSE;
X
X crab[i].pos.x += crab[i].vel.x; /* motion */
X crab[i].pos.y += crab[i].vel.y;
X if( crab[i].pos.x < 0 ) {
X crab[i].pos.x = 0;
X crab[i].vel.x = abs(crab[i].vel.x);
X hit = TRUE;
X }
X if( crab[i].pos.x > WBScrX ) {
X crab[i].pos.x = WBScrX;
X crab[i].vel.x = -abs(crab[i].vel.x);
X hit = TRUE;
X }
X if( crab[i].pos.y < 0 ) {
X crab[i].pos.y = 0;
X crab[i].vel.y = abs(crab[i].vel.y);
X hit = TRUE;
X }
X if( crab[i].pos.y > WBScrY ) {
X crab[i].pos.y = WBScrY;
X crab[i].vel.y = -abs(crab[i].vel.y);
X hit = TRUE;
X }
X return (hit);
X}
X
XBOOL
XTestCrab(i)
X int i;
X/* test the crabs image on the screen. return TRUE if corrupt */
X/* invisible crabs are the background texture */
X{
X int j;
X UBYTE *byte;
X
X /* get crab stored on screen */
X ClipBlit( &RPscreen, crab[i].pos.x, crab[i].pos.y,
X &RPtemp, 0, 0, SIZE, SIZE/2, BM_SRC );
X /* mask out background */
X ClipBlit( &RPmask, 0, 0, &RPtemp, 0, 0,
X SIZE, SIZE/2, BM_SRC & BM_DST );
X /* xor with crab image */
X ClipBlit( crab[i].RP, 0, 0, &RPtemp, 0, 0,
X SIZE, SIZE/2, BM_SRC ^ BM_DST );
X
X /* check the data */
X byte = BMtemp.Planes[0];
X for (j = RASSIZE(SIZE, SIZE/2)-1; j >= 0; j--)
X if( *(byte++) )
X return TRUE;
X
X return FALSE;
X}
X
XBOOL
XTestBackground(i)
X int i;
X/* return TRUE if crab position is not the background */
X{
X int j;
X UBYTE *byte;
X
X /* get screen at crab location */
X ClipBlit( &RPscreen, crab[i].pos.x, crab[i].pos.y,
X &RPtemp, 0, 0, SIZE, SIZE/2, BM_SRC );
X /* mask out background */
X ClipBlit( &RPmask, 0, 0, &RPtemp, 0, 0,
X SIZE, SIZE/2, BM_SRC & BM_DST );
X
X /* check the data */
X byte = BMtemp.Planes[0];
X for (j = RASSIZE(SIZE, SIZE/2)-1; j >= 0; j--)
X if( *(byte++) )
X return TRUE;
X
X return FALSE;
X}
X
Xvoid
XHideCrab(i)
X/* over write current crab with screen texture */
X{
X ClipBlit( &RPmask, 0, 0, &RPscreen, crab[i].pos.x, crab[i].pos.y,
X SIZE, SIZE/2, ~BM_SRC & BM_DST );
X}
X
Xvoid
XDrawCrab(i)
X int i;
X/* Draw the crabs on the screen if visible */
X{
X HideCrab(i);
X crab[i].RP = PICKMAP( crab[i].vel );
X ClipBlit( crab[i].RP, 0, 0, &RPscreen, crab[i].pos.x, crab[i].pos.y,
X SIZE, SIZE/2, BM_SRC | BM_DST );
X}
X
Xvoid
XNewVel(i) /* assign new velocity to crab */
X int i; /* crab # */
X{
X crab[i].vel.x = RandInt(-MAXVEL, MAXVEL);
X crab[i].vel.y = RandInt(-MAXVEL/2, MAXVEL/2);
X
X /* Velocity (0,0) is okay since we repeatedly modify all velocities. */
X}
X
Xvoid
XModVel(i, dv) /* randomly modify crab velocity */
X int i,dv; /* crab, delta velocity */
X{
X int min,max; /* range of new velocity */
X
X min=crab[i].vel.x-dv;
X max=crab[i].vel.x+dv;
X if ( max > MAXVEL)
X max = MAXVEL;
X if ( min < -MAXVEL)
X min = -MAXVEL;
X crab[i].vel.x = RandInt(min, max);
X
X min=crab[i].vel.y-dv;
X max=crab[i].vel.y+dv;
X if ( max > MAXVEL/2)
X max = MAXVEL/2;
X if ( min < -MAXVEL/2)
X min = -MAXVEL/2;
X crab[i].vel.y = RandInt(min, max);
X}
X
Xvoid
XRandInit()
X{
X srand((int)time(NULL));
X}
X
Xint
XRandInt(lo, hi) /* generate random integer in range */
X int lo, hi; /* range lo..hi inclusive */
X{
X return lo + (int)( (unsigned)rand() % (hi - lo +1) );
X}
X
X
END_OF_FILE
if test 14330 -ne `wc -c <'crabs.c'`; then
echo shar: \"'crabs.c'\" unpacked with wrong size!
fi
# end of 'crabs.c'
fi
if test -f 'crabs.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crabs.h'\"
else
echo shar: Extracting \"'crabs.h'\" \(1513 characters\)
sed "s/^X//" >'crabs.h' <<'END_OF_FILE'
X/* The Crabs header file */
X
X#define STARTCRABS 1 /* default start number of crabs */
X#define MAXCRABS 40 /* max number of crabs */
X#define SIZE 12 /* X size of the bitmaps,half for Y */
X#define ONEIMAGE /* movement style */
X
X#define MAXVEL 8 /* abs. bound on velocity component */
X#define FEEDVEL 2 /* velocity change after a feed */
X#define DELAY 3 /* sleep time bettween cycles */
X#define PLACELIM 50 /* times to try to find a blank spot */
X
X
X#define FEEDlp 12 /* number of life points in one feed */
X#define BITElp 30 /* damage from being eaten */
X#define MOVElp 1 /* life points for a move */
X#define BOUNCElp 0 /* hiting the screen edge hurts */
X#define REPROlp 400 /* life points to reproduce at */
X
X/* movement style */
X#ifdef SIDEWAYS
X# define PICKMAP(v) ( abs((v).x) > abs((v).y * 2 ) ? \
X ( (v).y > 0 ? &RPdown : &RPup ) : \
X ( (v).x > 0 ? &RPright : &RPleft ) )
X#endif
X
X#ifdef FORWARD
X# define PICKMAP(v) ( abs((v).x) > abs((v).y * 2 ) ? \
X ( (v).x > 0 ? &RPright : &RPleft ) : \
X ( (v).y > 0 ? &RPdown : &RPup ) )
X#endif
X
X#ifdef ONEIMAGE /* only the crabup.i image is used */
X# define PICKMAP(v) ( &RPup )
X#endif
END_OF_FILE
if test 1513 -ne `wc -c <'crabs.h'`; then
echo shar: \"'crabs.h'\" unpacked with wrong size!
fi
# end of 'crabs.h'
fi
if test -f 'crabs.info.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crabs.info.uu'\"
else
echo shar: Extracting \"'crabs.info.uu'\" \(387 characters\)
sed "s/^X//" >'crabs.info.uu' <<'END_OF_FILE'
Xbegin 644 crabs.info
XMXQ```0```````````"(`#``$``,``0#`J#``````````````````````````"
XM`````\(`P&Z(`,"H2(````"````````````````````````````B``L``@##=
XM-;@#``````````__P```0`(/P``"```!P```$`#PP``$``/\P```("#PP```%
XM@0``P```"``/P``"``?_P`````?_P``(``?_P```````````````````````T
XM`````````````````````````````````````````````````````````````
X8```````````!``````P````!``````$`/
X``
Xend
Xsize 249
END_OF_FILE
if test 387 -ne `wc -c <'crabs.info.uu'`; then
echo shar: \"'crabs.info.uu'\" unpacked with wrong size!
fi
# end of 'crabs.info.uu'
fi
if test -f 'crabs.uu' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'crabs.uu'\"
else
echo shar: Extracting \"'crabs.uu'\" \(7341 characters\)
sed "s/^X//" >'crabs.uu' <<'END_OF_FILE'
Xbegin 644 crabs
XM```#\P`````````$``````````,```2(0```!@````````+"```#Z0``!(@DO
XM2"0`2?D`````1_D```&<<@`@/````EM@`B;!4<C__"QX``0I3@'4*4\!W$*L*
XM`=@F;@$4<``B/```,`!.KO[.*6L`F`'02JL`K&<``'`@#Y"O``0&@````(`I>
XM0`&@80`!+B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI20'DT(%2@$)G4H`"0/_^?
XMG\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(`!3@A^Q(``@`%'*__@B'
XM3R\)8```>"EK`#H!H'!_4H#1K`&@80``PD'K`%Q.KOZ`0>L`7$ZN_HPI0`'8B
XM+P`D0"`J`"1G$BQL"O@@0"(H```I00'03J[_@B(J`"!G&B0\```#[4ZN_^(IY
XM0`'@9PKEB"!`)V@`"`"D(&P!V"\(2&P!G"!H`"0I:``$`>1.N@N83KH`='``$
XM8`0@+P`$+P`@+`'(9P0@0$Z03KH0<"QX``0B;`KX3J[^8DZZ"VY*K`'89QHBS
XM+`'@9P1.KO_<+'@`!$ZN_WPB;`'83J[^AB`?+FP!W$YU<&1@M$/Z`!!P`$ZNO
XM_=@I0`KX9^Q.=61O<RYL:6)R87)Y`&$```AA``.T8/I.5?_\2.<!(F$``:I!7
XM[``N+&P``$ZN_S0I0``,2H!F"$*G80`"]%A/(&P`#"EH`#(`$")H`%9P`!`II
XM``]R`>&A*4$!\&$``;23R2QX``1.KO[:*4``&"!L``PI:``N``@@;``(,"@`9
XM#$C`<@R0@2E``>@P*``.2,!=@"E``>Q#Z`!4<&-![`DX$-E1R/_\2'D`````4
XM2&P'Y$AL"-1A``&Z2'D````,2&P'O$AL"'!A``&H0I=(;`>42&P(#&$``9IA2
XM``H@3^\`($*L`%X,K`````$`7FP``-9^,DJ';P``B"`L`%YR)$ZZ#8XB+`'H_
XM4X$O`4*G+T``%&$`"?A![`'T(B\`%"&`&`0@+`!><B1.N@UF(BP![%.!+H%"1
XMIR]``!AA``G00>P!]"(O`!@A@!@(("P`7G(D3KH-/D'L`?0B2-/`T<!%Z0`4Y
XM0^@`!"39)-DNK`!>80`'6$_O``Q*0&<&4X=@`/]V2H=F"DAL`&)A``&H6$\@Y
XM+`!><B1.N@SZ0>P!]"&\````R`@<0>P!]$*P"``O+`!>80`(1"ZL`%YA``?D?
XM6$]2K`!>8`#_(DS?1(!.74YU+PY#[`",<``L>``$3J[]V"E```!*@&8*2&P`9
XMGF$``4983T/L`+QP`"QX``1.KOW8*4``!$J`9@I(;`#.80`!)EA/+%].=4CG6
XM(`(@;``,$"@`-DB`2,`2*``W2(%(P70`(&P`$#0H`#[2@B)(+&P`!$ZN_Q`BL
XM;``0<`-.KOZJ2&P`ZF$``(@B;``0<`$L;``$3J[^JDAL`1!A``!R4$],WT`$/
XM3G5.50``2.<@,B9O`!@D;P`<($IP`7(,=`8L;``$3J[^>DJM`!!G""5M`!``^
XM"&`D0>P`%'`,(CP``0`"+&P``$ZN_G0E0``(9@I(;`$Z80``<EA/(DLL;``$_
XM3J[_.B=*``1,WTP$3EU.=4Y5__Q(YR`2)F\`&"!+2AAF_%.(D<LO2``,(FP`V
XM$"!+("\`#"QL``1.KO_$(&P`#!`H`#9(@$C`(&P`$#(H`"9(P70`-"@`.M*"*
XM(DA.KO\03-](!$Y=3G5(YP$2)F\`$'X`OJP`7FP,+P=A``846$]2AV#N(&P`*
XM#"QL``!.KOXX80#^N$JL``QG&"`+9Q0O"V$`_VY83W)DTH$L;`KX3J[_.D'LH
XM`!1P`2QL``!.KOYH2JP`#&<((&P`#$ZN_[A*K``$9PPB;``$+'@`!$ZN_F)*(
XMK```9PPB;```+'@`!$ZN_F)"ITZZ#`183TS?2(!.=4Y5__Q(YR$R(&P`#"!H/
XM`%8L>``$3J[^C"E``!Q*@&<@(D!.KOZ&(&P`'"`H`!0,@````@!F"DAL`4YAB
XM`/\L6$\,K`````4`7FP*<@,L;`KX3J[_.GX`OJP`7FP``C8O!V$``]A83TI`T
XM9QH@!W(D3KH*5G(>0^P!]).Q"!PO!V$`!:Q83R`'<B1.N@H\0>P!]"(P"``,$
XM@0````)G``$4#($````!9P``R$J!9@`!X"\'80`$WB`'<B1.N@H,0^P!]"1)S
XMU<#3P$?J`!1%Z0`$)MHFVBZ'80`!Q%A/2D!G""`'<B1.N@GB+P=A``046$]*J
XM0&<2(`=R)$ZZ"<YR`4'L`?0A@0@`(`=R)$ZZ";Q![`'T4[`('$'L`?0B,`@<_
XM2H%J-D'L`?0B2-/`4ZP`7B`L`%YR)$ZZ"9+1P'`((MA1R/_\2JP`7F8*2&P!:
XM8&$`_AQ83U.'8``!."\'80`$>DAX``$O!V$`!2)/[P`,8``!("\'80`$'B`'T
XM<B1.N@E,0^P!]"1)U<#3P$?J``1%Z0`4)MHFVBZ'80`$/EA/(`=R)$ZZ"29R(
XM`D'L`?0A@0@`8```WB`'<B1.N@D0<@Q#[`'TT[$('$AX``(O!V$`!+Q03R`'3
XM<B1.N@CR0>P!]$*P"`!![`'T#+````&0"!QM``"@+P=A``.>6$\@!W(D3KH(`
XMRD'L`?0B,`@<:@)2@>*!0>P!]"&!"!PO0``4(BP`7G0HLH)L8G`D3KH(H$'LJ
XM`?0B2-/`(B\`%"1(U<%R""+:4<G__$/L`?0B,0@,1(%#[`'T(X$(#$/L`?0B6
XM,0@01(%#[`'T(X$($'(>0>P!]).P"!PO!V$``"@@+`!>4JP`7BZ`80``&EA/<
XM+P=A``-,6$]2AV``_<9,WTR$3EU.=4Y5__A(YR,`+B\`''P`(`=R)$ZZ"!A!Y
XM[`'T(C`(#$/L`?33L0@$0>P!]"(P"!!#[`'TT[$("$'L`?0B,`@$2H%J1'(`J
XM0>P!]"&!"`0O0``00>P!]"0P"`Q*@FH,0>P!]"0P"`Q$@F`0(`=R)$ZZ![Y!F
XM[`'T)#`(#$'L`?0@+P`0(8((#'P!(`=R)$ZZ!Z`B+`'H0>P!]"0P"`2T@6]$+
XM0>P!]"&!"`0O0``00>P!]"(P"`Q*@6H,0>P!]"(P"`Q$@6`0(`=R)$ZZ!V1!&
XM[`'T(C`(#$2!0>P!]"`O`!`A@0@,?`$@!W(D3KH'1$'L`?0B,`@(2H%J1'(`_
XM0>P!]"&!"`@O0``00>P!]"0P"!!*@FH,0>P!]"0P"!!$@F`0(`=R)$ZZ!PI!^
XM[`'T)#`($$'L`?0@+P`0(8(($'P!(`=R)$ZZ!NPB+`'L0>P!]"0P"`BT@6]$F
XM0>P!]"&!"`@O0``00>P!]"(P"!!*@6H,0>P!]"(P"!!$@6`0(`=R)$ZZ!K!!=
XM[`'T(C`($$2!0>P!]"`O`!`A@0@0?`$@!DS?`,1.74YU3E7_^$CG`P`N+P`8,
XM(`=R)$ZZ!GI(>`#`2'@`!DAX``QR`"\!+P%(;`@,0>P!]"\P"`A![`'T+S`(+
XM!$AL"3A.N@@02'@`@$AX``9(>``,<``O`"\`2&P(#"\`+P!(;`AP3KH'[D_O&
XM`$@@!W(D3KH&'DAX`&!(>``&2'@`#'(`+P$O`4AL"`PO`2\!0>P!]"\P""!.4
XMN@>\3^\`)"ML!YS_^'P+2H9K%"!M__A2K?_X2A!G!'`!8`93AF#H<`!,WP#`X
XM3EU.=4Y5__A(YP,`+B\`&"`'<B1.N@6V2'@`P$AX``9(>``,<@`O`2\!2&P(/
XM#$'L`?0O,`@(0>P!]"\P"`1(;`DX3KH'3$AX`(!(>``&2'@`#'``+P`O`$AL.
XM"`PO`"\`2&P(<$ZZ!RI/[P!(*VP'G/_X?`M*AFL4(&W_^%*M__A*$&<$<`%@T
XM!E.&8.AP`$S?`,!.74YU+P<N+P`((`=R)$ZZ!2I(>``@2'@`!DAX``Q![`'T3
XM+S`("$'L`?0O,`@$2&P).'(`+P$O`4AL"'!.N@;`3^\`)"X?3G4O!RXO``@OY
XM!V&R(`=R)$ZZ!.)![`C40^P!]".(""!(>`#@2'@`!DAX``Q![`'T+S`("$'LU
XM`?0O,`@$2&P).'(`+P$O`4'L`?0O,`@@3KH&:$_O`"@N'TYU3E7__"\'+B\`M
XM$"`'<B1.N@2*2'@`"$AX__@O0``,80``]D'L`?0B+P`,(8`8#"`'<B1.N@1FG
XM2'@`!$AX__PO0``480``TD'L`?0B+P`4(8`8$"XM__A.74YU3E7__$CG#P`N/
XM+P`<+"\`("`'<B1.N@0J0>P!]"(P"`R2ABH!0>P!]"(P"`S2AB@!<@BX@6\"Q
XM*`%R^+J!;`(J`2\$+P4O0``880``<E!/0>P!]"(O`!`A@!@,(`=R)$ZZ`^!!X
XM[`'T(C`($)*&*@%![`'T(C`($-*&*`%R!+B!;P(H`7+\NH%L`BH!+P0O!2]`\
XM`!AA```H0>P!]"(O`!@A@!@03.T`\/_L3EU.=4*G3KH`["Z`3KH"*EA/3G5(H
XMYP,`+B\`#"PO`!!.N@'Z(@:2AU*!3KH#OB`'T(%,WP#`3G5.=4YU3E7_^"\+>
XM)FP*W"`+9@1'^@!\&5,*\!EK``$*\1EK``(*\D(L"O-![`KP*4@*Z$'K``-(>
XM;?_X+PA.N@%:4$]6@-?`("W_^"(\```.$$ZZ`PXI0`KD2A-G'AE3"O09:P`!+
XM"O49:P`""O9P`!E`"O=R`2E!"N!@"$(L"O1"K`K@0>P*]"E("NPF7TY=3G5#*
XM4U0V`````````````````````````````````````````````````````$Y5`
XM__)(YP<0)F\`)DAM__A.N@%"6$]Z`!`M__DL``8&``I^`+X&9")P`!`'5(!R6
XM!$ZZ`I)*@68(!H4```%N8`8&A0```6U2!V#:?@$0+?_ZO@!D%'``$`=R`$'L6
XM`7\2,`@`VH%2!V#D<``0!E2`<@1.N@)22H%F#!`M__IR`K`!8P)2A7``$"W_N
XM^U.`VH`@!7(83KH"$"H`<``0+?_\VH`@!7(\3KH!_BH`<``0+?_]VH`@!7(\W
XM3KH!["H`<``0+?_^VH!.NOZ"VJP*Y"`+9P(FA2`%3-\(X$Y=3G4@;P`$(DARS
XM`'``+P(,$``K9P8,$``M9@)22!`8!```,&T2#```"6X,)`'E@=*"TH'2@&#F4
XM#!$`+68"1($D'R`(4X`@;P`(((&0B4YU("P!C"(\```.74ZZ`7!6@`*`?___Y
XM_RE``8Q.=2\'+B\`""E'`8PN'TYU``!.5?_@2.<O$"9O`$!![?_T(@@L;`KX*
XM3J[_0"`M__0N/```![HL`"M`__`,A@```6UO'B`'<@1.N@$X2H%F"`2&```!;
XM;F`&!(8```%M4H=@V@R&```!;680(`=R!$ZZ`1)*@6<$4H=\`"`&(@<$@0``L
XM![P700`!=``4`2M`__`@`G($3KH`[$J!9@1P'6`"<!P90`&1>``J+?_P<`RX8
XM@&P><`!![`&0$#!(`+"%;A!P`$'L`9`0,$@`FH!2A&#<(`4B!%*!%T$``BM`X
XM__!2@!=```,@+?_T<@=.N@"6%H$@+?_X<CQ.N@"*%T``!"`M__AR/$ZZ`'P7U
XM00`%("W__'(R3KH`;A=```8@+?_\<C).N@!@TH$700`'3-\(]$Y=3G4`````@
XM``!P82\'+B\`"$JL`<QG!$ZZ`/XB!RQL"OA.KO_<<``N'TYU````````<&%(3
XMYS``)``F`4A"2$/$P<;`P,'40TA"0D+0@DS?``Q.=4J`:@``'D2`2H%J```,+
XM1(%A```@1(%.=6$``!A$@$2!3G5*@6H```Q$@6$```9$@$YU+P)(030!9@``<
XM(DA`2$%(0C0`9P``!H3!,`)(0#0`A,$P`DA",@(D'TYU+P-V$`Q!`(!D```&[
XMX9E10PQ!"`!D```&Z9E90PQ!(`!D```&Y9E50TI!:P``!N.94T,T`.:H2$)"T
XM0N:J2$.`P38`,`(T`TA!Q,&0@F0```A30]"!9/YR`#(#2$/GN$A`P4$F'R0?U
XM3G5(YP$"<``B/```,``L>``$3J[^SBX``H<``#``2H=F!'``8"!*K`',9Q@@7
XM;`',3I!*@&8$<`!@#$AX`!1.N@`26$\@!TS?0(!.=6&T3G4``$CG!P`N+P`0,
XM("P!?%.`+`!*1FLP(`9(P.>`0>P)G"HP"`!*!6<:"`4``F84(`9(P.>`0>P)@
XMG"\P"`1.NOYH6$]31F#,+P=.NN^66$],WP#@3G4``````````````````$CG(
XM`#(F;`K\(`MG%"13(DL@*P`(+'@`!$ZN_RXF2F#HD<@I2`L`*4@*_$S?3`!.!
XM=4CG/@(L;``$(&\`'$SO``,`(")O`"A,[P!\`"Q.KOW83-]`?$YU````````@
XM``!P80```^P````"`````0```E@```)&`````@````,````,````!@``````\
XM``/R0``#Z@````8```\`/\`_P`\````?@'_@__#_\'_@'X````/R```#Z0``_
XM``````/R```#Z@```&<`````````````````````````````````````````)
XM`"`\/"!#4D%"4R`^/B```!X`R`%>`"@``0```@```!!.```````````````@-
XM```````````````````````!`````$-A;B=T('!L86-E(&-R86)S(2!.;R!E!
XM;7!T>2!S<&%C92!F;W5N9"$``&EN='5I=&EO;BYL:6)R87)Y`$-A;B=T(&]P%
XM96X@26YT=6ET:6]N($QI8G)A<GD``&=R87!H:6-S+FQI8G)A<GD``$-A;B=T,
XM($]P96X@1W)A<&AI8W,@3&EB<F%R>0!297!R;V1U8VEN9R!#<F%B<R!B>2!!A
XM;G1H;VYY(%1H>7-S96X``"`@($]R:6=I;F%L(&ED96$@9G)O;2!38VEE;G1IY
XM9FEC($%M97)I8V%N`$-A;B=T(&%L;&]C(')A<W1E<@``0W)A8G,@87)E($5X;
XM:71I;F<`5&AE(&QA<W0@0W)A8B!J=7-T(&1I960A"@```````"@?'!\>'QX?K
XM'QX?'A\````!'QP?'A\>'Q\>'QX?```#[`````$````#````2`````````/RW
X``
Xend
Xsize 5220
END_OF_FILE
if test 7341 -ne `wc -c <'crabs.uu'`; then
echo shar: \"'crabs.uu'\" unpacked with wrong size!
fi
# end of 'crabs.uu'
fi
if test -f 'intergerize.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'intergerize.c'\"
else
echo shar: Extracting \"'intergerize.c'\" \(963 characters\)
sed "s/^X//" >'intergerize.c' <<'END_OF_FILE'
X/*
X** This program filters a small file such that the output
X** is the set of short ints required to describe the input
X** NOTE the file must be a rectangle to work and no tabs
X*/
X
X#include <stdio.h>
X
Xchar file[100][100];
Xint linelen, numlines;
X
Xmain()
X{
X int i;
X
X linelen = 0;
X numlines = 0;
X while (gets(&file[numlines][0]) != NULL && numlines < 99) {
X if ((i = strlen(&file[numlines][0])) > linelen)
X linelen = i;
X numlines++;
X }
X for(i=0; i<numlines; i++) {
X printf("%s0x%c%c%c%c",
X !i ? "{ " : i%8 != 7 ? ", " : ",\n ",
X conv(i,0), conv(i,4), conv(i,8), conv(i,12) );
X }
X printf(" };\n");
X return 0;
X}
X
Xconv(line, pos)
X{
X int i;
X static char hex[] = "0123456789abcdef";
X
X i = (file[line][pos] == '*') ? 8 : 0;
X i += (file[line][pos + 1] == '*') ? 4 : 0;
X i += (file[line][pos + 2] == '*') ? 2 : 0;
X i += (file[line][pos + 3] == '*') ? 1 : 0;
X return (hex[i]);
X}
END_OF_FILE
if test 963 -ne `wc -c <'intergerize.c'`; then
echo shar: \"'intergerize.c'\" unpacked with wrong size!
fi
# end of 'intergerize.c'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(504 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X
Xcrabs : crabs.c crabs.h crabup.i crabmask.i
X lc -v -Lc $@
X
Xcrabup.i : blob intergerize rotate
X intergerize <$* >$@
X copy crabup.i crabdown.i
X copy crabup.i crableft.i
X copy crabup.i crabright.i
X
Xcrabmask.i : blobmask intergerize
X intergerize <$* >$@
X
Xintergerize : intergerize.c
X lc -L $@
X
Xrotate : rotate.c
X lc -L $@
X
Xmerge : merge.c
X lc -L $@
X
Xclean :
X delete *.o *.lnk *.i
X
Xclobber : clean
X delete intergerize rotate merge
END_OF_FILE
if test 504 -ne `wc -c <'makefile'`; then
echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'merge.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'merge.c'\"
else
echo shar: Extracting \"'merge.c'\" \(556 characters\)
sed "s/^X//" >'merge.c' <<'END_OF_FILE'
X/*
X** This program will read two bitmap file for exactly the
X** same format and create a or'd version on standard output
X**
X** This use is to merge rotated crabs to find the minimal mask
X*/
X
X#include <stdio.h>
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X char c1, c2;
X FILE *file;
X
X if( (file = fopen(argv[1], "r")) == NULL ) {
X fprintf(stderr,"Can't open the argument file\n");
X exit(1);
X }
X
X while( (c1=getchar()) != EOF && (c2=getc(file)) != EOF ) {
X if( c2=='*' )
X c1='*';
X putchar(c1);
X }
X fclose(file);
X return 0;
X}
END_OF_FILE
if test 556 -ne `wc -c <'merge.c'`; then
echo shar: \"'merge.c'\" unpacked with wrong size!
fi
# end of 'merge.c'
fi
if test -f 'rotate.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'rotate.c'\"
else
echo shar: Extracting \"'rotate.c'\" \(614 characters\)
sed "s/^X//" >'rotate.c' <<'END_OF_FILE'
X/*
X** This program filters a small file such that the output
X** is rotated 90 degrees
X** NOTE the file must be a rectangle to work and no tabs
X*/
X
X#include <stdio.h>
X
Xchar file[100][100];
Xint linelen, numlines;
X
Xmain()
X{
X int i,j;
X char c;
X
X linelen = 0;
X numlines = 0;
X while (gets(&file[numlines][0]) != NULL && numlines < 99) {
X if ((i = strlen(&file[numlines][0])) > linelen)
X linelen = i;
X numlines++;
X }
X for (i = linelen-1; i >= 0; i--) {
X for( j=0; j <numlines; j++ ){
X putchar((c=file[j][i])?c:' ');
X }
X putchar('\n');
X }
X return 0;
X}
END_OF_FILE
if test 614 -ne `wc -c <'rotate.c'`; then
echo shar: \"'rotate.c'\" unpacked with wrong size!
fi
# end of 'rotate.c'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have the archive.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.