[comp.sources.amiga] v90i226: crabs - crustaceans consume your console, Part01/01

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.