home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d185
/
iff.lha
/
SOURCE
/
gio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-12-13
|
5KB
|
128 lines
/*----------------------------------------------------------------------*/
/* GIO.C Generic I/O Speed Up Package 1/23/86 */
/* See GIOCall.C for an example of usage. */
/* Read not speeded-up yet. Only one Write file buffered at a time. */
/* Note: The speed-up provided is ONLY significant for code such as IFF */
/* which does numerous small Writes and Seeks. */
/* */
/* By Jerry Morrison and Steve Shaw, Electronic Arts. */
/* This software is in the public domain. */
/* */
/* This version for the Commodore-Amiga computer. */
/* */
/*----------------------------------------------------------------------*/
#include "iff/gio.h" /* See comments here for explanation.*/
#if GIO_ACTIVE
#define local static
local BPTR wFile = NULL;
local BYTE *wBuffer = NULL;
local LONG wNBytes = 0; /* buffer size in bytes.*/
local LONG wIndex = 0; /* index of next available byte.*/
local LONG wWaterline = 0; /* Count of # bytes to be written.
* Different than wIndex because of GSeek.*/
/*----------- GOpen ----------------------------------------------------*/
LONG GOpen(filename, openmode) char *filename; LONG openmode; {
return( Open(filename, openmode) );
}
/*----------- GClose ---------------------------------------------------*/
LONG GClose(file) BPTR file; {
LONG signal = 0, signal2;
if (file == wFile)
signal = GWriteUndeclare(file);
signal2 = Close(file); /* Call Close even if trouble with write.*/
if (signal2 < 0)
signal = signal2;
return( signal );
}
/*----------- GRead ----------------------------------------------------*/
LONG GRead(file, buffer, nBytes) BPTR file; BYTE *buffer; LONG nBytes; {
LONG signal = 0;
/* We don't yet read directly from the buffer, so flush it to disk and
* let the DOS fetch it back. */
if (file == wFile)
signal = GWriteFlush(file);
if (signal >= 0)
signal = Read(file, buffer, nBytes);
return( signal );
}
/* ---------- GWriteFlush ----------------------------------------------*/
LONG GWriteFlush(file) BPTR file; {
LONG gWrite = 0;
if (wFile != NULL && wBuffer != NULL && wIndex > 0)
gWrite = Write(wFile, wBuffer, wWaterline);
wWaterline = wIndex = 0; /* No matter what, make sure this happens.*/
return( gWrite );
}
/* ---------- GWriteDeclare --------------------------------------------*/
LONG GWriteDeclare(file, buffer, nBytes)
BPTR file; BYTE *buffer; LONG nBytes; {
LONG gWrite = GWriteFlush(wFile); /* Finish any existing usage.*/
if ( file==NULL || (file==wFile && buffer==NULL) || nBytes<=3) {
wFile = NULL; wBuffer = NULL; wNBytes = 0; }
else {
wFile = file; wBuffer = buffer; wNBytes = nBytes; }
return( gWrite );
}
/* ---------- GWrite ---------------------------------------------------*/
LONG GWrite(file, buffer, nBytes) BPTR file; BYTE *buffer; LONG nBytes; {
LONG gWrite = 0;
if (file == wFile && wBuffer != NULL) {
if (wNBytes >= wIndex + nBytes) {
/* Append to wBuffer.*/
movmem(buffer, wBuffer+wIndex, nBytes);
wIndex += nBytes;
if (wIndex > wWaterline)
wWaterline = wIndex;
nBytes = 0; /* Indicate data has been swallowed.*/
}
else {
wWaterline = wIndex; /* We are about to overwrite any
* data above wIndex, up to at least the buffer end.*/
gWrite = GWriteFlush(file); /* Write data out in proper order.*/
}
}
if (nBytes > 0 && gWrite >= 0)
gWrite += Write(file, buffer, nBytes);
return( gWrite );
}
/* ---------- GSeek ----------------------------------------------------*/
LONG GSeek(file, position, mode)
BPTR file; LONG position; LONG mode; {
LONG gSeek = -2;
LONG newWIndex = wIndex + position;
if (file == wFile && wBuffer != NULL) {
if (mode == OFFSET_CURRENT &&
newWIndex >= 0 && newWIndex <= wWaterline) {
gSeek = wIndex; /* Okay; return *OLD* position */
wIndex = newWIndex;
}
else {
/* We don't even try to optimize the other cases.*/
gSeek = GWriteFlush(file);
if (gSeek >= 0) gSeek = -2; /* OK so far */
}
}
if (gSeek == -2)
gSeek = Seek(file, position, mode);
return( gSeek );
}
#else /* not GIO_ACTIVE */
void GIODummy() { } /* to keep the compiler happy */
#endif GIO_ACTIVE