 
Here's the source to Matt Dillon's support library, which you
will need to compile DME, DTERM, etc.  It would	no doubt also
be useful for myriad other tasks.
 
Matthew	Bradburn
afb@j.cc.purdue.edu	(arpa)
j.cc.purdue.edu!afb	(uucp)
bradburn@purccvm.bitnet	(bitnet)
 
#	This is	a shell	archive.
#	Remove everything above	and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut	here----#
#!/bin/sh
# shar:	Shell Archiver
#	Run the	following text with /bin/sh to create:
#	POSTER
#	Makefile
#	atoi.c
#	break.c
#	checkbreak.c
#	closelibs.c
#	dio.c
#	llink.c
#	lunlink.c
#	mntreq.c
#	openlibs.c
#	resetbreak.c
#	wildcmp.c
#	xfio.c
#	bcmp.asm
#	bmov.asm
#	bset.asm
#	fhprintf.asm
#	dio.h
#	typedefs.h
#	xmisc.h
# This archive created:	Fri Dec	18 18:10:41 1987
# By:	Matthew	Bradburn (Purdue University)
echo shar: extracting POSTER '(687 characters)'
cat << \SHAR_EOF > POSTER
Return-Path: dillon%cory.Berkeley.EDU@ucbvax.berkeley.edu
Received: from k.cc.purdue.edu by j.cc.purdue.edu (5.54/1.14)
	id AA15508; Fri, 20 Nov	87 15:33:19 EST
Received: from j.cc.purdue.edu by k.cc.purdue.edu (5.54/1.14)
	id AA07483; Fri, 20 Nov	87 15:32:24 EST
Received: by j.cc.purdue.edu (5.54/1.14)
	id AA15322; Fri, 20 Nov	87 15:29:16 EST
Received: by cory.Berkeley.EDU (5.57/1.26)
	id AA02857; Fri, 20 Nov	87 12:19:26 PST
Date: Fri, 20 Nov 87 12:19:26 PST
From: dillon%cory.Berkeley.EDU@ucbvax.berkeley.edu (Matt Dillon)
Message-Id: <8711202019.AA02857@cory.Berkeley.EDU>
To: amiga-sources-request@j.cc.purdue.edu
Subject: SUPLIB	SOURCE part 2 of 2
Precedence: special-delivery
SHAR_EOF
if test	687 -ne	"`wc -c	POSTER`"
then
echo shar: error transmitting POSTER '(should have been	687 characters)'
fi
echo shar: extracting Makefile '(1030 characters)'
cat << \SHAR_EOF > Makefile
#   Aztec C makefile for my support lib, for use in DME, DTERM,	and
#   other programs I have written.  NOTE: Some modification will be
#   required as	this is	my personal makefile
 
OBJ1 = atoi.o checkbreak.o closelibs.o dio.o break.o
OBJ2 = llink.o lunlink.o mntreq.o openlibs.o resetbreak.o
OBJ3 = wildcmp.o bcmp.o	bmov.o bset.o fhprintf.o xfio.o
 
SRC1 = atoi.c checkbreak.c closelibs.c dio.c break.c
SRC2 = llink.c lunlink.c mntreq.c openlibs.c resetbreak.c
SRC3 = wildcmp.c bcmp.asm bmov.asm bset.asm fhprintf.asm xfio.c
 
HDR = dio.h typedefs.h xmisc.h
 
CFLAGS = +BCDL +Ivd0:include/symbols.m
 
all:	$(OBJ1)	$(OBJ2)	$(OBJ3)
	shell -c echo *.o >ram:ordin
	ord ram:ordin ram:ordout
	lb ram:sup32.lib -f ram:ordout
	copy ram:sup32.lib vd0:clib
	delete	ram:ordin ram:ordout ram:sup32.lib
 
clean:
	-delete	$(OBJ1)
	-delete	$(OBJ2)
	-delete	$(OBJ3)
 
arc:
	-delete	ram:suplib.arc
	arc a ram:suplib vd0:clib/sup32.lib suplib.doc
	arc a ram:suplib $(SRC1)
	arc a ram:suplib $(SRC2)
	arc a ram:suplib $(SRC3)
	arc a ram:suplib $(HDR)
SHAR_EOF
if test	1030 -ne "`wc -c Makefile`"
then
echo shar: error transmitting Makefile '(should	have been 1030 characters)'
fi
echo shar: extracting atoi.c '(345 characters)'
cat << \SHAR_EOF > atoi.c
/*
 * atoi()
 *
 *  Uses shifts	instead	of multiplies.
 */
 
long
atoi(str)
register char *str;
{
    register long i = 0;
    register long neg =	0;
 
    while (*str	== ' ')
	++str;
    if (*str ==	'-') {
	++str;
	neg = 1;
    }
    while (*str	>= '0' && *str <= '9')
	i = (i << 1) + (i << 3)	+ *str++ - '0';
    return ((int)((neg)?-i:i));
}
SHAR_EOF
if test	345 -ne	"`wc -c	atoi.c`"
then
echo shar: error transmitting atoi.c '(should have been	345 characters)'
fi
echo shar: extracting break.c '(111 characters)'
cat << \SHAR_EOF > break.c
extern int Enable_Abort;
 
disablebreak()
{
    Enable_Abort = 0;
}
 
enablebreak()
{
    Enable_Abort = 1;
}
SHAR_EOF
if test	111 -ne	"`wc -c	break.c`"
then
echo shar: error transmitting break.c '(should have been 111 characters)'
fi
echo shar: extracting checkbreak.c '(153 characters)'
cat << \SHAR_EOF > checkbreak.c
/*
 * CHECKBREAK()
 *
 *	Return	1 = break pressed,
 *		0 = break not pressed
 */
 
checkbreak()
{
   return ((SetSignal(0,0)&SIGBREAKF_CTRL_C) !=	0);
}
SHAR_EOF
if test	153 -ne	"`wc -c	checkbreak.c`"
then
echo shar: error transmitting checkbreak.c '(should have been 153 characters)'
fi
echo shar: extracting closelibs.c '(406	characters)'
cat << \SHAR_EOF > closelibs.c
/*
 * CLOSELIBS(mask)
 *
 *	Close the indicated libraries.	Does not close libraries which
 *	have not been openned.
 */
 
#include "xmisc.h"
 
extern struct OLI strvar[];
 
closelibs(mask)
register unsigned short	mask;
{
    register struct OLI	*sv;
 
    for	(sv = &strvar[0]; mask && sv->name; mask >>= 1,	++sv){
	if ((mask & 1) && *sv->var) {
	    CloseLibrary(*sv->var);
	    *sv->var = 0L;
	}
    }
}
SHAR_EOF
if test	406 -ne	"`wc -c	closelibs.c`"
then
echo shar: error transmitting closelibs.c '(should have	been 406 characters)'
fi
echo shar: extracting dio.c '(10969 characters)'
cat << \SHAR_EOF > dio.c
/*
 *  DIO.C
 *
 *  (C)Copyright 1987 by Matthew Dillon, All rights reserved
 *  Freely distributable.  Donations Welcome.  This is NOT shareware,
 *  This is NOT	public domain.
 *
 *	Matthew	Dillon
 *	891 Regal Rd.
 *	Berkeley, Ca. 94708
 *
 *  EXEC device	driver IO support routines... makes everything easy.
 *
 *  dfd	= dio_open(name, unit, flags, req/NULL)
 *
 *	open an	IO device.  Note: in some cases	you might have to provide
 *	a request structure with some fields initialized (example, the
 *	console	device requires	certain	fields to be initialized).  For
 *	instance, if openning the SERIAL.DEVICE, you would want	to give
 *	an IOExtSer structure which is completely blank	execept	for the
 *	io_SerFlags field.
 *
 *	The request structure's	message	and reply ports	need not be
 *	initialized.  The request structure is no longer needed	after
 *	the dio_open().
 *
 *	NULL = error, else descriptor (a pointer) returned.
 *
 *
 *  dio_close(dfd)
 *
 *	close an IO device.  Any pending asyncronous requests are
 *	AbortIO()'d and	then Wait'ed on	for completion.
 *
 *
 *  dio_closegrp(dfd)
 *
 *	close EVERY DIO	DESCRIPTOR ASSOCIATED WITH THE dio_open() call
 *	that was the parent for	this descriptor.  That is, you can get
 *	a descriptor using dio_open(), dio_dup() it a couple of	times,
 *	then use dio_closegrp()	on any ONE of the resulting descriptors
 *	to close ALL of	them.
 *
 *
 *  dio_ddl(dfd,bool)
 *
 *	Disable	BUF and	LEN fields in dio_ctl[_to].. dummy parameters
 *	must still be passed, but they are not loaded into the io_Data
 *	and io_Length fields of	the io request.	 This is for devices
 *	like the AUDIO.DEVICE which has	io_Data/io_Length in non-standard
 *	places.
 *
 *  dio_cact(dfd,bool)
 *
 *	If an error occurs (io_Error field), the io_Actual field is usually
 *	not modified by	the device driver, and thus contains garbage.  To
 *	provide	a cleaner interface, you can have DIO_CTL() and	DIO_CTL_TO()
 *	calls automatically pre-clear this field so if an io_Error does
 *	occur, the field is a definate 0 instead of garbage.
 *
 *	In most	cases you will want to do this.	 An exception is the
 *	TIMER.DEVICE, which uses the io_Actual field for part of the
 *	timeout	structure.
 *
 *	This flags the particular dio descriptor to do the pre-clear, and
 *	any new	descriptors obtained by	DIO_DUP()ing this one will also
 *	have the pre-clear flag	set.
 *
 *
 *  dio_dup(dfd)
 *
 *	Returns	a new channel descriptor referencing the same device.
 *	The new	descriptor has it's own	signal and IO request structure.
 *	For instance, if you openned the serial	device,	you might want
 *	to dup the descriptor so you can use one channel to pend an
 *	asyncronous read, and the other	channel	to write out to	the device
 *	and do other things without disturbing the asyncronous read.
 *
 *
 *  sig	= dio_signal(dfd)
 *
 *	get the	signal number (0..31) used for a DIO descriptor.
 *	This allows you	to Wait() for asyncronous requests.  Note that
 *	if your	Wait() returns,	you should double check	using dio_isdone()
 *
 *	  dio_flags(dfd, or, ~and)
 *
 *	Modify the io_Flags field in the request, ORing	it with	the OR
 *	mask, and ANDing it with ~AND mask.  E.G., the AUDIO.DEVICE requires
 *	some flags be put in io_Flags.
 *
 *  req	= dio_ctl_to(dfd, command, buf,	len, to)
 *
 *	Same as	DIO_CTL() below, but (A) is always syncronous, and
 *	(B) will attempt to AbortIO()+WaitIO() the request if the
 *	timeout	occurs before the IO completes.
 *
 *	the 'to' argument is in	microseconds.
 *
 *	If timeout occurs before request completes, and	DIO aborts the
 *	request, some devices do not have the io_Actual	field set
 *	properly.
 *
 *  req	= dio_ctl(dfd, command,	buf, len)
 *
 *	DIO_CTL() is the basis for the entire library.	It works as follows:
 *
 *	(1) If the channel isn't clear (there is an asyncronous	IO request
 *	    still pending), DIO_CTL() waits for	it to complete
 *
 *	(2) If the command is 0, simply	return a pointer to the	io
 *	    request structure.
 *
 *	(3) If the DIO_CACT() flag is TRUE, the	io_Actual field	of the
 *	    request is cleared.
 *
 *	(4) Set	the io_Data field to 'buf', and	io_Length field	to 'len'
 *	    If the command is positive,	use DoIO().  If	the command
 *	    negative, take it's	absolute value and then	do a SendIO().
 *	    (The command is placed in the io_Command field, of course).
 *
 *	(5) return the IO request structure
 *
 *
 *  bool= dio_isdone(dfd)
 *
 *	return 1 if current channel is clear (done processing),	else 0.
 *	e.g. if	you did, say, an asyncronous read, and dio_isdone() returns
 *	true, you can now use the data buffer returned and look	at the
 *	io_Actual field.
 *
 *	You need not do	a dio_wait() after dio_isdone()	returns	1.
 *
 *
 *  req	= dio_wait(dfd)
 *
 *	Wait on	the current channel for	the request to complete	and
 *	then return the	request	structure. (nop	if channel is clear)
 *
 *
 *  req	= dio_abort(dfd)
 *
 *	Abort the request on the current channel (nop if channel is
 *	clear).	 Sends an AbortIO() if the channel is active and then
 *	WaitIO()'s the request.
 *
 *
 *  MACROS: SEE	DIO.H
 *
 */
 
#include <exec/types.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <devices/timer.h>
#include "xmisc.h"
 
#define	MPC	    (MEMF_CLEAR|MEMF_PUBLIC)
#define	CPORT	    ior.ior.io_Message.mn_ReplyPort
#define	MAXREQSIZE  128	    /* big enough to hold all Amiga iorequests */
 
typedef	struct IORequest IOR;
typedef	struct IOStdReq	 STD;
typedef	struct MsgPort	 PORT;
 
typedef	struct {
    STD	ior;
    char filler[MAXREQSIZE-sizeof(STD)];
} MAXIOR;
 
typedef	struct {
    struct _CHAN *list;
    short refs;
} DIO;
 
typedef	struct _CHAN {
    MAXIOR  ior;
    DIO	    *base;
    XLIST   link;	/* doubly linked list */
    STD	    timer;
    char    notclear;
    char    cact;	/* automatic io_Actual field clear  */
    char    ddl;
    UBYTE   flagmask;
} CHAN;
 
extern CHAN *dio_ctl(),	*dio_ctl_to(), *dio_wait(), *dio_abort();
extern PORT *CreatePort();
extern char *AllocMem();
 
CHAN *
dio_open(name, unit, flags, req)
char *name;
MAXIOR *req;	 /* not	really this big	 */
{
    register CHAN *chan;
    register DIO *dio;
    register PORT *port;
    int	ret;
 
    dio	= (DIO *)AllocMem(sizeof(DIO), MPC);	if (!dio)   goto fail3;
    chan= (CHAN	*)AllocMem(sizeof(CHAN), MPC);	if (!chan)   goto fail2;
    if (req)
	chan->ior = *req;
    chan->CPORT	= CreatePort(NULL,0);		if (!chan->CPORT) goto fail1;
    chan->ior.ior.io_Message.mn_Node.ln_Type = NT_MESSAGE;
    chan->base = dio;
    chan->flagmask = 0xF0;
    dio->refs =	1;
    if (OpenDevice(name, unit, &chan->ior, flags)) {
	DeletePort(chan->CPORT);
fail1:	FreeMem(chan, sizeof(CHAN));
fail2:	FreeMem(dio, sizeof(DIO));
fail3:	return(NULL);
    }
    llink(&dio->list, &chan->link);
    chan->ior.ior.io_Flags = 0;
    return(chan);
}
 
void
dio_dfm(chan,mask)
CHAN *chan;
{
    chan->flagmask = mask;
}
 
void
dio_ddl(chan,n)
CHAN *chan;
{
    chan->ddl =	n;
}
 
void
dio_cact(chan,n)
CHAN *chan;
{
    chan->cact = n;
}
 
void
dio_close(chan)
register CHAN *chan;
{
    dio_abort(chan);
    lunlink(&chan->link);
    if (--chan->base->refs == 0) {
	FreeMem(chan->base, sizeof(DIO));
	CloseDevice(&chan->ior);
    }
    if (chan->timer.io_Message.mn_ReplyPort)
	CloseDevice(&chan->timer);
    DeletePort(chan->CPORT);
    FreeMem(chan, sizeof(CHAN));
}
 
void
dio_closegroup(chan)
register CHAN *chan;
{
    register CHAN *nextc;
 
    for	(chan =	chan->base->list; chan;	chan = nextc) {
	chan = (CHAN *)((char *)chan - ((char *)&chan->link - (char *)chan));
	nextc =	(CHAN *)chan->link.next;
	dio_close(chan);
    }
}
 
 
CHAN *
dio_dup(chan)
register CHAN *chan;
{
    register CHAN *nc;
 
    if (chan) {
	nc = (CHAN *)AllocMem(sizeof(CHAN), MPC);   if (!nc) goto fail2;
	nc->ior	= chan->ior;
	nc->base = chan->base;
	nc->CPORT = CreatePort(NULL,0);		if (!nc->CPORT)	goto fail1;
	nc->ior.ior.io_Flags = NULL;
	nc->cact = chan->cact;
	nc->ddl	= chan->ddl;
	nc->flagmask = chan->flagmask;
	++nc->base->refs;
	llink(&nc->base->list, &nc->link);
	return(nc);
fail1:	FreeMem(nc, sizeof(CHAN));
    }
fail2:
    return(NULL);
}
 
dio_signal(chan)
CHAN *chan;
{
    return(chan->CPORT->mp_SigBit);
}
 
dio_flags(chan,or,and)
long chan;
{
    IOR	*ior = (void *)chan;
 
    ior->io_Flags = (ior->io_Flags | or) & ~and;
}
 
 
CHAN *
dio_ctl_to(chan, com, buf, len,	to)
register CHAN *chan;
char *buf;
{
    register long mask;
 
    if (chan->timer.io_Message.mn_ReplyPort == NULL) {
	chan->timer.io_Message.mn_ReplyPort = chan->CPORT;
	chan->timer.io_Message.mn_Node.ln_Type = NT_MESSAGE;
	if (OpenDevice("timer.device", UNIT_VBLANK, &chan->timer, 0)) {
	    puts("Panic: DIO_CTL_TO: No	timer.device");
	}
	chan->timer.io_Command = TR_ADDREQUEST;
    }
    mask = 1 <<	chan->CPORT->mp_SigBit;
    dio_ctl(chan, (com>0)?-com:com, buf, len);	/* SendIO the request */
    chan->timer.io_Actual = to / 1000000;
    chan->timer.io_Length = to % 1000000;	/* setup timer	      */
    chan->timer.io_Flags = 0;
    BeginIO(&chan->timer);	    /* start timer running  */
    while (Wait(mask)) {	    /* Wait for	something   */
	if (CheckIO(chan))	    /* request done	    */
	    break;
	if (CheckIO(&chan->timer)) {	/* timeout?	      */
	    dio_abort(chan);
	    break;
	}
    }
    AbortIO(&chan->timer);	    /*	kill the timer	*/
    WaitIO(&chan->timer);	    /*	remove from rp	*/
    return(chan);		    /*	return ior  */
}
 
 
CHAN *
dio_ctl(chan, com, buf,	len)
register CHAN *chan;
char *buf;
{
    if (chan->notclear)	{   /* wait previous req to finish */
	WaitIO(chan);
	chan->notclear = 0;
    }
    if (com) {
	if (chan->cact)
	    chan->ior.ior.io_Actual = 0;    /* initialize io_Actual to 0*/
	chan->ior.ior.io_Error = 0;	    /* initialize error	to 0 */
	if (!chan->ddl)	{
	    chan->ior.ior.io_Data = (APTR)buf;	/* buffer   */
	    chan->ior.ior.io_Length = len;	/* length   */
	}
	if (com	< 0) {			    /* asyncronous IO  */
	    chan->ior.ior.io_Command = -com;
	    chan->notclear = 1;
	    chan->ior.ior.io_Flags &= chan->flagmask;
	    BeginIO(chan);
	} else {			    /* syncronous IO  */
	    chan->ior.ior.io_Command = com;
	    chan->ior.ior.io_Flags = (chan->ior.ior.io_Flags & chan->flagmask)
				     | IOF_QUICK;
	    BeginIO(chan);
	    if (!(chan->ior.ior.io_Flags & IOF_QUICK))
		WaitIO(chan);
	}
    }
    return(chan);
}
 
 
CHAN *
dio_isdone(chan)
register CHAN *chan;
{
    if (chan->notclear)	{	/* if not clear	*/
	if (CheckIO(chan)) {	/* if done	*/
	    WaitIO(chan);	/* clear	*/
	    chan->notclear = 0;
	    return(chan);	/* done		*/
	}
	return(NULL);		/* notdone	*/
    }
    return(chan);		/* done		*/
}
 
 
CHAN *
dio_wait(chan)
register CHAN *chan;
{
    if (chan->notclear)	{
	WaitIO(chan);		/* wait	and remove from	rp */
	chan->notclear = 0;
    }
    return(chan);
}
 
 
CHAN *
dio_abort(chan)
register CHAN *chan;
{
    if (chan->notclear)	{
	AbortIO(chan);		/* Abort it   */
	WaitIO(chan);		/* wait	and remove from	rp */
	chan->notclear = 0;
    }
    return(chan);
}
SHAR_EOF
if test	10969 -ne "`wc -c dio.c`"
then
echo shar: error transmitting dio.c '(should have been 10969 characters)'
fi
echo shar: extracting llink.c '(200 characters)'
cat << \SHAR_EOF > llink.c
#include "xmisc.h"
 
XLIST *
llink(list, en)
register XLIST *en, **list;
{
    en->next = *list;
    en->prev = list;
    *list = en;
    if (en->next)
	en->next->prev = &en->next;
    return(en);
}
SHAR_EOF
if test	200 -ne	"`wc -c	llink.c`"
then
echo shar: error transmitting llink.c '(should have been 200 characters)'
fi
echo shar: extracting lunlink.c	'(210 characters)'
cat << \SHAR_EOF > lunlink.c
#include "xmisc.h"
 
XLIST *
lunlink(en)
register XLIST *en;
{
    if (en) {
	if (en->next)
	    en->next->prev = en->prev;
	*en->prev = en->next;
	en->next = NULL;
	en->prev = NULL;
    }
    return(en);
}
SHAR_EOF
if test	210 -ne	"`wc -c	lunlink.c`"
then
echo shar: error transmitting lunlink.c	'(should have been 210 characters)'
fi
echo shar: extracting mntreq.c '(388 characters)'
cat << \SHAR_EOF > mntreq.c
extern struct Process *FindTask();
 
mountrequest(bool)
{
    static APTR	original_pr_WindowPtr;
    register struct Process *proc;
 
    proc = FindTask(0);
    if (!bool && proc->pr_WindowPtr != (APTR)-1) {
	original_pr_WindowPtr =	proc->pr_WindowPtr;
	proc->pr_WindowPtr = (APTR)-1;
    }
    if (bool &&	proc->pr_WindowPtr == (APTR)-1)
	proc->pr_WindowPtr = original_pr_WindowPtr;
}
SHAR_EOF
if test	388 -ne	"`wc -c	mntreq.c`"
then
echo shar: error transmitting mntreq.c '(should	have been 388 characters)'
fi
echo shar: extracting openlibs.c '(1418	characters)'
cat << \SHAR_EOF > openlibs.c
#include "xmisc.h"
 
long GfxBase;
long IntuitionBase;
long ExpansionBase;
long DiskfontBase;
long TranslatorBase;
long IconBase;
long MathBase;
long MathTransBase;
long MathIeeeDoubBasBase;
long MathIeeeSingBasBase;
long LayersBase;
long ClistBase;
long PotgoBase;
long TimerBase;
long xfiller15;
long xfiller16;
 
struct OLI strvar[] = {
  "graphics",		&GfxBase,
  "intuition",		&IntuitionBase,
  "expansion",		&ExpansionBase,
  "diskfont",		&DiskfontBase,
  "translator",		&TranslatorBase,
  "icon",		&IconBase,
  "mathffp",		&MathBase,
  "mathtrans",		&MathTransBase,
  "mathieeedoubbas",	&MathIeeeDoubBasBase,
  "mathieeesingbas",	&MathIeeeSingBasBase,
  "layers",		&LayersBase,
  "clist",		&ClistBase,
  "potgo",		&PotgoBase,
  "timer",		&TimerBase,
  "x15",		&xfiller15,
  "x16",		&xfiller16,
  0L, 0L       /* end marker for future	compatibility */
};
 
 
openlibs(mask)
unsigned short mask;
{
    register struct OLI	*sv;
    char buf[64];
    long copymask = mask;
 
    for	(sv = &strvar[0]; mask && sv->name; mask >>= 1,	++sv) {
	if (mask & 1) {
	    strcpy(buf,	sv->name);
	    strcat(buf,	".library");
	    if (*sv->var == 0 && (*sv->var = OpenLibrary(buf, 0)) == 0)
		goto fail;
	}
    }
    return (1);
fail:
    closelibs(copymask);
    return (0);
}
SHAR_EOF
if test	1418 -ne "`wc -c openlibs.c`"
then
echo shar: error transmitting openlibs.c '(should have been 1418 characters)'
fi
echo shar: extracting resetbreak.c '(88	characters)'
cat << \SHAR_EOF > resetbreak.c
/*
 * reset the break signal
 */
 
resetbreak()
{
    SetSignal(0,SIGBREAKF_CTRL_C);
}
SHAR_EOF
if test	88 -ne "`wc -c resetbreak.c`"
then
echo shar: error transmitting resetbreak.c '(should have been 88 characters)'
fi
echo shar: extracting wildcmp.c	'(843 characters)'
cat << \SHAR_EOF > wildcmp.c
/*
 * Compare a wild card name with a normal name
 */
 
#define	MAXB   8
 
wildcmp(wild, name)
char *wild, *name;
{
    register char *w = wild;
    register char *n = name;
    char *back[MAXB][2];
    int	bi = 0;
 
    while (*n || *w) {
	switch (*w) {
	case '*':
	    if (bi == MAXB) {
		puts ("Too many	levels of '*'");
		return (0);
	    }
	    back[bi][0]	= w;
	    back[bi][1]	= n;
	    ++bi;
	    ++w;
	    continue;
goback:
	    --bi;
	    while (bi >= 0 && *back[bi][1] == '\0')
		--bi;
	    if (bi < 0)
		return (0);
	    w =	back[bi][0] + 1;
	    n =	++back[bi][1];
	    ++bi;
	    continue;
	case '?':
	    if (!*n) {
		if (bi)
		    goto goback;
		return (0);
	    }
	    break;
	default:
	    if (*n != *w) {
		if (bi)
		    goto goback;
		return (0);
	    }
	    break;
	}
	if (*n)	 ++n;
	if (*w)	 ++w;
    }
    return (1);
}
SHAR_EOF
if test	843 -ne	"`wc -c	wildcmp.c`"
then
echo shar: error transmitting wildcmp.c	'(should have been 843 characters)'
fi
echo shar: extracting xfio.c '(5958 characters)'
cat << \SHAR_EOF > xfio.c
/*
 *  XFIO.C
 *
 *  Simple File	IO with	asyncronous READ and WRITE capability
 *  Perfect for	protocol transfer applications
 *
 *  xfi	= xfopen(name, modes, bufsize)	("r", "w", "w+")
 *   n	= xfread(xfi, buf, bytes)   ASYNCRONOUS	READ
 *  err	= xfwrite(xfi, buf, bytes)  ASYNCRONOUS	WRITE
 *  err	= xfclose(xfi)
 *
 *  RESTRICTIONS:   NO seeking.	 You can do one	of xfread() or xfwrite()
 *  for	a given	open XFIle handle (not both).
 *
 *  xfwrite() returns a	cumulative error (once an error	occurs,	it will	not
 *  do any more	writes).  xfclose() returns the	cumulative write error
 *  (since the last write may have been	asyncronous and	thus the error
 *  unknown at the time).
 *
 *  Two	buffers	are created each bufsize/2 bytes in size.  for writing,
 *  one	buffers	is sent	asyncronously while the	other fills.  For reading,
 *  one	buffer is filling while	the other is being read.
 */
 
#define	XFI	    struct _XFI
#define	XFBUF	    struct _XFBUF
#define	MSGPORT	    struct MsgPort
#define	FH	    struct FileHandle
#define	STDPKT	    struct StandardPacket
 
 
XFBUF {
    long   bufsize;
    long   idx;
    long   max;
    char    buf[4];	/*  actually bufsize bytes long	*/
};
 
XFI {
    char    ro;		/*  read only, else write only	*/
    char    pend;	/*  packet pending		*/
    char    err;	/*  cumulative error		*/
    char    reserved;
    XFBUF   *asbuf;
    XFBUF   *usbuf;
    FH	    *fh;
    STDPKT  sp;		/*  asyncronous	message		*/
    MSGPORT rp;		/*  reply port for pending pkts	*/
};
 
extern FH *Open();
extern void *malloc(), *FindTask();
 
void *
xfopen(file, mode, bytes)
char *file;
char *mode;
{
    register XFI *xfi =	malloc(sizeof(XFI));
    register long nbytes = bytes >> 1;
    int	ap = 0;
 
    bzero(xfi, sizeof(XFI));
    if (mode[0]	== 'w')	{
	if (mode[1] == '+') {
	    ap = 1;
	    if ((xfi->fh = Open(file, 1005)) ==	NULL)
		xfi->fh	= Open(file, 1006);
	    goto ok;
	}
	xfi->fh	= Open(file, 1006);
	goto ok;
    }
    xfi->fh = Open(file, 1005);
ok:
    if (xfi->fh) {
	if (ap)
	    Seek(xfi->fh, 0, 1);
	xfi->fh	= (FH *)((long)xfi->fh << 2);
	xfi->asbuf = malloc(sizeof(XFBUF) + nbytes);	/* a little more    */
	xfi->usbuf = malloc(sizeof(XFBUF) + nbytes);	/* then	we need	    */
	bzero(xfi->asbuf, sizeof(XFBUF));
	bzero(xfi->usbuf, sizeof(XFBUF));
	xfi->ro	= (mode[0] == 'r');
	xfi->asbuf->bufsize = xfi->usbuf->bufsize = nbytes;
	xfi->rp.mp_Node.ln_Type	= NT_MSGPORT;
	xfi->rp.mp_Node.ln_Name	= "XFIO-Async";
	xfi->rp.mp_Flags = PA_SIGNAL;
	xfi->rp.mp_SigBit = AllocSignal(-1);
	xfi->rp.mp_SigTask = FindTask(NULL);
	NewList(&xfi->rp.mp_MsgList);
	if (xfi->ro)
	    xfstartasync(xfi, ACTION_READ);
    } else {
	free(xfi);
	xfi = NULL;
    }
    return(xfi);
}
 
xfclose(xfi)
register XFI *xfi;
{
    int	err = 1;
    if (xfi) {
	if (xfi->pend) {
	    xfi->pend =	0;
	    WaitPort (&xfi->rp);
	    GetMsg   (&xfi->rp);
	}
	if (!xfi->ro &&	xfi->usbuf->idx)
	    Write((long)xfi->fh	>> 2, xfi->usbuf->buf, xfi->usbuf->idx);
	err = xfi->err;
	Close((long)xfi->fh >> 2);
	free(xfi->asbuf);
	free(xfi->usbuf);
	FreeSignal(xfi->rp.mp_SigBit);
	free(xfi);
    }
    return(err);
}
 
xfgets(xfi, buf, n)
XFI *xfi;
char *buf;
{
    register XFBUF *usbuf = xfi->usbuf;
    register int i, idx;
    if (!xfi->ro)
	return(-1);
    --n;
    for	(i = 0;;) {
	for (idx = usbuf->idx; idx < usbuf->max	&& i < n; ++idx, ++i) {
	    if ((buf[i]	= usbuf->buf[idx]) == '\n') {
		buf[i] = 0;
		usbuf->idx = idx+1;
		return(i);
	    }
	}
	usbuf->idx = idx;
	buf[i] = 0;
	if (i == n)
	    return(i);
	if (xfi->pend == 0)				/* EOF	    */
	    return(-1);
	WaitPort (&xfi->rp);
	GetMsg	 (&xfi->rp);
	xfi->pend = 0;
	if (xfi->sp.sp_Pkt.dp_Res1 <= 0) {		/* EOF	    */
	    if (i == 0)
		return(-1);
	    return(i);
	}
	xfi->asbuf->max	= xfi->sp.sp_Pkt.dp_Res1;
	xfi->asbuf->idx	= 0;
	usbuf =	xfi->asbuf;				/* swap	bufs*/
	xfi->asbuf = xfi->usbuf;
	xfi->usbuf = usbuf;
	xfstartasync(xfi, ACTION_READ);			/* new async*/
    }
}
 
 
xfread(xfi, buf, n)
XFI *xfi;
char *buf;
{
    register XFBUF *usbuf = xfi->usbuf;
    register int orig =	n;
    register int diff;
 
    if (!xfi->ro)
	return(0);
    while ((diff = usbuf->max -	usbuf->idx) < n) {
	movmem(usbuf->buf + usbuf->idx,	buf, diff);	/* copy	entire buf */
	buf += diff;
	n -= diff;
	if (xfi->pend == 0) {
	    xfi->usbuf->idx = xfi->usbuf->max;
	    return(orig	- n);
	}
	WaitPort (&xfi->rp);
	GetMsg	 (&xfi->rp);
	xfi->pend = 0;
	if (xfi->sp.sp_Pkt.dp_Res1 <= 0) {		/* EOF	    */
	    xfi->usbuf->idx = xfi->usbuf->max;
	    return(orig	- n);
	}
	xfi->asbuf->max	= xfi->sp.sp_Pkt.dp_Res1;
	xfi->asbuf->idx	= 0;
	usbuf =	xfi->asbuf;				/* swap	bufs*/
	xfi->asbuf = xfi->usbuf;
	xfi->usbuf = usbuf;
	xfstartasync(xfi, ACTION_READ);			/* new async*/
    }
    movmem(usbuf->buf +	usbuf->idx, buf, n);
    usbuf->idx += n;
    return(orig);
}
 
xfwrite(xfi, buf, n)
XFI *xfi;
char *buf;
{
    register XFBUF *usbuf = xfi->usbuf;
    register int diff;
 
    if (xfi->ro	|| xfi->err)
	return(1);
    while ((diff = usbuf->bufsize - usbuf->idx)	< n) {
	movmem(buf, usbuf->buf + usbuf->idx, diff);	/*  copy buf	*/
	buf += diff;
	n -= diff;
	if (xfi->pend) {
	    WaitPort(&xfi->rp);
	    GetMsg  (&xfi->rp);
	    xfi->pend =	0;
	    if (xfi->sp.sp_Pkt.dp_Res1 != xfi->sp.sp_Pkt.dp_Arg3) {
		xfi->err = 1;
		return(1);
	    }
	}
	usbuf =	xfi->asbuf;
	xfi->asbuf = xfi->usbuf;
	xfi->usbuf = usbuf;
	usbuf->idx = 0;
	xfstartasync(xfi, ACTION_WRITE);
    }
    movmem(buf,	usbuf->buf + usbuf->idx, n);
    usbuf->idx += n;
    return(xfi->err);
}
 
static
xfstartasync(xfi, action)
register XFI *xfi;
{
    xfi->sp.sp_Msg.mn_Node.ln_Name = (char *)&(xfi->sp.sp_Pkt);
    xfi->sp.sp_Pkt.dp_Link = &(xfi->sp.sp_Msg);
    xfi->sp.sp_Pkt.dp_Port = &xfi->rp;
    xfi->sp.sp_Pkt.dp_Type = action;
    xfi->sp.sp_Pkt.dp_Arg1 = xfi->fh->fh_Arg1;
    xfi->sp.sp_Pkt.dp_Arg2 = (long)xfi->asbuf->buf;
    xfi->sp.sp_Pkt.dp_Arg3 = xfi->asbuf->bufsize;
    PutMsg (xfi->fh->fh_Type, &xfi->sp);
    xfi->pend =	1;
}
SHAR_EOF
if test	5958 -ne "`wc -c xfio.c`"
then
echo shar: error transmitting xfio.c '(should have been	5958 characters)'
fi
echo shar: extracting bcmp.asm '(1003 characters)'
cat << \SHAR_EOF > bcmp.asm
;BCMP.ASM
;
;   If both source and dest are	on longword boundries, and if the byte
;   count is a multiple	of 4, then use longword	operations.
;
;   if byte count < 16 then just use byte operations
;
;   BCMP(p1,p2,n)   return 0=failed, 1=compare ok
 
     xdef  _bcmp
 
_bcmp:
	movem.l	4(A7),A0/A1	;A0 = ptr1, A1 = ptr2
	move.l	12(A7),D1	;# bytes
	andi.b	#3,15(A7)	;# bytes multiple of 4?
	bne	onbyte
	andi.b	#3,7(A7)	;ptr1 on lwb?
	bne	onbyte
	andi.b	#3,11(A7)	;ptr2 on lwb?
	bne	onbyte
	lsr.l	#2,D1		;YES, LONG COMPARE LOOP
	clr.l	D0		;default return. Also sets Z flag
	bra	dropl
loopl	cmpm.l	(A0)+,(A1)+
dropl	dbne.w	D1,loopl
	bne	end
	sub.l	#$10000,D1
	bpl	loopl
	addq.l	#1,D0		;return	TRUE
	rts
 
onbyte	clr.l	D0		;default return. Also sets Z flag
	bra	dropb
loopb	cmpm.b	(A0)+,(A1)+	;BYTE COMPARE
dropb	dbne.w	D1,loopb	;until count exhausted or compare failed
	bne	end
	sub.l	#$10000,D1	;for buffers >65535
	bpl	loopb		;branch	to loop	because	D0.W now is FFFF
	addq.l	#1,D0		;return	TRUE
end	rts
SHAR_EOF
if test	1003 -ne "`wc -c bcmp.asm`"
then
echo shar: error transmitting bcmp.asm '(should	have been 1003 characters)'
fi
echo shar: extracting bmov.asm '(1176 characters)'
cat << \SHAR_EOF > bmov.asm
;BMOV.ASM
;      4    8	12
;BMOV(src,dest,bytes)
;
;   Matthew Dillon
;
;   -Handles ascending/descending moves
;   -Optimizes the move	if addresses longword boundries	and #bytes
;    is	a multiple of 4.
;   -Completely	tested
 
	xdef  _bmov
 
_bmov
	movem.l	4(A7),A0/A1	;source, destination
	move.l	12(A7),D0	;bytes
	clr.b	D1		;long word boundry flag
	andi.b	#3,15(A7)	;byte count multiple of	4?
	bne	notlwb
	andi.b	#3,7(A7)	;source	mulitple of 4?
	bne	notlwb
	andi.b	#3,11(A7)	;destination multiple of 4?
	seq.b	D1		;set longword boundry flag if true
notlwb	cmp.l	A0,A1
	beq	end		;trivial case
	ble	ascend		;ascending copy
	add.l	D0,A0		;descending copy
	add.l	D0,A1
 
decend	tst.b	D1		;DESCEND
	beq	decbyte
declong	lsr.l	#2,D0		;DESCEND LONGWORD
	bra	ab00
ab0	move.l	-(A0),-(A1)
ab00	dbf.w	D0,ab0
	sub.l	#$10000,D0
	bpl	ab0
end	rts
 
ab1	move.b	-(A0),-(A1)	;DESCEND BYTE
decbyte	dbf.w	D0,ab1
	sub.l	#$10000,D0
	bpl	ab1
	rts
 
ascend	tst.b	D1		;ASCEND
	beq	ascbyte
asclong	lsr.l	#2,D0		;ASCEND	LONGWORD
	bra	ab22
ab2	move.l	(A0)+,(A1)+
ab22	dbf.w	D0,ab2
	sub.l	#$10000,D0
	bpl	ab2
	rts
 
ab3	move.b	(A0)+,(A1)+	;ASCEND	BYTE
ascbyte	dbf.w	D0,ab3
	sub.l	#$10000,D0
	bpl	ab3
	rts
SHAR_EOF
if test	1176 -ne "`wc -c bmov.asm`"
then
echo shar: error transmitting bmov.asm '(should	have been 1176 characters)'
fi
echo shar: extracting bset.asm '(1076 characters)'
cat << \SHAR_EOF > bset.asm
;BSET.ASM
;BZERO.ASM
;
;   Uses longword operations if	data is	aligned	on a longword boundry
;   and	the size is a mulitple of 4.  Otherwise, uses byte operations.
 
	xdef  _bset
	xdef  _bzero
 
_bzero
	clr.l	D1
	bra	begin
_bset
	move.b	15(A7),D1	;12(A7)-> msb .	. lsb	(D1 = data)
begin
	move.l	4(A7),A0	;A0 = address
	move.l	8(A7),D0	;D0 = byte count
	andi.b	#3,11(A7)	;byte count on long word boundry?
	bne	drop
	andi.b	#3,7(A7)	;address on longword boundry?
	bne	drop
	bra	lwb
loop	move.b	D1,(A0)+	;BYTE SET LOOP
drop	dbf.w	D0,loop		;remember, only	effects	lower word
	sub.l	#$10000,D0	;for buffers >65535
	bpl	loop		;branch	to loop	because	D0.W now is FFFF
	rts
 
lwb	lsr.l	#2,D0		;byte count / 4	(longword chunks)
	tst.l	D1		;BZERO
	beq	dropl
	move.b	D1,14(A7)	;15(A7)	already	contains the byte
	move.w	14(A7),D1	;D1 0..15 set
	swap	D1
	move.w	14(A7),D1	;D1 16..31 set
	bra	dropl
 
loopl	move.l	D1,(A0)+	;BYTE SET LOOP
dropl	dbf.w	D0,loopl	;remember, only	effects	lower word
	sub.l	#$10000,D0	;for buffers >65535
	bpl	loopl		;branch	to loop	because	D0.W now is FFFF
	rts
SHAR_EOF
if test	1076 -ne "`wc -c bset.asm`"
then
echo shar: error transmitting bset.asm '(should	have been 1076 characters)'
fi
echo shar: extracting fhprintf.asm '(1670 characters)'
cat << \SHAR_EOF > fhprintf.asm
;FHPRINTF.ASM
;
;  Handles formatted printing to Amiga file handles   w/ fhprintf
 
;
;   Manx assembler FAR stmts.
 
 FAR code
 FAR data
 
      xdef  _fhprintf
      xref  _Write
      xref  _LVORawDoFmt
      xref  _SysBase
 
_fhprintf
      jsr      xformat	 ;same thing
      jsr      _Write
      lea.l    268(A7),A7
      rts
 
      ;XFORMAT takes a Xprintf(xx, cs, arg, arg...)  where xx is any
      ;integer and returns (xx,	buf, bytes) on the stack suitable for an
      ;immediate call to xwrite() or Write().  The caller must deallocate
      ;268 bytes from the stack	when done.
      ;
      ;		(oret)
      ;	 A2 A3 A4 A5 A6	RET FI BUF NUM <thebuffer> printfret fi	cs args
      ;	 ^   ^	       ^
      ;	 1   2	       3
 
 
xformat
      move.l   A7,A0   ;sp now at pos. #3  A0 =	pos #3
      sub.l    #268,A7	 ;sp now at pos. #2  SP	= pos #2
      move.l   (A0),(A7)  ;copy	return address
      move.l   8(A0),4(A7)  ;copy fi or	fh  to FI
      lea.l    16(A7),A1  ;address of buffer
      move.l   A1,8(A7)	  ;place in	BUF
      movem.l  A2-A6,-(A7)  ;save regs	 SP = pos #1
      move.l   A1,A3   ;A3 = buffer pointer
      lea.l    16(A0),A1  ;A1 =	lea of printf arg list
      move.l   12(A0),A0  ;A0 =	control	string
      move.l   #_xc,A2	 ;A2 = call vector
 
      move.l   _SysBase,A6  ;exec library call
      jsr      _LVORawDoFmt(A6)
 
      move.l   28(A7),A3  ;buffer start
loop  tst.b    (A3)+   ;find end of string
      bne      loop
      sub.l    28(A7),A3  ;get string length
      subq.l   #1,A3
      move.l   A3,32(A7)  ;place in	NUM
      movem.l  (A7)+,A2-A6  ;restore registers used
      rts
 
_xc
      move.b   D0,(A3)+
      rts
SHAR_EOF
if test	1670 -ne "`wc -c fhprintf.asm`"
then
echo shar: error transmitting fhprintf.asm '(should have been 1670 characters)'
fi
echo shar: extracting dio.h '(4438 characters)'
cat << \SHAR_EOF > dio.h
/*
 * DIO.H
 *
 *  (C)Copyright 1987 Matthew Dillon, All Rights Reserved
 *  Freely distributable.  Donations welcome, I	guess.
 *
 *	Matthew	Dillon
 *	891 Regal Rd.
 *	Berkeley, Ca.	94708
 *
 */
 
#ifndef	MYLIB_DIO_H
#define	MYLIB_DIO_H
#include <exec/types.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <devices/timer.h>
 
typedef	struct IORequest IOR;
typedef	struct IOStdReq	 STD;
typedef	struct MsgPort	 PORT;
 
/*
 *	'to' is	in microsections.  The IO request structure
 *  pointer is optional	to dio_open().	If NULL, dio_open()
 *  initializes	it's own IO request (to	mostly zero).  You have
 *  to provide an IO request structure,	for instance, if openning
 *  a console device since the window pointer must be passed to
 *  OpenDevice().
 *
 *	each DFD descriptor has	it's own signal.
 *
 *	dio_isdone() returns 1 if the channel is clear,	0 otherwise.
 */
 
extern long dio_open();		/* dfd	  = dio_open(devname,unit,flags,req)*/
extern long dio_dup();		/* newdfd = dio_dup(dfd)    */
extern STD *dio_ctl();		/* req	= dio_ctl(dfd,com,buf,len)	    */
extern STD *dio_ctl_to();	/* req	= dio_ctl_to(dfd,com,buf,len,to)    */
extern STD *dio_wait();		/* req	= dio_wait(dfd)	    */
extern STD *dio_abort();	/* req	= dio_abort(dfd)    */
extern STD *dio_isdone();	/* req	= dio_isdone(dfd)   */
extern int dio_signal();	/* signm= dio_signal(dfd)   */
extern void dio_close();	/*  dio_close(dfd)	    */
extern void dio_cloesgroup();	/*  dio_closegroup(dfd)	    */
extern void dio_cact();		/*  dio_cact(dfd,bool)	    */
 
 
 
/*
 * dio_simple()	and related macros return the !io_Error	field. That
 * is, 0=ERROR,	1=OK
 *
 * dio_actual()	returns	the io_Actual field.
 *
 * NOTE: the io_Actual field may not be	set by the device if an
 * error condition exists.  To make the	io_ctl() and io_ctl_to()
 * call	automatically clear the	io_Actual field	before doing the
 * io operation, use the DIO_CACT() call.  The reason this isn't
 * done	automatically by default is that some devices require
 * parameters to be passed in the io_Actual field (like	the
 * timer.device).
 *
 *  Remember, Asyncronous IO is	done by	sending	-com instead of	com.
 *
 *	CALL			    Syncronous IO   Asyncronous	IO
 *
 *  dio_simple(dfd,com)		    0=ERROR, 1=OK   undefined
 *  dio_actual(dfd,com)		    io_Actual	    undefined
 *  dio_reset(dfd)		    0=ERROR, 1=OK   n/a
 *  dio_update(dfd)		    0=ERROR, 1=OK   n/a
 *  dio_clear(dfd)		    0=ERROR, 1=OK   n/a
 *  dio_stop(dfd)		    0=ERROR, 1=OK   n/a
 *  dio_start(dfd)		    0=ERROR, 1=OK   n/a
 *  dio_flush(dfd)		    0=ERROR, 1=OK   n/a
 *  dio_getreq(dfd)		    returns a ptr to the IO
 *				    request structure
 *  NOTE: If you use the following, you	probably want to have the
 *  device library automatically clear the io_Actual field before
 *  sending the	request	so you get 0 if	an error occurs.  That
 *  is:	dio_cact(dfd,1);
 *
 *
 *  dio_read(dfd,buf,len)	    returns actual bytes read
 *  dio_write(dfd,buf,len)	    returns actual bytes written
 *
 *	The timeout argument for dio_readto() and dio_writeto()
 *	is in MICROSECONDS, up to 2^31uS.
 *
 *  dio_readto(dfd,buf,len,to)	    returns actual bytes read
 *  dio_writeto(dfd,buf,len,to)	    returns actual bytes written
 *
 *	The asyncronous	dio_reada() and	dio_writea() do	not
 *	return anything.
 *
 *  dio_reada(dfd,buf,len)	    begin asyncronous read
 *  dio_writea(dfd,buf,len)	    begin asyncronous write
 */
 
#define	dio_mask(dfd)		(1 << dio_signal(dfd))
 
#define	dio_simple(dfd,com)	(!dio_ctl(dfd,com,0,0)->io_Error)
#define	dio_actual(dfd,com)	( dio_ctl(dfd,com,0,0)->io_Actual)
#define	dio_reset(dfd)		dio_simple(dfd,CMD_RESET)
#define	dio_update(dfd)		dio_simple(dfd,CMD_UPDATE)
#define	dio_clear(dfd)		dio_simple(dfd,CMD_CLEAR)
#define	dio_stop(dfd)		dio_simple(dfd,CMD_STOP)
#define	dio_start(dfd)		dio_simple(dfd,CMD_START)
#define	dio_flush(dfd)		dio_simple(dfd,CMD_FLUSH)
#define	dio_getreq(dfd)		dio_ctl(dfd,0,0,0)
 
#define	dio_read(dfd,buf,len)	    (dio_ctl(dfd,CMD_READ,buf,len)->io_Actual)
#define	dio_write(dfd,buf,len)	    (dio_ctl(dfd,CMD_WRITE,buf,len)->io_Actual)
#define	dio_readto(dfd,buf,len,to)  (dio_ctl_to(dfd,CMD_READ,buf,len,to)->\
io_Actual)
#define	dio_writeto(dfd,buf,len,to) (dio_ctl_to(dfd,CMD_WRITE,buf,len,to)->\
io_Actual)
#define	dio_reada(dfd,buf,len)	    ((void)dio_ctl(dfd,-CMD_READ,buf,len))
#define	dio_writea(dfd,buf,len)	    ((void)dio_ctl(dfd,-CMD_WRITE,buf,len))
 
#endif
SHAR_EOF
if test	4438 -ne "`wc -c dio.h`"
then
echo shar: error transmitting dio.h '(should have been 4438 characters)'
fi
echo shar: extracting typedefs.h '(2532	characters)'
cat << \SHAR_EOF > typedefs.h
/*
 * TYPEDEFS.H
 */
 
#ifndef	MYLIB_TYPEDEFS_H
#define	MYLIB_TYPEDEFS_H
#ifdef INTUITION_INTUITION_H
 
typedef	struct BitMap	    BITMAP;
typedef	struct BoolInfo	    BOOLINFO;
typedef	struct Border	    BORDER;
typedef	struct Gadget	    GADGET;
typedef	struct Image	    IMAGE;
typedef	struct IntuiMessage INTUIMESSAGE;
typedef	struct IntuiMessage IMESS;
typedef	struct IntuiText    INTUITEXT;
typedef	struct IntuiText    ITEXT;
typedef	struct Menu	    MENU;
typedef	struct MenuItem	    MENUITEM;
typedef	struct MenuItem	    ITEM;
typedef	struct NewScreen    NEWSCREEN;
typedef	struct NewScreen    NS;
typedef	struct NewWindow    NEWWINDOW;
typedef	struct NewWindow    NW;
typedef	struct Preferences  PREFERENCES;
typedef	struct Preferences  PREFS;
typedef	struct PropInfo	    PROPINFO;
typedef	struct RastPort	    RASTPORT;
typedef	struct RastPort	    RP;
typedef	struct Remember	    REMEMBER;
typedef	struct Requester    REQUESTER;
typedef	struct Screen	    SCR;
typedef	struct StringInfo   STRINGINFO;
typedef	struct Window	    WINDOW;
typedef	struct Window	    WIN;
 
#endif
 
#ifdef INTUITION_INTUITIONBASE_H
 
typedef	struct GListEnv		GLISTENV;
typedef	struct GadgetInfo	GADGETINFO;
typedef	struct IBox		IBOX;
typedef	struct IntuitionBase	INTUITIONBASE;
typedef	struct IntuitionBase	IBASE;
typedef	struct PenPair		PENPAIR;
typedef	struct Point		POINT;
 
#endif
 
#ifdef DEVICES_AUDIO_H
 
typedef	struct IOAudio		IOAUDIO;
typedef	struct IOAudio		IOA;
 
#endif
 
#ifdef DEVICES_BOOTBLOCK_H
 
typedef	struct BootBlock	BOOTBLOCK;
 
#endif
 
#ifdef DEVICES_CLIPBOARD_H
 
typedef	struct IOClipReq	IOCLIPREQ;
typedef	struct IOClipReq	IOCL;
typedef	struct ClipboardUnitPartial CLIPUNIT;
typedef	struct SatisfyMsg	SATISFYMSG;
 
#endif
 
#ifdef DEVICES_CONUNIT_H
 
typedef	struct ConUnit	    CONUNIT;
typedef	struct IOStdReq	    IOCON;
 
#endif
 
#ifdef DEVICES_INPUTEVENT_H
 
typedef	struct InputEvent   INPUTEVENT;
typedef	struct InputEvent   IE;
 
#endif
 
#ifdef GRAPHICS_TEXT_H
 
typedef	struct TextAttr	TA;
typedef	struct TextFont	FONT;
 
#endif
 
#ifdef GRAPHICS_GELS_H
 
typedef	struct VSprite	VS;
typedef	struct Bob	BOB;
typedef	struct AnimComp	ANIMCOMP;
typedef	struct AnimOb	ANIMOB;
 
#endif
 
#ifdef GRAPHICS_RASTPORT_H
 
typedef	struct GelsInfo	GELSINFO;
 
#endif
 
#ifdef GRAPHICS_VIEW_H
 
typedef	struct ViewPort	VP;
 
#endif
 
#ifdef LIBRARIES_DOS_H
 
typedef	struct Process		PROC;
typedef	struct Task		TASK;
typedef	struct FileInfoBlock	FIB;
 
#endif
 
#ifdef DEVICES_TIMER_H
 
typedef	struct timeval		TV;
typedef	struct timerequest	TIMER;
 
#endif
 
#endif
SHAR_EOF
if test	2532 -ne "`wc -c typedefs.h`"
then
echo shar: error transmitting typedefs.h '(should have been 2532 characters)'
fi
echo shar: extracting xmisc.h '(644 characters)'
cat << \SHAR_EOF > xmisc.h
/*
 * XMISC.H
 */
 
#ifndef	MYLIB_XMISC_H
#define	MYLIB_XMISC_H
 
#define	GRAPHICS_LIB	    0x0001L
#define	INTUITION_LIB	    0x0002L
#define	EXPANSION_LIB	    0x0004L
#define	DISKFONT_LIB	    0x0008L
#define	TRANSLATOR_LIB	    0x0010L
#define	ICON_LIB	    0x0020L
#define	MATH_LIB	    0x0040L
#define	MATHTRANS_LIB	    0x0080L
#define	MATHIEEEDOUBBAS_LIB 0x0100L
#define	MATHIEEESINGBAS_LIB 0x0200L
#define	LAYERS_LIB	    0x0400L
#define	CLIST_LIB	    0x0800L
#define	POTGO_LIB	    0x1000L
#define	TIMER_LIB	    0x2000L
 
struct OLI {
    char *name;
    long *var;
};
 
typedef	struct _XLIST {
    struct _XLIST *next, **prev;
} XLIST;
#endif
SHAR_EOF
if test	644 -ne	"`wc -c	xmisc.h`"
then
echo shar: error transmitting xmisc.h '(should have been 644 characters)'
fi
#	End of shell archive
exit 0
