#!/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:  MRTimer.c MRTimer.h Makefile MemEater-pw.h MemEater.c
#   MemEater.doc MemEater.info.uu MemEater.pw.uu MemEater.uu
# Wrapped by tadguy@xanth on Sun Apr 15 10:46:55 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'MRTimer.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MRTimer.c'\"
else
echo shar: Extracting \"'MRTimer.c'\" \(6036 characters\)
sed "s/^X//" >'MRTimer.c' <<'END_OF_FILE'
X/* Timer device support routines.
X * Filename:    Timer.c
X * Author:      Mark R. Rinfret
X * Date:        11/29/87
X *
X */
X
X#ifndef EXEC_MEMORY_H
X#include <exec/memory.h>
X#endif
X
X#include "MRTimer.h"
X
X/*  FUNCTION
X        CreateTimer - Allocate and initialize a timer request.
X
X    SYNOPSIS
X        #include <Timer.h>
X        struct timerequest *CreateTimer(vBlank)
X                            BOOL vBlank;
X
X    DESCRIPTION
X        CreateTimer allocates and initializes an asynchronous timer 
X        request structure for later use by StartTimer and StopTimer.
X        If the <vBlank> argument is 1, the vertical blanking interval
X        timer is used.  Otherwise, the microhertz timer is used.
X        CreateTimer returns a pointer to the timer request structure
X        if successful, NULL otherwise.
X
X    SEE ALSO
X        StartTimer, StopTimer, DeleteTimer
X
X */
X
Xstruct timerequest *
XCreateTimer(vBlank)
X    BOOL vBlank;
X{
X    int status = 0;
X    struct MsgPort  *timerPort = NULL;
X    struct timerequest *timeRequest = NULL;
X    ULONG timerType;
X
X    timerType = (vBlank ? UNIT_VBLANK : UNIT_MICROHZ);
X
X    if ( timerPort = CreatePort(0L, 0L) ) {
X        if ( ! (timeRequest = (struct timerequest *)
X            AllocMem((long) sizeof(struct timerequest),
X                     MEMF_CLEAR | MEMF_PUBLIC) ) ) {
Xkillport:
X            DeletePort(timerPort);
X        }
X        else {
X            timeRequest->tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
X            timeRequest->tr_node.io_Message.mn_Node.ln_Pri = 0;
X            timeRequest->tr_node.io_Message.mn_ReplyPort = timerPort;
X            if ( OpenDevice(TIMERNAME, timerType, 
X                            (struct IORequest *) timeRequest, 1L) ) {
X                DeleteTimer(timeRequest);
X                timeRequest = NULL;
X                goto killport;
X            }
X        }
X    }
X    return timeRequest;
X}
X
X/*  FUNCTION
X        DeleteTimer - delete a timer request created by CreateTimer.
X
X    SYNOPSIS
X        void DeleteTimer(timeRequest)
X             struct timerequest *timeRequest;
X
X    DESCRIPTION
X        DeleteTimer is called with a pointer to a timer request
X        structure created by CreateTimer.  It aborts any active
X        timer started by StartTimer and frees all resources required 
X        by the timer.
X */
X
Xvoid
XDeleteTimer(timeRequest)
X    struct timerequest *timeRequest;
X{
X    struct MsgPort *msgPort;
X
X    msgPort = timeRequest->tr_node.io_Message.mn_ReplyPort;
X
X    if (timeRequest->tr_node.io_Device) {
X        AbortIO((struct IORequest *) timeRequest);
X        GetMsg(msgPort);
X        CloseDevice((struct IORequest *) timeRequest);
X    }
X    FreeMem(timeRequest, sizeof(timeRequest));
X    DeletePort(msgPort);
X}
X
X/*  FUNCTION
X        StartTimer - start an asynchronous timer request.
X
X    SYNOPSIS
X        void StartTimer(timeRequest, seconds, microseconds)
X             struct timerequest *timeRequest;
X             ULONG seconds, microseconds;
X
X    DESCRIPTION
X        Start an asynchronous timer request.  The user application can
X        detect the expiration of the timer with 
X            Wait(timeRequest->ReplyPort->mp_SigBit) or
X            WaitIO(timeRequest).
X
X        A typical sequence might look like this:
X
X            Start an asynchronous activity (serial read?);
X            StartTimer(myTimer);
X            bits = Wait(timer bit or other signal);
X            if (bits & myTimerBit)
X                WaitIO(&myTimer->tr_node);
X */
X
Xvoid
XStartTimer(timeRequest, seconds, microSeconds)
X    struct timerequest *timeRequest; ULONG seconds, microSeconds;
X{
X    timeRequest->tr_time.tv_secs = seconds;
X    timeRequest->tr_time.tv_micro = microSeconds;
X    timeRequest->tr_node.io_Command = TR_ADDREQUEST;
X    timeRequest->tr_node.io_Flags = 0;
X    timeRequest->tr_node.io_Error = 0;
X    SendIO((struct IORequest *) timeRequest);   /* Start the timer. */
X}
X
X/*  FUNCTION
X        StopTimer - stop an asynchronous timer request.
X
X    SYNOPSIS
X        void StopTimer(timeRequest)
X             struct timerequest *timeRequest;
X
X    DESCRIPTION
X        StopTimer aborts a time request started by StartTimer.
X
X */
X
Xvoid
XStopTimer(timeRequest)
X    struct timerequest *timeRequest;
X{
X    AbortIO((struct IORequest *) timeRequest);
X    WaitIO((struct IORequest *) timeRequest);
X}
X
X#ifdef DEBUG
X#define SHORTBIT (1L<<shortTimer->tr_node.io_Message.mn_ReplyPort->mp_SigBit)
X#define LONGBIT  (1L<<longTimer->tr_node.io_Message.mn_ReplyPort->mp_SigBit)
Xmain()
X{
X    unsigned intervals;
X    struct timerequest *shortTimer, *longTimer;
X    ULONG signals;
X
X    /* This simple program example sets up two timers of different
X     * intervals and reports their expirations.
X     */
X
X    puts("This example defines two timers.  The first has an interval of");
X    puts("five seconds, while the second has an interval of 10 seconds.");
X    puts("The expiration of each timer is reported to the screen until");
X    puts("10 intervals have been detected.\n");
X
X    if (! (shortTimer = CreateTimer(0) ) ) {
X        puts("Failed to create short interval timer!");
X        exit();
X    }
X
X    if (! (longTimer = CreateTimer(0) ) ) {
X        puts("Failed to create long interval timer!");
X        DeleteTimer(shortTimer);
X        exit();
X    }
X
X    StartTimer(shortTimer, 5L, 0L);
X    StartTimer(longTimer, 10L, 0L);
X    for (intervals = 0; intervals < 10; ) {
X        printf("Begin wait %2d ... ", intervals);
X        signals = Wait(SHORTBIT | LONGBIT);
X        puts("end wait.");
X        if (signals & SHORTBIT) {
X            GetMsg(shortTimer->tr_node.io_Message.mn_ReplyPort);
X            ++intervals;
X            puts("  Short interval timer expired.");
X            StartTimer(shortTimer, 5L, 0L);
X        }
X        if (signals & LONGBIT) {
X            GetMsg(longTimer->tr_node.io_Message.mn_ReplyPort);
X            ++intervals;
X            puts("   Long interval timer expired.");
X            StartTimer(longTimer, 10L, 0L);
X        }
X    }
X    DeleteTimer(shortTimer);
X    DeleteTimer(longTimer);
X    puts("\nEnd of timer demo.\n");
X}
X#endif
X
END_OF_FILE
if test 6036 -ne `wc -c <'MRTimer.c'`; then
    echo shar: \"'MRTimer.c'\" unpacked with wrong size!
fi
# end of 'MRTimer.c'
fi
if test -f 'MRTimer.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MRTimer.h'\"
else
echo shar: Extracting \"'MRTimer.h'\" \(697 characters\)
sed "s/^X//" >'MRTimer.h' <<'END_OF_FILE'
X/* Timer support routine declarations.
X * Filename:	MRTimer.h
X */
X
X#ifndef MRTIMER_H
X#define MRTIMER_H 1
X
X#ifndef EXEC_TYPES_H
X#include <exec/types.h>
X#endif
X
X#ifndef EXEC_IO_H
X#include <exec/io.h>
X#endif
X
X#ifndef DEVICES_TIMER_H
X#include <devices/timer.h>
X#endif
X
X#ifndef FUNCTIONS_H
X#include <functions.h>
X#endif
X
X#ifndef __PARMS
X#include <parms.h>
X#endif
X
X/* MRTimer.c */
Xstruct timerequest *CreateTimer __PARMS((short vBlank));
Xvoid DeleteTimer __PARMS((struct timerequest *timeRequest));
Xvoid StartTimer __PARMS((struct timerequest *timeRequest, 
X                         unsigned long seconds, unsigned long microSeconds));
Xvoid StopTimer __PARMS((struct timerequest *timeRequest));
X
X#endif
END_OF_FILE
if test 697 -ne `wc -c <'MRTimer.h'`; then
    echo shar: \"'MRTimer.h'\" unpacked with wrong size!
fi
# end of 'MRTimer.h'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(706 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Aztec C makefile for MemEater.
X#
X# Substitute your own precompiled includes (or none) in the PRECOMP definition.
X#
XPRECOMP = -hi include:includes.pre
X
XCFLAGS = -pa -pc -bs $(PRECOMP)
X#
X
X# The object file, detach.o32, was obtained by compiling the main.c file in the
X# Aztec crt_src collection with -DDETACH. It resides in the normal library path.
X
XMemEater: MemEater.o MRTimer.o
X    ln -o MemEater MemEater.o MRTimer.o detach.o32 -lc
X
XMemEaterD: MemEater.o MRTimer.o
X    ln -w -g -o MemEaterD MemEater.o MRTimer.o -lc
X
XMemEater.o: MemEater.c MemEater-pw.h
X
Xzoo: MemEater
X    zoo a MemEater MemEater.info MemEater.doc MemEater MemEater.c \
X          MemEater.pw MemEater-pw.h MRTimer.h MRTimer.c Makefile
END_OF_FILE
if test 706 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'MemEater-pw.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MemEater-pw.h'\"
else
echo shar: Extracting \"'MemEater-pw.h'\" \(11335 characters\)
sed "s/^X//" >'MemEater-pw.h' <<'END_OF_FILE'
X
XUBYTE totalAvailGadgetSIBuff[12];
Xstruct StringInfo totalAvailGadgetSInfo = {
X  totalAvailGadgetSIBuff,  /* buffer where text will be edited */
X  NULL,  /* optional undo buffer */
X  0,  /* character position in buffer */
X  12,  /* maximum number of characters to allow */
X  0,  /* first displayed character buffer position */
X  0,0,0,0,0,  /* Intuition initialized and maintained variables */
X  0,  /* Rastport of gadget */
X  0,  /* initial value for integer gadgets */
X  NULL  /* alternate keymap (fill in if you set the flag) */
X};
X
XSHORT BorderVectors1[] = {
X  0,0,
X  66,0,
X  66,9,
X  0,9,
X  0,0
X};
Xstruct Border Border1 = {
X  -1,-1,  /* XY origin relative to container TopLeft */
X  3,0,JAM1,  /* front pen, back pen and drawmode */
X  5,  /* number of XY vectors */
X  BorderVectors1,  /* pointer to XY vectors */
X  NULL  /* next border in list */
X};
X
Xstruct Gadget totalAvailGadget = {
X  NULL,  /* next gadget */
X  150,60,  /* origin XY of hit box relative to window TopLeft */
X  65,8,  /* hit box width and height */
X  GADGHBOX+GADGHIMAGE,  /* gadget flags */
X  STRINGRIGHT+LONGINT,  /* activation flags */
X  STRGADGET,  /* gadget type flags */
X  (APTR)&Border1,  /* gadget border or image to be rendered */
X  NULL,  /* alternate imagery for selection */
X  NULL,  /* first IntuiText structure */
X  0,  /* gadget mutual-exclude long word */
X  (APTR)&totalAvailGadgetSInfo,  /* SpecialInfo structure */
X  TOTAL_AVAIL_GADGET,  /* user-definable data */
X  NULL  /* pointer to user-definable data */
X};
X
XUBYTE fastAvailGadgetSIBuff[12];
Xstruct StringInfo fastAvailGadgetSInfo = {
X  fastAvailGadgetSIBuff,  /* buffer where text will be edited */
X  NULL,  /* optional undo buffer */
X  0,  /* character position in buffer */
X  12,  /* maximum number of characters to allow */
X  0,  /* first displayed character buffer position */
X  0,0,0,0,0,  /* Intuition initialized and maintained variables */
X  0,  /* Rastport of gadget */
X  0,  /* initial value for integer gadgets */
X  NULL  /* alternate keymap (fill in if you set the flag) */
X};
X
XSHORT BorderVectors2[] = {
X  0,0,
X  66,0,
X  66,9,
X  0,9,
X  0,0
X};
Xstruct Border Border2 = {
X  -1,-1,  /* XY origin relative to container TopLeft */
X  3,0,JAM1,  /* front pen, back pen and drawmode */
X  5,  /* number of XY vectors */
X  BorderVectors2,  /* pointer to XY vectors */
X  NULL  /* next border in list */
X};
X
Xstruct Gadget fastAvailGadget = {
X  &totalAvailGadget,  /* next gadget */
X  150,45,  /* origin XY of hit box relative to window TopLeft */
X  65,8,  /* hit box width and height */
X  GADGHBOX+GADGHIMAGE,  /* gadget flags */
X  STRINGRIGHT+LONGINT,  /* activation flags */
X  STRGADGET,  /* gadget type flags */
X  (APTR)&Border2,  /* gadget border or image to be rendered */
X  NULL,  /* alternate imagery for selection */
X  NULL,  /* first IntuiText structure */
X  0,  /* gadget mutual-exclude long word */
X  (APTR)&fastAvailGadgetSInfo,  /* SpecialInfo structure */
X  FAST_AVAIL_GADGET,  /* user-definable data */
X  NULL  /* pointer to user-definable data */
X};
X
XUBYTE chipAvailGadgetSIBuff[12];
Xstruct StringInfo chipAvailGadgetSInfo = {
X  chipAvailGadgetSIBuff,  /* buffer where text will be edited */
X  NULL,  /* optional undo buffer */
X  0,  /* character position in buffer */
X  12,  /* maximum number of characters to allow */
X  0,  /* first displayed character buffer position */
X  0,0,0,0,0,  /* Intuition initialized and maintained variables */
X  0,  /* Rastport of gadget */
X  0,  /* initial value for integer gadgets */
X  NULL  /* alternate keymap (fill in if you set the flag) */
X};
X
XSHORT BorderVectors3[] = {
X  0,0,
X  66,0,
X  66,9,
X  0,9,
X  0,0
X};
Xstruct Border Border3 = {
X  -1,-1,  /* XY origin relative to container TopLeft */
X  3,0,JAM1,  /* front pen, back pen and drawmode */
X  5,  /* number of XY vectors */
X  BorderVectors3,  /* pointer to XY vectors */
X  NULL  /* next border in list */
X};
X
Xstruct Gadget chipAvailGadget = {
X  &fastAvailGadget,  /* next gadget */
X  150,30,  /* origin XY of hit box relative to window TopLeft */
X  65,8,  /* hit box width and height */
X  GADGHBOX+GADGHIMAGE,  /* gadget flags */
X  STRINGRIGHT+LONGINT,  /* activation flags */
X  STRGADGET,  /* gadget type flags */
X  (APTR)&Border3,  /* gadget border or image to be rendered */
X  NULL,  /* alternate imagery for selection */
X  NULL,  /* first IntuiText structure */
X  0,  /* gadget mutual-exclude long word */
X  (APTR)&chipAvailGadgetSInfo,  /* SpecialInfo structure */
X  CHIP_AVAIL_GADGET,  /* user-definable data */
X  NULL  /* pointer to user-definable data */
X};
X
XUBYTE totalWantedGadgetSIBuff[12] =
X  "0";
Xstruct StringInfo totalWantedGadgetSInfo = {
X  totalWantedGadgetSIBuff,  /* buffer where text will be edited */
X  NULL,  /* optional undo buffer */
X  0,  /* character position in buffer */
X  12,  /* maximum number of characters to allow */
X  0,  /* first displayed character buffer position */
X  0,0,0,0,0,  /* Intuition initialized and maintained variables */
X  0,  /* Rastport of gadget */
X  0,  /* initial value for integer gadgets */
X  NULL  /* alternate keymap (fill in if you set the flag) */
X};
X
XSHORT BorderVectors4[] = {
X  0,0,
X  66,0,
X  66,9,
X  0,9,
X  0,0
X};
Xstruct Border Border4 = {
X  -1,-1,  /* XY origin relative to container TopLeft */
X  3,0,JAM1,  /* front pen, back pen and drawmode */
X  5,  /* number of XY vectors */
X  BorderVectors4,  /* pointer to XY vectors */
X  NULL  /* next border in list */
X};
X
Xstruct IntuiText IText1 = {
X  3,0,JAM2,  /* front and back text pens, drawmode and fill byte */
X  -43,0,  /* XY origin relative to container TopLeft */
X  NULL,  /* font pointer or NULL for default */
X  (UBYTE *)"Total",  /* pointer to text */
X  NULL  /* next IntuiText structure */
X};
X
Xstruct Gadget totalWantedGadget = {
X  &chipAvailGadget,  /* next gadget */
X  50,60,  /* origin XY of hit box relative to window TopLeft */
X  65,8,  /* hit box width and height */
X  GADGHBOX+GADGHIMAGE,  /* gadget flags */
X  STRINGRIGHT+LONGINT,  /* activation flags */
X  STRGADGET,  /* gadget type flags */
X  (APTR)&Border4,  /* gadget border or image to be rendered */
X  NULL,  /* alternate imagery for selection */
X  &IText1,  /* first IntuiText structure */
X  0,  /* gadget mutual-exclude long word */
X  (APTR)&totalWantedGadgetSInfo,  /* SpecialInfo structure */
X  TOTAL_WANTED_GADGET,  /* user-definable data */
X  NULL  /* pointer to user-definable data */
X};
X
XUBYTE fastWantedGadgetSIBuff[12] =
X  "0";
Xstruct StringInfo fastWantedGadgetSInfo = {
X  fastWantedGadgetSIBuff,  /* buffer where text will be edited */
X  NULL,  /* optional undo buffer */
X  0,  /* character position in buffer */
X  12,  /* maximum number of characters to allow */
X  0,  /* first displayed character buffer position */
X  0,0,0,0,0,  /* Intuition initialized and maintained variables */
X  0,  /* Rastport of gadget */
X  0,  /* initial value for integer gadgets */
X  NULL  /* alternate keymap (fill in if you set the flag) */
X};
X
XSHORT BorderVectors5[] = {
X  0,0,
X  66,0,
X  66,9,
X  0,9,
X  0,0
X};
Xstruct Border Border5 = {
X  -1,-1,  /* XY origin relative to container TopLeft */
X  3,0,JAM1,  /* front pen, back pen and drawmode */
X  5,  /* number of XY vectors */
X  BorderVectors5,  /* pointer to XY vectors */
X  NULL  /* next border in list */
X};
X
Xstruct IntuiText IText2 = {
X  3,0,JAM2,  /* front and back text pens, drawmode and fill byte */
X  -35,0,  /* XY origin relative to container TopLeft */
X  NULL,  /* font pointer or NULL for default */
X  (UBYTE *)"Fast",  /* pointer to text */
X  NULL  /* next IntuiText structure */
X};
X
Xstruct Gadget fastWantedGadget = {
X  &totalWantedGadget,  /* next gadget */
X  50,45,  /* origin XY of hit box relative to window TopLeft */
X  65,8,  /* hit box width and height */
X  NULL,  /* gadget flags */
X  RELVERIFY+ENDGADGET+STRINGRIGHT+LONGINT,  /* activation flags */
X  STRGADGET,  /* gadget type flags */
X  (APTR)&Border5,  /* gadget border or image to be rendered */
X  NULL,  /* alternate imagery for selection */
X  &IText2,  /* first IntuiText structure */
X  0,  /* gadget mutual-exclude long word */
X  (APTR)&fastWantedGadgetSInfo,  /* SpecialInfo structure */
X  FAST_WANTED_GADGET,  /* user-definable data */
X  NULL  /* pointer to user-definable data */
X};
X
XUBYTE chipWantedGadgetSIBuff[12] =
X  "0";
Xstruct StringInfo chipWantedGadgetSInfo = {
X  chipWantedGadgetSIBuff,  /* buffer where text will be edited */
X  NULL,  /* optional undo buffer */
X  0,  /* character position in buffer */
X  12,  /* maximum number of characters to allow */
X  0,  /* first displayed character buffer position */
X  0,0,0,0,0,  /* Intuition initialized and maintained variables */
X  0,  /* Rastport of gadget */
X  0,  /* initial value for integer gadgets */
X  NULL  /* alternate keymap (fill in if you set the flag) */
X};
X
XSHORT BorderVectors6[] = {
X  0,0,
X  66,0,
X  66,9,
X  0,9,
X  0,0
X};
Xstruct Border Border6 = {
X  -1,-1,  /* XY origin relative to container TopLeft */
X  3,0,JAM1,  /* front pen, back pen and drawmode */
X  5,  /* number of XY vectors */
X  BorderVectors6,  /* pointer to XY vectors */
X  NULL  /* next border in list */
X};
X
Xstruct IntuiText IText3 = {
X  3,0,JAM2,  /* front and back text pens, drawmode and fill byte */
X  -35,0,  /* XY origin relative to container TopLeft */
X  NULL,  /* font pointer or NULL for default */
X  (UBYTE *)"Chip",  /* pointer to text */
X  NULL  /* next IntuiText structure */
X};
X
Xstruct Gadget chipWantedGadget = {
X  &fastWantedGadget,  /* next gadget */
X  50,30,  /* origin XY of hit box relative to window TopLeft */
X  65,8,  /* hit box width and height */
X  NULL,  /* gadget flags */
X  RELVERIFY+ENDGADGET+STRINGRIGHT+LONGINT,  /* activation flags */
X  STRGADGET,  /* gadget type flags */
X  (APTR)&Border6,  /* gadget border or image to be rendered */
X  NULL,  /* alternate imagery for selection */
X  &IText3,  /* first IntuiText structure */
X  0,  /* gadget mutual-exclude long word */
X  (APTR)&chipWantedGadgetSInfo,  /* SpecialInfo structure */
X  CHIP_WANTED_GADGET,  /* user-definable data */
X  NULL  /* pointer to user-definable data */
X};
X
X#define GadgetList1 chipWantedGadget
X
Xstruct IntuiText IText5 = {
X  1,0,JAM2,  /* front and back text pens, drawmode and fill byte */
X  149,21,  /* XY origin relative to container TopLeft */
X  NULL,  /* font pointer or NULL for default */
X  (UBYTE *)"Current(K)",  /* pointer to text */
X  NULL  /* next IntuiText structure */
X};
X
Xstruct IntuiText IText4 = {
X  1,0,JAM2,  /* front and back text pens, drawmode and fill byte */
X  50,21,  /* XY origin relative to container TopLeft */
X  NULL,  /* font pointer or NULL for default */
X  (UBYTE *)"Limits(K)",  /* pointer to text */
X  &IText5  /* next IntuiText structure */
X};
X
X#define IntuiTextList1 IText4
X
Xstruct NewWindow NewWindowStructure1 = {
X  56,29,  /* window XY origin relative to TopLeft of screen */
X  250,79,  /* window width and height */
X  0,1,  /* detail and block pens */
X  GADGETDOWN+GADGETUP+CLOSEWINDOW,  /* IDCMP flags */
X  WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+RMBTRAP+NOCAREREFRESH,  /* other window flags */
X  &chipWantedGadget,  /* first gadget in gadget list */
X  NULL,  /* custom CHECKMARK imagery */
X  (UBYTE *)"MemEater 1.0",  /* window title */
X  NULL,  /* custom screen pointer */
X  NULL,  /* custom bitmap */
X  5,5,  /* minimum width and height */
X  -1,-1,  /* maximum width and height */
X  WBENCHSCREEN  /* destination screen type */
X};
X
X
X/* end of PowerWindows source generation */
END_OF_FILE
if test 11335 -ne `wc -c <'MemEater-pw.h'`; then
    echo shar: \"'MemEater-pw.h'\" unpacked with wrong size!
fi
# end of 'MemEater-pw.h'
fi
if test -f 'MemEater.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MemEater.c'\"
else
echo shar: Extracting \"'MemEater.c'\" \(14823 characters\)
sed "s/^X//" >'MemEater.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <stdlib.h>
X#include <string.h>
X#include <exec/execbase.h>
X#include <exec/memory.h>
X#include <intuition/intuition.h>
X#include <functions.h>
X
X#include "MRTimer.h"
X
Xextern struct ExecBase *SysBase;
X
X#define CHIP_WANTED_GADGET      1
X#define FAST_WANTED_GADGET      2
X#define TOTAL_WANTED_GADGET     3
X#define CHIP_AVAIL_GADGET       4
X#define FAST_AVAIL_GADGET       5
X#define TOTAL_AVAIL_GADGET      6
X
X
X#include "MemEater-pw.h"
X
X/*  We represent our "held-in-reserve" blocks with the following structure. */
X
Xstruct MemNode {  
X    struct MemNode  *next;
X    LONG            blockSize;
X    /* ... remainder of allocated memory ... */
X    };
X
X/*  ReserveMem describes the entries in a given "reserve" list. */
X
Xstruct MemSpecs {
X    ULONG           memType;        /* MEMF_CHIP or MEMF_FAST */
X    struct MemNode  *list;          /* list of nodes allocated */
X    LONG            avail;          /* amount currently available */
X    LONG            limit;          /* amount we want */
X    LONG            maximum;
X    };
X
Xlong _stack = 4000;
Xlong _priority = 1;
Xlong _BackGroundIO;
Xchar *_procname = "MemEater Process";
X
Xstruct IntuitionBase    *IntuitionBase;
Xstruct GfxBase          *GfxBase;
X
Xstruct MemSpecs         chipSpecs;      /* chip memory in reserve */
Xstruct MemSpecs         fastSpecs;      /* fast memory specifications */
X
XLONG                    minBlockSize = sizeof(struct MemNode);
Xstruct Window           *myWindow;
XULONG                   myWindowBit;
X
Xstruct timerequest      *timer;
XULONG                   timerBit;
X
X#ifndef min
X#define min(a, b) ( (a) < (b) ? (a) : (b) )
X#endif
X
X/* Get the pointer to a gadget string, given a pointer to a gadget. */
X#define GadgetString(g) ((struct StringInfo *) ((g)->SpecialInfo))->Buffer
X
Xvoid    DoGadget(struct Gadget *theGadget);
Xvoid    FreeSome(struct MemSpecs *spec, LONG newLimit);
Xvoid    GrabMem(struct MemSpecs *spec);
Xvoid    InitSpecs(struct MemSpecs *specs, ULONG memType);
XLONG    MaxSize(LONG t);
Xvoid    ReleaseMem(struct MemSpecs *specs);
Xvoid    ResetStringInfo(struct StringInfo *s);
Xvoid    SetNumberGadget(struct Gadget *gadget, LONG value);
Xvoid    SetStringGadget(struct Gadget *gadget, 
X                        struct Window *window, 
X                        struct Requester *requester, 
X                        const char *s);
Xvoid    Update(void);
X
X
Xmain(int argc, char **argv)
X{
X    static char *noTimerMsg =       "MemEater: can't create timer!\n";
X    static char *noWindowMsg =      "MemEater: can't open my window!\n";
X    static char *whereIntuition =   "MemEater: where is intuition.library?\n";
X    static char *whereGraphics =    "MemEater: where is graphics.library?\n";
X
X    ULONG               bits;       /* returned by Wait() */
X    LONG                class;
X    struct Gadget       *gadget;
X    struct IntuiMessage *msg;
X    BOOL                quit = FALSE;
X    struct RastPort     *rp;
X
X    IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 0L);
X    if (IntuitionBase == NULL) {
X        Write(Output(), whereIntuition, sizeof(whereIntuition));
X        exit(1);
X    }
X    
X    GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0L);
X    if (GfxBase == NULL) {
X        Write(Output(), whereGraphics, sizeof(whereGraphics));
X        exit(1);
X    }
X
X    timer = CreateTimer(1);             /* Use VBLANK timer. */
X    if (! timer ) {
X        Write(Output(), noTimerMsg, sizeof(noTimerMsg));
X        exit(1);
X    }
X
X    myWindow = OpenWindow(&NewWindowStructure1);
X
X    if (! myWindow) {
X        Write(Output(), noWindowMsg, sizeof(noWindowMsg));
X        exit(1);
X    }
X    rp = myWindow->RPort;
X
X    PrintIText(rp, &IntuiTextList1, 0L, 0L);
X
X    
X    /* Get system maximums. We should only have to do this once. If the user pulls
X     * an AddMem behind our backs, he'll have to restart us. T. S.
X     */
X
X    InitSpecs(&chipSpecs, MEMF_CHIP);
X    InitSpecs(&fastSpecs, MEMF_FAST);
X
X    SetNumberGadget(&chipWantedGadget, chipSpecs.limit / 1024L);
X    SetNumberGadget(&fastWantedGadget, fastSpecs.limit / 1024L);
X    SetNumberGadget(&totalWantedGadget, (chipSpecs.limit + fastSpecs.limit) / 1024L);
X
X    myWindowBit = (1L << myWindow->UserPort->mp_SigBit);
X    timerBit = (1L << timer->tr_node.io_Message.mn_ReplyPort->mp_SigBit);
X
X    while (! quit ) {
X        StartTimer(timer, 0L, 500000L);     /* Start 1/2 second timer. */ 
X        bits = Wait(myWindowBit | timerBit);
X        if (! bits & timerBit)
X            StopTimer(timer);
X        else 
X            WaitIO(&timer->tr_node);
X        
X        chipSpecs.avail = AvailMem(MEMF_CHIP);
X        fastSpecs.avail = AvailMem(MEMF_FAST);
X
X        if (bits & myWindowBit) {
X            while (msg  = (struct IntuiMessage *) GetMsg(myWindow->UserPort)) {
X                class = msg->Class;
X                gadget = (struct Gadget *) msg->IAddress;
X        
X                ReplyMsg( (struct Message *) msg);
X                if (class == CLOSEWINDOW) {
X                    quit = TRUE;
X                    break;
X                }
X
X                if (class == GADGETUP) {
X                    DoGadget(gadget);
X                    continue;
X                }
X                
X                if (class == WINDOWREFRESH) {
X                    BeginRefresh(myWindow);
X                    EndRefresh(myWindow, TRUE);
X                }
X            }
X        }
X        GrabMem(&chipSpecs);
X        GrabMem(&fastSpecs);
X        Update();
X    }
X
X    ReleaseMem(&chipSpecs);
X    ReleaseMem(&fastSpecs);
X    CloseWindow(myWindow);
X    DeleteTimer(timer);
X}
X
X/*  FUNCTION
X *      DoGadget - process gadget event.
X *
X *  SYNOPSIS
X *      void DoGadget(struct Gadget *theGadget);
X *
X *  DESCRIPTION
X *      DoGadget is called whenever a gadget-related Intuition message is
X *      received. There are only two gadgets that will cause messages to be
X *      generated: CHIP_WANTED_GADGET and FAST_WANTED_GADGET. The value for the
X *      respective gadget is verified and the display is updated, if necessary.
X */
X
Xvoid
XDoGadget(struct Gadget *theGadget)
X{
X    LONG               newValue;
X    struct StringInfo   *si;
X    struct MemSpecs     *specs = NULL;
X    BOOL                updateTotal = FALSE;
X
X    switch (theGadget->GadgetID) {
X
X    case CHIP_WANTED_GADGET:
X        specs = &chipSpecs;
X        break;
X
X    case FAST_WANTED_GADGET:
X        specs = &fastSpecs;
X        break;
X
X    default:
X        break;
X    }
X
X    if (specs) {
X        si = (struct StringInfo *) theGadget->SpecialInfo;
X        newValue = si->LongInt * 1024L;
X        if (newValue > specs->maximum) {
X            specs->limit = specs->maximum;
X            SetNumberGadget(theGadget, specs->limit / 1024L);
X        }
X        else {
X            /* Are we giving some back? */
X            if (newValue > specs->limit) FreeSome(specs, newValue);
X            specs->limit = newValue;
X            updateTotal = TRUE;
X        }
X    }
X
X    if (updateTotal) {
X        SetNumberGadget(&totalWantedGadget, 
X            (chipSpecs.limit + fastSpecs.limit) / 1024L);
X    }
X}
X
X/*  FUNCTION
X *      FreeSome - free up some of our reserve memory.
X *
X *  SYNOPSIS
X *      void FreeSome(struct MemSpecs *specs, LONG newLimit);
X *
X *  DESCRIPTION
X *      FreeSome is called whenever the user ups the limit on a given class of
X *      memory (described by parameter <specs>). The <newLimit> parameter defines
X *      the new upper limit for the memory class.
X */
X
Xvoid
XFreeSome(struct MemSpecs *specs, LONG newLimit)
X{
X    struct MemNode  *nextNode;
X
X    while (specs->list && (newLimit > specs->limit)) {
X        nextNode = specs->list->next;
X        newLimit -= specs->list->blockSize;
X        FreeMem(specs->list, specs->list->blockSize);
X        specs->list = nextNode;
X    }
X}
X
X/*  FUNCTION
X *      GrabMem - grab memory from the system.
X *
X *  SYNOPSIS
X *      GrabMem is called once each timer interval (or upon receipt of an
X *      Intuition message) for each class of memory being maintained. If the
X *      current amount of memory available for the class described by 
X *      <specs> exceeds the desired limit, memory is "consumed", preserving
X *      the limit.
X */
X
Xvoid
XGrabMem(struct MemSpecs *specs)
X{
X    LONG            blockSize;
X    LONG            diff;
X    LONG            largest;
X    struct MemNode  *node;
X
X    while ((diff = (specs->avail - specs->limit)) > minBlockSize) {
X
X        /* What's the largest block available? */
X        largest = AvailMem(specs->memType | MEMF_LARGEST);
X    
X        /* Figure the size that we need. */
X        blockSize = min(diff, largest);
X
X        /* If it's less than the size of a MemNode, just forget it. */
X        if (blockSize < minBlockSize)
X            break;
X
X        node = AllocMem(blockSize, specs->memType); /* Grab the block. */
X        if (! node) break;                          /* Something went very wrong. */
X
X        node->blockSize = blockSize;
X        node->next = specs->list;
X        specs->list = node;
X        specs->avail = AvailMem(specs->memType);    /* Reassess available memory. */
X    }
X}
X
X/*  FUNCTION
X *      InitSpecs - initialize a memory specifications packet.
X *
X *  SYNOPSIS
X *      void InitSpecs(struct MemSpecs *specs, ULONG memType);
X *
X *  DESCRIPTION
X *      InitSpecs initializes a memory specifications packet with information
X *      pertinent to the class of memory defined by <memType>.
X */
X
Xvoid
XInitSpecs(struct MemSpecs *specs, ULONG memType)
X{
X    specs->memType = memType;
X    specs->avail = AvailMem(memType);
X    Forbid();
X    specs->maximum = MaxSize(memType);
X    Permit();
X    specs->limit = specs->maximum;
X    specs->list = NULL;
X}
X
X/*  FUNCTION
X *      MaxSize - determine maximum memory available for a given type
X *
X *  SYNOPSIS
X *      LONG MaxSize(LONG t);
X *
X *  DESCRIPTION
X *      MaxSize determines the maximum amount of memory available for a given
X *      class (MEMF_CHIP or MEMF_FAST) as defined by <t>. MaxSize must be bracketed
X *	    by calls to Forbid/Permit since system structures are accessed.
X *
X *  CREDITS
X *      This code was lifted from the "avail" program.
X */
X
XLONG
XMaxSize (LONG t)
X{
X    /* THIS CODE MUST ALWAYS BE CALLED WHILE FORBIDDEN */
X    LONG               size = 0;
X    struct MemHeader    *mem;
X    struct ExecBase     *eb = SysBase;
X
X    for (mem = (struct MemHeader *)eb->MemList.lh_Head;
X	     mem->mh_Node.ln_Succ;
X	     mem = (struct MemHeader *)mem->mh_Node.ln_Succ) {
X        if (mem -> mh_Attributes & t) {
X	        size += ((LONG) mem -> mh_Upper - (LONG) mem -> mh_Lower);
X	    }
X    }
X
X    return size;
X}
X
X/*  FUNCTION
X *      ReleaseMem - release all memory for a given class.
X *
X *  SYNOPSIS
X *      void ReleaseMem(struct MemSpecs *specs);
X *
X *  DESCRIPTION
X *      ReleaseMem is called at program termination to free up all memory consumed
X *      by this program.
X */
X
Xvoid
XReleaseMem(struct MemSpecs *specs)
X{
X    specs->limit = 0;
X    FreeSome(specs, 0x7fffffff);
X}
X
X
X/*  FUNCTION
X        ResetStringInfo - reset information in a StringInfo structure.
X
X    SYNOPSIS
X        void ResetStringInfo(struct StringInfo *s);
X
X    DESCRIPTION
X        ResetStringInfo resets certain parameters in the StringInfo
X        structure pointed to by <s>, including:
X
X            UndoBuffer
X            DispPos
X            UndoPos
X            NumChars
X*/
Xvoid
XResetStringInfo(struct StringInfo *s)
X{
X    *(s->UndoBuffer) = '\0';
X    s->BufferPos = 0;
X    s->DispPos = 0;
X    s->UndoPos = 0;
X    s->NumChars = strlen((char *) s->Buffer);
X}
X
X/*  FUNCTION
X *      SetNumberGadget - update the contents of a numerical gadget.
X *
X *  SYNOPSIS
X *      void SetNumberGadget(struct Gadget *gadget, LONG value);
X *
X *  DESCRIPTION
X *      SetNumberGadget provides an economical way to update the contents of
X *      number (string) gadgets without requiring runtime library support. It
X *      calls SetStringGadget to actually change the gadget's contents.
X */
X
Xvoid
XSetNumberGadget(struct Gadget *gadget, LONG value)
X{
X    int     digitCount = 0;
X    char    digits[12];
X    char    numString[12], *ns;
X
X    do {
X        digits[digitCount++] = (value % 10) + '0';
X        value /= 10;
X    } while (value > 0);
X
X    ns = numString;
X    while (--digitCount >= 0) {
X        *ns++ = digits[digitCount];
X    }
X
X    *ns = '\0';                         /* Add terminating null. */
X    SetStringGadget(gadget, myWindow, NULL, numString);
X}
X
X/*  FUNCTION
X        SetStringGadget - set the value of a string gadget.
X
X    SYNOPSIS
X        void SetStringGadget(gadget, window, requester, s)
X             struct Gadget      *gadget;
X             struct Window      *window;
X             struct Requester   *requester;
X             const char         *s;
X
X    DESCRIPTION
X        SetStringGadget sets the string value of a <gadget>, which
X        belongs to <window>, to the character string pointed to by <s>.
X        It does this in a "polite" way, first removing the gadget from
X        the list, modifying it, then adding it back and refreshing the
X        gadget list. 
X
X        If the <gadget> belongs to a requester, <requester> must contain
X        the address of that requester.  Otherwise, it must be NULL.
X
X        If <window> is NULL, the gadget is modified without attempting
X        to remove/restore it to/from a window gadget list.
X*/
Xvoid
XSetStringGadget(gadget, window, requester, s)
X    struct Gadget       *gadget;
X    struct Window       *window;
X    struct Requester    *requester;
X    const char          *s;
X{
X    char    *gs;                        /* pointer to gadget's text */
X    int     max;
X    ULONG   position;
X    struct StringInfo *sInfo;
X    char    *s1;
X
X    /* Make sure we are trying to modify a string gadget. If we aren't,
X     * just don't do anything.
X     */
X    if (gadget->GadgetType & STRGADGET) {
X        gs = (char *) GadgetString(gadget);
X        sInfo = (struct StringInfo *) (gadget->SpecialInfo);
X        max = sInfo->MaxChars;
X        if (window)
X            position = RemoveGList(window, gadget, 1L);
X        strncpy(gs, s, max);            /* Don't exceed gadget capacity. */
X        if (s1 = strchr(gs, '\n'))      /* Eliminate newline characters. */
X            *s1 = '\0';
X        ResetStringInfo(sInfo);
X        if (window) {
X            AddGList(window, gadget, position, 1L, requester);
X            RefreshGList(gadget, window, requester, 1L);
X        }
X    }
X}
X
X/*  FUNCTION
X *      Update - update the "Current" information in our display window.
X *
X *  SYNOPSIS
X *      void Update(void);
X *
X *  DESCRIPTION
X *      Update is called periodically to refresh the display window's "Current"
X *      information.
X */
X
Xvoid
XUpdate(void)
X{
X    SetNumberGadget(&chipAvailGadget, chipSpecs.avail / 1024L);
X    SetNumberGadget(&fastAvailGadget, fastSpecs.avail / 1024L);
X    SetNumberGadget(&totalAvailGadget, (chipSpecs.avail + fastSpecs.avail) / 1024L);    
X}
END_OF_FILE
if test 14823 -ne `wc -c <'MemEater.c'`; then
    echo shar: \"'MemEater.c'\" unpacked with wrong size!
fi
# end of 'MemEater.c'
fi
if test -f 'MemEater.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MemEater.doc'\"
else
echo shar: Extracting \"'MemEater.doc'\" \(2186 characters\)
sed "s/^X//" >'MemEater.doc' <<'END_OF_FILE'
XProgram:        MemEater V1.0 (Public Domain)
XDate:           03/27/90
XAuthor:         Mark R. Rinfret (source available)
X
X
XMemEater  was  written for software developers (or the curious) who wish to
Xtest application behavior under low memory conditions or to determine if an
Xapplication  will run correctly on a given system configuration.  It can be
Xstarted  from  the  CLI  or  the WorkBench.  When run from the CLI, it will
Xdetach and run as an independent process.
X
XMemEater presents a small window with six numeric gadgets.  The contents of
Xthe  top two gadgets in the left-hand column (Limits) may be altered by the
Xuser  to establish the maximum amount of CHIP and FAST memory that is to be
Xavailable  (specified  in  "K").  The right-hand column of gadgets displays
Xthe  actual amount of memory available in each category.  The bottom gadget
Xin  each  row  reports  the total allowed and total available memory.  Upon
Xstartup, the program defaults to the total available memory in each class.
X
XMemEater  is  driven  by a 1/2 second interval timer.  On each interval, it
Xchecks  to  see if more memory is available than is allowed.  If so, memory
Xis  "consumed"  until  requirements  are  met  (as closely as is possible).
XMemEater  only  controls  the  maximum amount of memory available.  It does
Xnothing to prevent memory from going below the levels set by the user (this
Xis  the  whole  object of the program - to generate low memory conditions).
XIf   any  application  terminates  or  releases  memory  and  causes  these
Xthresholds  to  be  exceeded,  MemEater  gobbles  up the excess memory.  To
Xregain  all  of the memory in a given class, just enter a very large number
Xin  the appropriate CHIP or FAST limit gadget.  MemEater will give back all
Xthe memory it has consumed in that class.  Terminating MemEater by clicking
Xits window close box will also release all memory.
X
XI  decided to use units of "K" vs.  bytes since we normally deal with those
Xunits  when defining system limits.  Feel free to change that, if you like.
XI might add a "Units" gadget to the next revision (if any).
X
XMemEater  is  public  domain.  I place no copyrights or restrictions on its
Xuse.
X
END_OF_FILE
if test 2186 -ne `wc -c <'MemEater.doc'`; then
    echo shar: \"'MemEater.doc'\" unpacked with wrong size!
fi
# end of 'MemEater.doc'
fi
if test -f 'MemEater.info.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MemEater.info.uu'\"
else
echo shar: Extracting \"'MemEater.info.uu'\" \(1781 characters\)
sed "s/^X//" >'MemEater.info.uu' <<'END_OF_FILE'
Xbegin 664 MemEater.info
XMXQ```0`BM^``@@!D`#\`(P`&``$``0`!D&0``9"$``%OE@```````````&0`Q
XM`````P````````&2BH````"```````````````````^@```````_`",``@`!T
XM0*@#````````````````````````````````````````````````````````K
XM`````````````````````````````````````````````````````````````
XM```?__P````#____SP```!P?____@```^`____\```'\'___'P```_____\?\
XM```'____GPX```____^?!```'___QXX````___W'A````'__W(,`````__X`R
XM``````#__@```*JH`/__W(,$JJ@`?__]QXX````____'GP0``!____^?#@``"
XM#____Y\?```'_____Q\```/______X```/______@```'_____\````!____^
XM_```````___@````````````````````````````````````````````````:
XM`````````````````````````````````````````````````````````````
XM````````````````'__\`````_____\````?_____X```/_____@```!____.
XMX`````/____@````!___^``````/___X`````!___@``````/__@``````!_[
XM_@```?_\`/_^```!__P`__X```````#__@```````'__X```````/__^````'
XM```?___X``````____@`````!____^`````#_____^"```#______X```!__V
XM____`````?____P``````/__X```````````````````/P`C``(``3TX`P``R
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````__X```````?__^``````/P?__`````!^`___`````/X#___P```!_X_P
XM___P```/______P``!_______P``/______S``!_W_____^``/_/____@```B
XM_^/_@``_@`#_^``___\``'______^```/______````?_____P```!_____^W
XM````#_____P````#____\`````'____``````!___```%```!_\````4````^
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM``````````````````/_^```````'___@`````#____P`````?____P````#!
XM_____\````?_____\```#______\```?______\``#_______P``?_______$
XM@`#_______^``/_______X``________``!_______@``#______P```'___Y
XM__\````?_____@````_____\`````_____``'@`!____P``>```?__P`````D
X;``?_```````````````````````````````$*
X``
Xend
Xsize 1242
END_OF_FILE
if test 1781 -ne `wc -c <'MemEater.info.uu'`; then
    echo shar: \"'MemEater.info.uu'\" unpacked with wrong size!
fi
# end of 'MemEater.info.uu'
fi
if test -f 'MemEater.pw.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MemEater.pw.uu'\"
else
echo shar: Extracting \"'MemEater.pw.uu'\" \(2192 characters\)
sed "s/^X//" >'MemEater.pw.uu' <<'END_OF_FILE'
Xbegin 664 MemEater.pw
XM4&]W97)7:6YD;W=S('8R+C5B(*DQ.3@W+"`Q.3@X(&)Y($E.3U9!5%)/3DE#T
XM4RP@24Y#+B`@("`@("`@("`@("`@("`@("`@("`@```#[`````)```#_````W
XM`0`````!``````$```````````$``Q`.```"8``%``7_____```````J"=@`8
XM``````````````````````8`(7^@```````!```!`#@`'0#Z`$\`!0`%____M
XM_P````U-96U%871E<B`Q+C```"H"R``R`!X`00`(```,`P`$`"H"?```````3
XM(=TH```````F,=`````H9@#_____`P``!0`J`HP```````````!"````0@`)D
XM````"0```````````P`!`/_=`````````"((4``````````%0VAI<``````,X
XM,``R`"`@(```+)8`````"@``#`4`(GFP`"*)B``BJB@`*@*H`"*VT``BQ&@`;
XM```18VAI<%=A;G1E9$=A9&=E=``````!``````(P`````!-#2$E07U=!3E1%L
XM1%]'041'150``````0`````!```J!`@`,@`M`$$`"```#`,`!``J`O0`````B
XM`"H#(```````*@-`````*@-P_____P,```4`*@,$````````````0@```$(`0
XM"0````D```````````,``0#_W0`````````B\G@`````````!49A<W0`````1
XM##``,@`@("```"5E``````H```P%`"H#F``FT&@`*@.X`"H#R``J`^@`*@/XJ
XM````$69A<W1786YT961'861G970``````0`````",``````31D%35%]704Y4[
XM141?1T%$1T54``````$``````0``*@90`#(`/`!!``@``PP#``0`*@0T````%
XM```J!&```````"H$H````"H$T/____\#```%`"H$1````````````$(```!"4
XM``D````)```````````#``$`_]4`````````*@2```````````94;W1A;```B
XM```,,``R-``@(```*@0`````"``##```*@3X`"H%0``J!5``*@5@`"H%@``JC
XM!9`````2=&]T86Q786YT961'861G970``````0`````",``````45$]404Q?D
XM5T%.5$5$7T=!1$=%5``````!``````$``"H'8`"6`!X`00`(``,,`P`$`"H&D
XM?``````````````````J!J@````J!MC_____`P``!0`J!HP```````````!">
XM````0@`)````"0``````````````#``R,S0U-C<``"R6``````@``PP``"H%C
XML``J!)``*@<0`"H'(``J!P``*@=`````$&-H:7!!=F%I;$=A9&=E=``````!0
XM``````(P`````!)#2$E07T%604E,7T=!1$=%5``````!``````$``"H(F`"6A
XM`"T`00`(``,,`P`$`"H'C``````````````````J!\@````J!_C_____`P``J
XM!0`J!YP```````````!"````0@`)````"0``````````````#``@("`@("``T
XM`"H'``````@``PP``"H((``J!:``*@A(`"H(6``J!U``*@@X````$&9A<W1!7
XM=F%I;$=A9&=E=``````!``````(P`````!)&05-47T%604E,7T=!1$=%5```"
XM```!``````$```````"6`#P`00`(``,,`P`$`"H(Q``````````````````J3
XM"0`````J"3#_____`P``!0`J"-0```````````!"````0@`)````"0``````,
XM````````#``@("`@("```"H(``````@``PP``"H)6``J![@`*@F(`"H)F``JY
XM"7@`*@FX````$71O=&%L079A:6Q'861G970``````0`````",``````35$]47
XM04Q?059!24Q?1T%$1T54``````$``````0`!``$``#(`%0``````*@JP`"H*'
XMR`````I,:6UI=',H2RD``0`!``"5`!4``````"H*Z``````````+0W5R<F5NB
X%="A+*0!,<
X``
Xend
Xsize 1535
END_OF_FILE
if test 2192 -ne `wc -c <'MemEater.pw.uu'`; then
    echo shar: \"'MemEater.pw.uu'\" unpacked with wrong size!
fi
# end of 'MemEater.pw.uu'
fi
if test -f 'MemEater.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MemEater.uu'\"
else
echo shar: Extracting \"'MemEater.uu'\" \(10620 characters\)
sed "s/^X//" >'MemEater.uu' <<'END_OF_FILE'
Xbegin 664 MemEater
XM```#\P`````````#``````````(```8O```!&@````$```/I```&+T[Z$0I4D
XM;W1A;`!&87-T``!#:&EP``!#=7)R96YT*$LI``!,:6UI=',H2RD`365M16%T(
XM97(@,2XP``!-96U%871E<B!0<F]C97-S``!.5?_>0FW_[BM._^9P`$/Z!$4LQ
XM;(/.3J[]V"QM_^8I0(/22JR#TF8``#A([4`,_]YV!"0L@XHO`R\"+&R#UDZNX
XM_\0B`"0?)A\L;(/63J[_T$SM0`S_WDAX``%.NA8J6$\K3O_F<`!#^@/_+&R#C
XMSDZN_=@L;?_F*4"#VDJL@]IF```X2.U`#/_>=@0D+(..+P,O`BQL@]9.KO_$@
XM(@`D'R8?+&R#UDZN_]!,[4`,_]Y(>``!3KH5TEA//SP``4ZZ".Q43RE`@]Y*.
XMK(/>9@``.$CM0`S_WG8$)"R#@B\#+P(L;(/63J[_Q"(`)!\F'RQL@]9.KO_01
XM3.U`#/_>2'@``4ZZ%8983RM._^9![(-"+&R#TDZN_S0L;?_F*4"#XDJL@^)FF
XM```X2.U`#/_>=@0D+(.&+P,O`BQL@]9.KO_$(@`D'R8?+&R#UDZN_]!,[4`,G
XM_]Y(>``!3KH5,%A/(&R#XBMH`#+_ZBM._^9R`'``0>R#+B)((&W_ZBQL@]).J
XMKO\H+&W_YDAX``)(;(/F3KH%*%!/2'@`!$AL@_I.N@4:4$\B/```!``@+(/RD
XM3KH4)B\`2&R"[DZZ!C)03R(\```$`"`LA`9.NA0,+P!(;():3KH&&%!/("R#G
XM\M"LA`8B/```!`!.NA/N+P!(;('&3KH%^E!/(&R#XB!H`%9P`!`H``]R`>&AN
XM*4&$#B!L@]X@:``.<``0*``/<@'AH2E!A!)*;?_N9@`!<$AY``>A($*G+RR#V
XMWDZZ"+Q/[P`,*T[_YB`LA`Z`K(02+&R#SDZN_L(L;?_F*T#__$JM__QF```(;
XM<`%@```$<`#`K(029P``$"\L@]Y.N@C&6$]@```6*T[_YB)L@]XL;(/.3J[^=
XM)BQM_^8K3O_F<@(L;(/.3J[_*"QM_^8I0(/N*T[_YG($+&R#SDZN_R@L;?_FX
XM*4"$`B`M__S`K(0.9P``LBM._^8@;(/B(&@`5BQL@\Y.KOZ,+&W_YBM`__!GI
XM``"2(&W_\"MH`!3_^"!M__`K:``<__0K3O_F(FW_\"QL@\Y.KOZ&+&W_Y@RM&
XM```"`/_X9@``##M\``'_[F```%0,K0```$#_^&8```XO+?_T3KH!0EA/8(H,?
XMK0$```#_^&8``"PK3O_F(&R#XBQL@]).KOZ>+&W_YBM._^9P`2!L@^(L;(/2V
XM3J[^DBQM_^9@`/]22&R#YDZZ`F183TAL@_I.N@):6$].N@7$8`#^C$AL@^9./
XMN@/P6$](;(/Z3KH#YEA/*T[_YB!L@^(L;(/23J[_N"QM_^8O+(/>3KH&M%A/O
XM3EU.=4UE;45A=&5R.B!C86XG="!C<F5A=&4@=&EM97(A"@!-96U%871E<CH@/
XM8V%N)W0@;W!E;B!M>2!W:6YD;W<A"@!-96U%871E<CH@=VAE<F4@:7,@:6YTT
XM=6ET:6]N+FQI8G)A<GD_"@!-96U%871E<CH@=VAE<F4@:7,@9W)A<&AI8W,ND
XM;&EB<F%R>3\*`&EN='5I=&EO;BYL:6)R87)Y`&=R87!H:6-S+FQI8G)A<GD`X
XM3E7_\D*M__1";?_R(&T`"#`H`"9@```>0>R#YBM(__1@```<0>R#^BM(__1@/
XM```08```#%-`9^!30&?H8/)*K?_T9P``BB!M``@K:``B__@@;?_X("@`''(**
XMXZ`K0/_\(&W_]"`M__RPJ``0;P``,B!M__0B;?_T(V@`$``,(&W_]"`H``PB9
XM/```!`!.NA#*+P`O+0`(3KH"UE!/8```,"!M__0@+?_\L*@`#&\``!`O+?_\&
XM+RW_]$ZZ`#Y03R!M__0A;?_\``P[?``!__)*;?_R9P``("`L@_+0K(0&(CP`&
XM``0`3KH0<B\`2&R!QDZZ`GY03TY=3G5.5?_X(&T`"$JH``1G``!>(&T`""`M9
XM``RPJ``,;P``3B!M``@@:``$*U#__"!M``@@:``$("@`!)&M``PK3O_X(&T`X
XM""!H``0@*``$(&T`"")H``0L;(/.3J[_+BQM__@@;0`((6W__``$8)A.74YUM
XM3E7_["!M``@B;0`((&@`")'I``PK2/_XL>R#?F\``+(K3O_L(&T`""`0",``J
XM$2(`+&R#SDZN_R@L;?_L*T#_]"`M__BPK?_T;```"B`M__A@```&("W_]"M``
XM__P@+?_\L*R#?FT``&HK3O_L(&T`""(0("W__"QL@\Y.KO\Z+&W_["M`__!*P
XMK?_P9P``1"!M__`A;?_\``0@;0`((FW_\"*H``0@;0`((6W_\``$*T[_["!MX
XM``@B$"QL@\Y.KO\H+&W_["!M``@A0``(8`#_-DY=3G5.5?_\(&T`"""M``PK"
XM3O_\(BT`#"QL@\Y.KO\H+&W__"!M``@A0``(*T[__"QL@\Y.KO]\+&W__"\M&
XM``Q.N@`V6$\@;0`((4``$"M.__PL;(/.3J[_=BQM__P@;0`((FT`""-H`!``@
XM#"!M``A"J``$3EU.=4Y5__1"K?_\*VR#SO_T(&W_]"MH`4+_^&````H@;?_X3
XM*U#_^"!M__A*D&<``"P@;?_X<``P*``.P*T`"&<``!@@;?_X(FW_^"!H`!B1L
XMZ0`4(`C1K?_\8,0@+?_\3EU.=4Y5```@;0`(0J@`#$AY?____R\M``A.NOW0<
XM4$].74YU3E4``"!M``@@:``$0A`@;0`(0F@`""!M``A":``,(&T`"$)H``X@B
XM;0`(+Q!.N@W66$\@;0`(,4``$$Y=3G5.5?_@0JW__'(*("T`#$ZZ#@(&@```I
XM`#`B+?_\4JW__$'M__`1@!@`<@H@+0`,3KH-NBM```Q*K0`,;LQ![?_D*TC_5
XMX%.M__QM```8("W__$'M__`B;?_@4JW_X!*P"`!@XB!M_^!"$$AM_^1"IR\LW
XM@^(O+0`(3KH`"D_O`!!.74YU3E7_Y"!M``@(*``"`!%G``#4(&T`""!H`"(K:
XM4/_\(&T`""MH`"+_\"!M__`P:``**TC_^$JM``QG```@*T[_Z'`!(FT`""!M+
XM``PL;(/23J[^1"QM_^@K0/_T+RW_^"\M`!0O+?_\3KH+LD_O``Q(>``*+RW_C
XM_$ZZ"X103RM`_^QG```((&W_[$(0+RW_\$ZZ_K!83TJM``QG``!*2.U$`/_DY
XM)&T`$'(!("W_]")M``@@;0`,+&R#TDZN_DI,[40`_^1([40`_^1P`21M`!`BE
XM;0`,(&T`""QL@]).KOY03.U$`/_D3EU.=4Y5```B/```!``@+(/N3KH,<"\`(
XM2&R!,DZZ_GQ03R(\```$`"`LA`).N@Q6+P!(;("^3KK^8E!/("R#[M"LA`(BO
XM/```!`!.N@PX+P!(;(!*3KK^1%!/3EU.=4Y5_^Q"K?_\0JW_^$*M__1*;0`(/
XM9P``"'`!8```!'``*T#_\$*G0J=.N@K>4$\K0/_X9P``@"M._^PB/``!``%PL
XM*"QL@\Y.KO\Z+&W_["M`__1F```0+RW_^$ZZ"U183V```%(@;?_T$7P`!0`(+
XM(&W_]$(H``D@;?_T(6W_^``.*T[_['(!(FW_]"`M__!!^@`L+&R#SDZN_D0L5
XM;?_L2H!G```2+RW_]$ZZ`"!83T*M__1@HB`M__1.74YU=&EM97(N9&5V:6-E*
XM``!.5?_X(&T`""MH``[__"!M``A*J``49P``/BM.__@B;0`(+&R#SDZN_B`L!
XM;?_X*T[_^"!M__PL;(/.3J[^C"QM__@K3O_X(FT`""QL@\Y.KOX^+&W_^"M.,
XM__AP!")M``@L;(/.3J[_+BQM__@O+?_\3KH*=%A/3EU.=4Y5__P@;0`((6T`7
XM#``@(&T`""%M`!``)"!M``@Q?``)`!P@;0`(0B@`'B!M``A"*``?*T[__")MH
XM``@L;(/.3J[^,BQM__Q.74YU3E7__"M.__PB;0`(+&R#SDZN_B`L;?_\*T[_7
XM_")M``@L;(/.3J[^)BQM__Q.74YU3E7_\$AM``Q(;0`(3KH!M%!/*T[_^"(\8
XM``$``"\!,"R#GDC`(@#CB-"!XX@B'RQL@\Y.KO\Z+&W_^"E`A!IF```D2.U@4
XM@/_PF\TN/``!```L;(/.3J[_E$SM8(#_\"YLA!Y.=2!LA!I":``$(&R$&C%\P
XM``$`$"!LA!HQ?``!``H@;(0>("R$'I"H``10@"E`A"(@;(0B(+Q-04Y8*T[_D
XM^)/)+&R#SDZN_MHL;?_X*T#__$JM``AG```B+RT`#"\M``@O+?_\3KH%#D_O+
XM``PI?`````&$)F```'0K3O_X(&W__-'\````7"QL@\Y.KOZ`+&W_^"M.__@@4
XM;?_\T?P```!<+&R#SDZN_HPL;?_X*4"$*B!LA"I*J``D9P``*BM.__@@;(0JR
XM(&@`)"(0+&R#UDZN_X(L;?_X+RR$*B\M__Q.N@;24$\I;(0JA"XK3O_X+&R#[
XMUDZN_\HL;?_X(&R$&B"`*T[_^"QL@]9.KO_$+&W_^"!LA!HA0``&9P``*DCM\
XM0`3_]"0\```#[4'Z`#0B""QL@]9.KO_B3.U`!/_T(&R$&B%```PO+(0N+RR$A
XM,DZZ\NA03R\`3KH)9EA/3EU.=2H`3E7_SBM._]J3R2QL@\Y.KO[:+&W_VBM`0
XM__P@;?_\2J@`K&<``=8K3O_:<@`L;(/63J[_@BE`@Z0B`"QL@]9.KO^"+&W_)
XMVBM._]HB+(.D+&R#UDZN_Z`L;?_:*4"#I"!M__P@*`"LY8`K0/_R(&W_\BMH]
XM`#S_[BM._]IP(4/Z`PHL;(/.3J[]V"QM_]HK0/_>9@``0"!LA!X@:``((&@`V
XM!"!H__0K:/_T_^H&K0```:S_ZB!M_^HB;?_R(%"QZ0`\9P``#$AX`&1.N@B2L
XM6$]@```:*T[_VB)M_]XL;(/.3J[^8BQM_]I"K?_J2JW_ZF<```@@;?_J0I!*/
XMK(-R9@``$"!M__(@*``TY8`I0(-R2JR$%F<``"9([4`$_]8D/````^U!^@)P\
XM(@@L;(/63J[_XDSM0`3_UBE`@Y(@;0`(*5"#EBM._]IR`"`L@Y8L;(/.3J[_\
XM.BQM_]HI0(.:+RR#EB!M``PO$"\L@YI.N@2*3^\`#"!M__(@*``0Y8`K0/_VQ
XM*T[_VG(`(&W_]A`02(!(P%*`+&R#SDZN_SHL;?_:*4"#H"!M__80$$B`2,!2H
XM@"\`+RW_]B\L@Z!.N@0\3^\`#"\LA!Y([4`<_\XH+(-R)BW_[B0L@W8B+(-Z(
XM+&R#UDZN_W9,[4`<_\X@;?_R0J@`/"Y?<`!.=6```8PO+(-Z(&W__"\H``I.D
XMN@0F4$]*@&8``70@;?_\("@`@.6`*T#_ZB!M_^H@*``,Y8`K0/_J*VW_ZO_F:
XM.WP``O_Z2JW_ZF<``!0@;?_J(!#E@"M`_^I2;?_Z8.8K3O_:<@!P`#`M__KG;
XM@`:`````$"QL@\Y.KO\Z+&W_VBM`_^(K;?_F_^H@;?_B,6W_^@`.0FW_^DJM*
XM_^IG``!$(&W_ZM'\_____'``,"W_^N>`(FW_XB.("!`@;?_J<``P+?_ZYX`BU
XM;?_B(ZC__`@4(&W_ZB`0Y8`K0/_J4FW_^F"V<``P+?_ZYX`@;?_B(:R#F@@0Z
XM,"W_^E)M__H"@```___G@"!M_^(AK(.6"!1P`#`M__KG@"!M_^(AK(.@"!`@H
XM;(.@$!!(@$C`4H`R+?_Z4FW_^@*!``#__^>!(&W_XB&`&!0K3O_:(FW_XB!M4
XM__S1_````$HL;(/.3J[_"BQM_]HK3O_:(BR#I"QL@]9.KO^"+&W_VB!M__PA"
XM;(.2`*`@;0`((*R#EB!M``P@K(.:3EU.=61O<RYL:6)R87)Y`"H`*D]A<D/L9
XM@ZI%[(.JM<EF#C(\`"]K"'0`(L)1R?_\*4^$'BQX``0I3H/.2.>`@`@N``0!N
XM*6<02_H`"$ZN_^)@!D*G\U].<T/Z`").KOYH*4"#UF8,+CP``X`'3J[_E&`&*
XM*D].NOI$4$].=61O<RYL:6)R87)Y`$GY``!__DYU2.<X,B8O`!PH+P`@)F\`B
XM)"!#2J@`K&<4($,@*`"LY8`L0"`N`!#E@"1`8`0D;(.@$!)(@$C`T(14@"E`)
XMA#8O#G(`("R$-BQL@\Y.KO\Z+%\I0(0Z9@9,WTP<3G40$DB`2,`D`"\"($I2$
XMB"\(+RR$.DZZ`M)(>@%&($+1[(0Z+PA.N@2X+P0O"R\LA#I.N@$P(&R$.D(P0
XM*``I?`````&$,B1"U>R$.E**)DI/[P`@$!)(@$C`)``,@````"!G(`R"````J
XM"6<8#((````,9Q`,@@````UG"`R"````"F8$4HI@S`P2`"!M=@P2`")F*E**Z
XM$!I(@$C`)`!G'!;"#((````B9A`,$@`B9@12BF`&0BO__V`"8-I@.!`:2(!(D
XMP"0`9RP,@@```"!G)`R"````"6<<#((````,9Q0,@@````UG#`R"````"F<$P
XM%L)@RD(;2H)F`E.*4JR$,F``_U)"$R\.<@`@+(0RY8!8@"QL@\Y.KO\Z+%\IJ
XM0(0N9@A"K(0R8`#^U'0`)&R$.F`:(`+E@"!LA"XAB@@`+PI.N@+2U<!2BEA/7
XM4H*TK(0R;>`@`N6`(&R$+D*P"`!@`/Z<(`!,[P,```0@""(O``Q*&&;\4X@0&
XMV5?)__P$@0`!``!J\D(@3G5,[P,```0@""(O``RQR6<68QC1P=/!8`(1(5')(
XM__P$@0`!``!J]$YU$-E1R?_\!($``0``:O).=4SO`P``!+/(9PQP`!`8L!E6L
XMR/_Z9@1P`$YU8P1P`4YU</].=4CG,#(L;P`8+PYP`$/Z`,0L;(/.3J[]V"Q?B
XM*4"$/F8&3-],#$YU+PX@;P`@(&@`)"!H``0L;(0^3J[_LBQ?)$!*@&=V+PY#>
XM^@"7(&H`-BQLA#Y.KO^@+%\D`&=02.<@`B0\```#[2(7+&R#UDZN_^),WT`$#
XM)D!*@&<R(`OE@"8`($,M:``(`*0M2P"<2.<@`B0\```#[4'Z`$XB""QL@]9.*
XMKO_B3-]`!"U``*`O#B!*+&R$/DZN_Z8L7R\.(FR$/BQL@\Y.KOYB+%]"K(0^%
XM8`#_4&EC;VXN;&EB<F%R>0!724Y$3U<`*@`@;P`$<``2+P`+$!BP`5?(__IGD
XM!'``3G532"`(3G5,[P,```0@""(O``Q@`A#95\G__&<,!($``0``:O!.=4(8:
XM4<G__`2!``$``&KR3G5(YR`P)F\`$"\.</\L;(/.3J[^MBQ?)``,@/____]F`
XM"'``3-\,!$YU+PXB/``!``%P(BQL@\Y.KO\Z+%\D0$J`9A(O#B`"+&R#SDZNX
XM_K`L7W``8,XE2P`*%6\`%P`)%7P`!``(0BH`#A5"``\O#I/)+&R#SDZN_MHLT
XM7R5``!`@"V<0+PXB2BQL@\Y.KOZ>+%]@$"!*T?P````4+PA.N@!N6$\@"F``$
XM_WQ(YP`@)&\`"$JJ``IG#B\.(DHL;(/.3J[^F"Q?%7P`_P`()7S_____`!0O_
XM#G``$"H`#RQL@\Y.KOZP+%\O#G`B(DHL;(/.3J[_+BQ?3-\$`$YU(&\`!"`(J
XM2AAF_%-(D<`@"$YU(&\`!""(6)!"J``$(4@`"$YU2.=(`$*$2H!J!$2`4D1*Y
XM@6H&1($*1``!83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$2H%J`D2!T
XM81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!(038!-`!"Z
XM0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`=`_0@-.!T
XMMH%B!)*#4D!1RO_R3-\`#$YU3.\#```$(`@0V6;\3G5*K(1"9Q0@;(1"(&@`3
XM!$Z0(&R$0BE0A$)@YDJLA$9G!B!LA$9.D"\O``1.N@`&6$].=4CG,``F+P`,T
XM2JR$&F<T=`!@"B\"3KH!2EA/4H(P;(.>L<)N[B\.,"R#GDC`(@#CB-"!XX@B%
XM;(0:+&R#SDZN_RXL7TJLA$IG!B!LA$I.D$JL@Z1G$"\.(BR#I"QL@]9.KO^FH
XM+%]*K(1.9P@@;(1.(*R$4DJLA%9G$"\.(FR$5BQL@\Y.KOYB+%]*K(1:9Q`OX
XM#B)LA%HL;(/.3J[^8BQ?2JR$7F<0+PXB;(1>+&R#SDZN_F(L7TJLA&)G$"\.F
XM(FR$8BQL@\Y.KOYB+%](YP`&+'@`!`@N``0!*6<02_H`"$ZN_^)@!D*G\U].5
XM<RI?2JR$*F8T2JR$.F<L+PX@+(0V(FR$.BQL@\Y.KO\N+%\O#B`LA#+E@%B`I
XM(FR$+BQL@\Y.KO\N+%]@'"\.+&R#SDZN_WPL7R\.(FR$*BQL@\Y.KOZ&+%\O=
XM#B)L@]8L;(/.3J[^8BQ?(`,N;(0>3G5,WP`,3G5(YR`@)"\`#"`"(@#CB-"!O
XMXX@D0-7LA!I*@FT,,&R#GK'";P1*DF80*7P````#A&9P_TS?!`1.=3`J``0"_
XM0(``9@XO#B(2+&R#UDZN_]PL7T*2<`!@W``````#[`````$````!```1A```^
XM``````/R```#Z@```.H```.H``````````P`````````````````````````#
XM`````````````$(```!"``D````)`````/____\#```%````)```````````^
XM`)8`/`!!``@``PP```0````X```````````````````````&`````````[0`C
XM````````#```````````````````````````````````````0@```$(`"0``9
XM``D`````_____P,```4```"8`````````$@`E@`M`$$`"``##```!````*P`X
XM``````````````````!T``4````````#P``````````,````````````````(
XM``````````````````````!"````0@`)````"0````#_____`P``!0```0P`G
XM````````O`"6`!X`00`(``,,```$```!(````````````````````.@`!```9
XM```P``````````````````%<``````````P`````````````````````````9
XM`````````````$(```!"``D````)`````/____\#```%```!C``````#``$`K
XM_]4````````````$`````````3``,@`\`$$`"``##```!````:`````````!U
XML`````````%H``,`````,``````````````````!\``````````,````````)
XM``````````````````````````````!"````0@`)````"0````#_____`P``5
XM!0```B```````P`!`/_=````````````"@````````'$`#(`+0!!``@```P%/
XM``0```(T`````````D0````````!_``"`````#```````````````````H0`U
XM````````#```````````````````````````````````````0@```$(`"0``9
XM``D`````_____P,```4```*T``````,``0#_W0```````````!`````````"U
XM6``R`!X`00`(```,!0`$```"R`````````+8`````````I```0`````!``$`_
XM`)4`%0`````````6``````$``0``,@`5`````````"(```,8`#@`'0#Z`$\`D
XM`0```F```Q`.```"[``````````L````````````!0`%_____P`!```/H```4
XM``$````Z````"```!!0```0S```$5```!'L`````````````````%```````]
XM``````````/L````(@````$`````````0````%H```!J````=````+0```"\Z
XM````S@```-X```#H```!*````3````%"```!4@```6@```&H```!Q````=8`R
XM``'>```!Y@```?P```(\```"6````FH```)R```">@```I````+0```"[```)
XM`OX```,&```##@```SP```-2````"P````````&\```"4````N0```,D```#8
XM.````UH```-X```#@````X0```.(```#C`````````/R```#ZP````$```/R-
X``
Xend
Xsize 7560
END_OF_FILE
if test 10620 -ne `wc -c <'MemEater.uu'`; then
    echo shar: \"'MemEater.uu'\" unpacked with wrong size!
fi
# end of 'MemEater.uu'
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@cs.odu.edu>.
Mail comments to the moderator at <amiga-request@cs.odu.edu>.
Post requests for sources, and general discussion to comp.sys.amiga.
