home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
17 Bit Software 1: Collection A
/
17Bit_Collection_A.iso
/
files
/
61.dms
/
61.adf
/
source.files
/
iff
/
gio.h
< prev
next >
Wrap
C/C++ Source or Header
|
1986-03-21
|
6KB
|
152 lines
#ifndef GIO_H
#define GIO_H
/*----------------------------------------------------------------------*/
/* GIO.H defs for 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. */
/* */
/* WARNING: If gio reports an error to you and you care what specific */
/* Dos error was, you must call IoErr() BEFORE calling any other gio */
/* functions. */
/* */
/* By Jerry Morrison and Steve Shaw, Electronic Arts. */
/* This software is in the public domain. */
/* */
/* This version for the Commodore-Amiga computer. */
/* */
/*----------------------------------------------------------------------*/
/* Use this file interface in place of ALL Open,Close,Read,Write,Seek DOS
* calls for an optional i/o speed-up via buffering. You must use ONLY
* these G routines for a file that is being buffered; e.g., call GClose
* to Close the file, etc.
* It is harmless though not necessary to use G routines for a file that
* is not being buffered; e.g., GClose and Close are equivalent in that
* case.
* This Version only buffers one file at a time, and only for writing.
* If you call GWriteDeclare for a second file before the first file
* is GClosed, the first file becomes unbuffered. This is harmless, no
* data is lost, the first file is simply no longer speeded-up.
*/
/* Before compiling any modules that make G calls, or compiling gio.c,
* you must set the GIO_ACTIVE flag below.
*
* To omit the speed-up code,
* #define GIO_ACTIVE 0
*
* To make the speed-up happen:
* 1. #define GIO_ACTIVE 1
* 2. link gio.o into your progrm
* 3. GWriteDeclare(file, buffer, size)
* after GOpening the file and before doing
* any writing.
* 4. ONLY use GRead, GWrite, GSeek, GClose -- do not use the DOS i/o
* routines directly.
* 5. When done, do GClose. Or to stop buffering without closing the
* file, do GWriteUndeclare(file).
*/
#define GIO_ACTIVE 0
#ifndef COMPILER_H
#include "iff/compiler.h"
#endif
#ifndef LIBRARIES_DOS_H
#include "libraries/dos.h"
#endif
#ifndef OFFSET_BEGINNING
#define OFFSET_BEGINNING OFFSET_BEGINING
#endif
#if GIO_ACTIVE
#ifdef FDwAT /* Compiler handles Function Declaration with Argument Types */
/* Present for completeness in the interface.
* "openmode" is either MODE_OLDFILE to read/write an existing file, or
* MODE_NEWFILE to write a new file.
* RETURNs a "file" pointer to a system-supplied structure that describes
* the open file. This pointer is passed in to the other routines below.*/
extern BPTR GOpen(char * /*filename*/, LONG /*openmode*/);
/* NOTE: Flushes & Frees the write buffer.
* Returns -1 on error from Write.*/
extern LONG GClose(BPTR /*file*/);
/* Read not speeded-up yet.
* GOpen the file, then do GReads to get successive chunks of data in
* the file. Assumes the system can handle any number of bytes in each
* call, regardless of any block-structure of the device being read from.
* When done, GClose to free any system resources associated with an
* open file.*/
extern LONG GRead(BPTR /*file*/, BYTE * /*buffer*/, LONG /*nBytes*/);
/* Writes out any data in write buffer for file.
* NOTE WHEN have Seeked into middle of buffer:
* GWriteFlush causes current position to be the end of the data written.
* -1 on error from Write.*/
extern LONG GWriteFlush(BPTR /*file*/);
/* Sets up variables to describe a write buffer for the file.*/
/* If the buffer already has data in it from an outstanding GWriteDeclare,
* then that buffer must first be flushed.
* RETURN -1 on error from Write for that previous buffer flush.
* See also "GWriteUndeclare".*/
extern LONG GWriteDeclare(BPTR /*file*/, BYTE * /*buffer*/, LONG /*nBytes*/);
/* ANY PROGRAM WHICH USES "GWrite" MUST USE "GSeek" rather than "Seek"
* TO SEEK ON A FILE BEING WRITTEN WITH "GWrite".
* "Write" with Generic speed-up.
* -1 on error from Write. else returns # bytes written to disk.
* Call GOpen, then do successive GWrites with GSeeks if required,
* then GClose when done. (IFF does require GSeek.)*/
extern LONG GWrite(BPTR /*file*/, BYTE * /*buffer*/, LONG /*nBytes*/);
/* "Seek" with Generic speed-up, for a file being written with GWrite.*/
/* Returns what Seek returns, which appears to be the position BEFORE
* seeking, though the documentation says it returns the NEW position.
* In fact, the code now explicitly returns the OLD position when
* seeking within the buffer.
* Eventually, will support two independent files, one being read, the
* other being written. Or could support even more. Designed so is safe
* to call even for files which aren't being buffered.*/
extern LONG GSeek(BPTR /*file*/, LONG /*position*/, LONG /*mode*/);
#else /*not FDwAT*/
extern BPTR GOpen();
extern LONG GClose();
extern LONG GRead();
extern LONG GWriteFlush();
extern LONG GWriteDeclare();
extern LONG GWrite();
extern LONG GSeek();
#endif FDwAT
#else /* not GIO_ACTIVE */
#define GOpen(filename, openmode) Open(filename, openmode)
#define GClose(file) Close(file)
#define GRead(file, buffer, nBytes) Read(file, buffer, nBytes)
#define GWriteFlush(file) (0)
#define GWriteDeclare(file, buffer, nBytes) (0)
#define GWrite(file, buffer, nBytes) Write(file, buffer, nBytes)
#define GSeek(file, position, mode) Seek(file, position, mode)
#endif GIO_ACTIVE
/* Release the buffer for that file, flushing it to disk if it has any
* contents. GWriteUndeclare(NULL) to release ALL buffers.
* Currently, only one file can be buffered at a time anyway.*/
#define GWriteUndeclare(file) GWriteDeclare(file, NULL, 0)
#endif