gno/sys/fileport/includes/KS.FileIO.e

375 lines
13 KiB
Plaintext

/*
* Copyright (c) Kopriha Software, 1990-1991
* All Rights Reserved
*
* ks.fileio.e
*
* Description: This include file contains all the generic file
* support macros from Kopriha Software.
*
*
* Table of contents:
*
* Structures:
*
* KS_FILE . . . . . . . . . Structure to abstract a file
*
* Macros:
*
* + KS_FILE_CLOSE() . . . . . . . Close a file
* + KS_FILE_CHANGE_AUXTYPE() . . . Change the aux type of a file
* + KS_FILE_CREATE() . . . . . . . Create a file (w ftype,auxtype)
* + KS_FILE_DELETE() . . . . . . . Delete a file
* + KS_FILE_GET_BUFFER_SIZE(). . . Get the input/output buffer size
* + KS_FILE_GET_DIRECTORY() . . . Get the current directory
* + KS_FILE_GET_NEXT_FILE() . . . Get next filename from a directory
* + KS_FILE_GET_VOLUME() . . . . . Get volume name from pathname
* + KS_FILE_GET_VOLUME_SPACE() . . Get the total/available space on
* the specified volume
* + KS_FILE_OPEN() . . . . . . . . Open a file
* + KS_FILE_PATH_ADD_FILE() . . . Append a filename to a path/dir
* + KS_FILE_READ() . . . . . . . . Read from a file
* KS_FILE_RENAME() . . . . . . . Rename a file (given pathnames)
* + KS_FILE_SET_BUFFER_SIZE(). . . Set the input/output buffer size
* * KS_FILE_SET_DIRECTORY() . . . Set the current directory
* + KS_FILE_WRITE() . . . . . . . Write to a file
*
* + indicates that the routine was debugged
* * indicates the routine exists but was not debugged
*
*
* Notes:
*
* History:Oct 13, 1990 Dave Created this file for basic
* I/O (read/write)
*
* Feb 25, 1991 Dave Added buffer enhancements/create.
*
* Mar 5, 1991 Dave Added directory, file, path and
* volume calls
*
* Mar 24, 1991 Dave Added delete and change aux type
*
* Jun 07, 1991 Dave Broke the ks.fileio.cc module into
* lots of pieces so we could easily
* build a library.
*
* Jun 30, 1991 Dave Added a rename function.
*
*/
#ifndef _KS_FILEIO_E_
#define _KS_FILEIO_E_
#ifndef _KS_DEFINES_
#include "ks.defines.h"
#endif
#ifndef _GSOS_
#include <gsos.h>
#endif
/*
* Buffer flag constants - used to determine if a buffer should
* be used for I/O. The idea here is that if you specify a buffer,
* then you have to read/write without specifying a byte position
* (KS_NEXT_FILE_POSITION).
*/
#define KS_FILE_NO_BUFFER ((Word) 0)
#define KS_FILE_BUFFER_IO ((Word) 1)
#define KS_NEXT_FILE_POSITION ((Word) -1)
/*
* The following are definitions that I expected to find in the
* APW 1.1/Orca/C update, but could not. I want to be able to
* recompile without worrying about hard-coding constants in my
* program, I defined the following macros:
*/
#define KS_FILE_DATA_FORK ((Word) 0) /* For GS/OS Open */
#define KS_FILE_RESOURCE_FORK ((Word) 1)
#define KS_FILE_READ_ACCESS ((Word) readEnable)
#define KS_FILE_WRITE_ACCESS ((Word) writeEnable)
#define KS_BLOCK_DEVICE ((Word) 0x0080) /* used with DInfo */
/*
* KS_FILE - generic file structure
*/
typedef struct
{
KS_STRUCT_ID struct_id;/* Structure id */
Handle file_handle; /* Handle that created this structure */
Word refNum; /* Reference # (or channel #) of the file */
Word access; /* Access mode of file (read or write) */
LongWord eof; /* End of File of data fork */
LongWord resource_eof; /* End of file for resource fork */
/* Note: Not all systems support filetypes*/
Word fileType; /* Value of file's fileType attribute */
LongWord auxType; /* Auxilary file type */
LongWord data_size; /* Amount of data read/written for user */
Word end_of_file; /* TRUE==We've read to end of file */
Word end_of_dir; /* TRUE==We've read to end of directory */
Handle buffer_handle;
/* Handle to the buffer (if specified) */
LongWord buffer_size; /* Size of the buffer (NULL if not */
/* specified) */
LongWord buffer_available;
/* Number of bytes read into the buffer */
/* Typically this offset is the same as */
/* buffer_size, however end of file is a */
/* special case where the number of */
/* read bytes typically can't be the same*/
/* the size of the buffer. */
Byte *buffer; /* Pointer to the file buffer */
LongWord buffer_offset;
/* Offset of next available byte in buffer*/
} KS_FILE, *KS_FILE_PTR, **KS_FILE_HDL;
/*
* KS_FILE_CLOSE() - close a file.
*/
#define KS_FILE_CLOSE(_file_ptr, _error) \
\
(_error) = ks_file_close( (_file_ptr))
/*
* KS_FILE_CREATE() - creates a file with the specified name, filetype
* and auxtype.
*/
#define KS_FILE_CREATE(_gspath_ptr, _file_type, _auxtype, _error) \
\
(_error) = ks_file_create( (_gspath_ptr), \
(_file_type), \
(_auxtype))
/*
* KS_FILE_CHANGE_AUXTYPE() - change the auxtype of an existing file.
*
* Note: This call is only works when the file is closed!
*/
#define KS_FILE_CHANGE_AUXTYPE(_gspath_ptr, _auxtype, _error) \
\
(_error) = ks_file_change_auxtype( (_gspath_ptr), \
(_auxtype))
/*
* KS_FILE_DELETE() - Deletes the specified file
*/
#define KS_FILE_DELETE(_gspath_ptr, _error) \
\
(_error) = ks_file_delete( (_gspath_ptr))
/*
* KS_FILE_GET_BUFFER_SIZE() - returns the current buffer size used
*
* Note: If the buffer size can only be changed if there are no
* open files (this restriction will change in the future).
*/
#define KS_FILE_GET_BUFFER_SIZE(_buffer_size, _error) \
\
(_error) = ks_file_get_buffer_size( (_buffer_size))
/*
* KS_FILE_GET_NEXT_FILE(FILE_PTR, DirEntryRecPtrGS) - Get next
* filename from a directory
*/
#define KS_FILE_GET_NEXT_FILE(_file_ptr, _next_file_ptr, _error) \
\
(_error) = ks_file_get_next_file( (_file_ptr), \
(_next_file_ptr))
/*
* KS_FILE_GET_VOLUME() - Get volume name from pathname
*/
#define KS_FILE_GET_VOLUME(_file_ptr, _volume_ptr, _error) \
\
(_error) = ks_file_get_volume( (_file_ptr), \
(_volume_ptr))
/*
* KS_FILE_GET_VOLUME_SPACE() - Get the total/available space on
* the specified volume
*/
#define KS_FILE_GET_VOLUME_SPACE(_volume_ptr, _unused, _total, _error) \
\
(_error) = ks_file_get_volume_space( (_volume_ptr), \
(_unused), \
(_total))
/*
* KS_FILE_OPEN() - opens a file (either data or resource fork)
* returns a KS_FILE structure to our caller.
*/
#define KS_FILE_OPEN(_gspath_ptr, _access, _file_fork, _buf_flag, _file_ptr_ptr, _error)\
\
(_error) = ks_file_open( (_gspath_ptr), \
(_access), \
(_file_fork), \
(_buf_flag), \
(_file_ptr_ptr))
/*
* KS_FILE_PATH_ADD_FILE() - Append a filename to a path/dir
*/
#define KS_FILE_PATH_ADD_FILE(_path_ptr, _file_ptr, _error) \
\
(_error) = ks_file_path_add_file( (_path_ptr), \
(_file_ptr))
/*
* KS_FILE_READ() - read from a file.
*/
#define KS_FILE_READ(_file_ptr, _position, _byte_size, _buffer, _error)\
\
(_error) = ks_file_read( (_file_ptr), \
(_position), \
(_byte_size), \
(_buffer))
/*
* KS_FILE_RENAME() - rename a file.
*/
#define KS_FILE_RENAME(_old_pathname, _new_pathname, _error) \
\
(_error) = ks_file_rename( (_old_pathname), \
(_new_pathname))
/*
* KS_FILE_SET_BUFFER_SIZE() - sets the current buffer size used
*
* Note: If the buffer size can only be changed if there are no
* open files (this restriction will change in the future).
*/
#define KS_FILE_SET_BUFFER_SIZE(_buffer_size, _error) \
\
(_error) = ks_file_set_buffer_size( (_buffer_size))
/*
* KS_FILE_SET_DIRECTORY() - Set the current directory
*/
#define KS_FILE_SET_DIRECTORY(_directory_ptr, _error) \
\
(_error) = ks_file_set_directory( (_directory_ptr))
/*
* KS_FILE_SET_EOF() - set the end of the specified file
*/
#define KS_FILE_SET_EOF(_file_ptr, _eof, _error) \
\
(_error) = ks_file_set_eof( (_file_ptr), \
(_eof))
/*
* KS_FILE_WRITE() - write to a file.
*/
#define KS_FILE_WRITE(_file_ptr, _position, _byte_size, _buffer, _error)\
\
(_error) = ks_file_write( (_file_ptr), \
(_position), \
(_byte_size), \
(_buffer))
/* ****************************************************************** *
* File I/O routine prototypes: *
* ****************************************************************** */
KS_E_ERROR ks_file_close(KS_FILE_PTR);
KS_E_ERROR ks_file_create(GSString255Ptr,
Word,
LongWord);
KS_E_ERROR ks_file_change_auxtype(GSString255Ptr,
LongWord);
KS_E_ERROR ks_file_get_buffer_size(LongWord *);
KS_E_ERROR ks_file_delete(GSString255Ptr);
KS_E_ERROR ks_file_get_next_file(KS_FILE_PTR,
DirEntryRecPtrGS);
KS_E_ERROR ks_file_get_volume(GSString255Ptr,
GSString255Ptr);
KS_E_ERROR ks_file_get_volume_space(GSString255Ptr,
LongWord *,
LongWord *);
KS_E_ERROR ks_file_open(GSString255Ptr,
Word,
Word,
Word,
KS_FILE_PTR *);
KS_E_ERROR ks_file_read(KS_FILE_PTR,
LongWord,
LongWord,
Pointer);
KS_E_ERROR ks_file_rename(GSString255Ptr,
GSString255Ptr);
KS_E_ERROR ks_file_path_add_file(GSString255Ptr,
GSString255Ptr);
KS_E_ERROR ks_file_set_buffer_size(LongWord);
KS_E_ERROR ks_file_set_directory(GSString255Ptr);
KS_E_ERROR ks_file_set_eof(KS_FILE_PTR,
LongWord);
KS_E_ERROR ks_file_write(KS_FILE_PTR,
LongWord,
LongWord,
Pointer);
#endif