217 lines
4.4 KiB
C
217 lines
4.4 KiB
C
/*
|
|
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
|
|
*
|
|
* $Id: file.c 2.8 1996/11/20 18:07:30 STEVEW Exp $
|
|
* $Locker: $
|
|
*
|
|
* Low level wrappers for file system access
|
|
*/
|
|
#include <stdarg.h>
|
|
|
|
#include "fw.h"
|
|
#include "brassert.h"
|
|
|
|
BR_RCS_ID("$Id: file.c 2.8 1996/11/20 18:07:30 STEVEW Exp $")
|
|
|
|
/*
|
|
* Resource block used to represent an open file
|
|
*/
|
|
typedef struct br_file {
|
|
void *raw_file;
|
|
br_boolean writing;
|
|
int mode;
|
|
char name[1];
|
|
} br_file;
|
|
|
|
/*
|
|
* Resource destructor for files
|
|
*/
|
|
void BR_CALLBACK _BrFileFree(void *res, br_uint_8 res_class, br_size_t size)
|
|
{
|
|
br_file *file = res;
|
|
|
|
/*
|
|
* Close low level file
|
|
*/
|
|
ASSERT(fw.fsys->close != NULL);
|
|
|
|
fw.fsys->close(((br_file *)file)->raw_file);
|
|
}
|
|
|
|
br_uint_32 BR_PUBLIC_ENTRY BrFileAttributes(void)
|
|
{
|
|
ASSERT(fw.fsys->attributes != NULL);
|
|
|
|
return fw.fsys->attributes();
|
|
}
|
|
|
|
void * BR_PUBLIC_ENTRY BrFileOpenRead(const char *name, br_size_t n_magics,
|
|
br_mode_test_cbfn *mode_test,
|
|
int *mode_result)
|
|
{
|
|
void *raw_file;
|
|
br_file *file;
|
|
int bin_mode = BR_FS_MODE_BINARY;
|
|
|
|
ASSERT(fw.fsys->open_read != NULL);
|
|
|
|
/*
|
|
* Invoke low level file access
|
|
*/
|
|
if(mode_result)
|
|
raw_file = fw.fsys->open_read(name,n_magics,mode_test,mode_result);
|
|
else
|
|
raw_file = fw.fsys->open_read(name,n_magics,mode_test,&bin_mode);
|
|
|
|
/*
|
|
* Catch failure
|
|
*/
|
|
if(raw_file == NULL)
|
|
return NULL;
|
|
|
|
/*
|
|
* Create a file block (which includes the name and mode)
|
|
*/
|
|
file = BrResAllocate(fw.res, sizeof(br_file) + BrStrLen(name)+1, BR_MEMORY_FILE);
|
|
file->writing = BR_FALSE;
|
|
|
|
if ( mode_result != NULL )
|
|
file->mode = *mode_result;
|
|
else
|
|
file->mode = BR_FS_MODE_BINARY;
|
|
|
|
file->raw_file = raw_file;
|
|
BrStrCpy(file->name,name);
|
|
|
|
return file;
|
|
}
|
|
|
|
void * BR_PUBLIC_ENTRY BrFileOpenWrite(const char *name, int mode)
|
|
{
|
|
void *raw_file;
|
|
br_file *file;
|
|
|
|
ASSERT(fw.fsys->open_write != NULL);
|
|
|
|
UASSERT_MESSAGE("Invalid mode passed to BrFileOpenWrite.\n\r Must be BR_FS_MODE_TEXT or BR_FS_MODE_BINARY.",((mode== BR_FS_MODE_TEXT) || (mode == BR_FS_MODE_BINARY)));
|
|
|
|
raw_file = fw.fsys->open_write(name,mode);
|
|
|
|
/*
|
|
* Catch failure
|
|
*/
|
|
if(raw_file == NULL)
|
|
return NULL;
|
|
|
|
/*
|
|
* Create a file block (which includes the name and mode)
|
|
*/
|
|
file = BrResAllocate(fw.res, sizeof(br_file) + BrStrLen(name)+1, BR_MEMORY_FILE);
|
|
file->writing = BR_TRUE;
|
|
file->mode = mode;
|
|
file->raw_file = raw_file;
|
|
BrStrCpy(file->name,name);
|
|
|
|
return file;
|
|
|
|
}
|
|
|
|
void BR_PUBLIC_ENTRY BrFileClose(void *f)
|
|
{
|
|
UASSERT_MESSAGE("In BrFileClose",f!=NULL);
|
|
BrResFree(f);
|
|
}
|
|
|
|
int BR_PUBLIC_ENTRY BrFileEof(void *f)
|
|
{
|
|
ASSERT(fw.fsys->eof != NULL);
|
|
|
|
UASSERT_MESSAGE("In BrFileEof",f!=NULL);
|
|
|
|
return fw.fsys->eof(((br_file *)f)->raw_file);
|
|
}
|
|
|
|
int BR_PUBLIC_ENTRY BrFileGetChar(void *f)
|
|
{
|
|
ASSERT(fw.fsys->getchr != NULL);
|
|
|
|
UASSERT_MESSAGE("In BrFileGetChar",f!=NULL);
|
|
|
|
return fw.fsys->getchr(((br_file *)f)->raw_file);
|
|
}
|
|
|
|
void BR_PUBLIC_ENTRY BrFilePutChar(int c, void *f)
|
|
{
|
|
ASSERT(fw.fsys->putchr != NULL);
|
|
|
|
UASSERT_MESSAGE("In BrFilePutChar",f!=NULL);
|
|
|
|
fw.fsys->putchr(c,((br_file *)f)->raw_file);
|
|
}
|
|
|
|
int BR_PUBLIC_ENTRY BrFileRead(void *buf, int size, int n, void *f)
|
|
{
|
|
UASSERT_MESSAGE("In BrFileRead",f!=NULL);
|
|
UASSERT_MESSAGE("In BrFileRead",buf!=NULL);
|
|
|
|
ASSERT(fw.fsys->read != NULL);
|
|
|
|
return fw.fsys->read(buf,size,n,((br_file *)f)->raw_file);
|
|
}
|
|
|
|
int BR_PUBLIC_ENTRY BrFileWrite(void *buf, int size, int n, void *f)
|
|
{
|
|
UASSERT_MESSAGE("BrFileWrite",f!=NULL);
|
|
UASSERT_MESSAGE("BrFileWrite",buf!=NULL);
|
|
|
|
ASSERT(fw.fsys->write != NULL);
|
|
|
|
return fw.fsys->write(buf,size,n,((br_file *)f)->raw_file);
|
|
}
|
|
|
|
int BR_PUBLIC_ENTRY BrFileGetLine(char *buf, br_size_t buf_len, void * f)
|
|
{
|
|
UASSERT_MESSAGE("BrFileGetLine",f!=NULL);
|
|
|
|
ASSERT( ((br_file *)f)->raw_file );
|
|
|
|
return fw.fsys->getline(buf,buf_len,((br_file *)f)->raw_file);
|
|
}
|
|
|
|
void BR_PUBLIC_ENTRY BrFilePutLine(char *buf, void * f)
|
|
{
|
|
UASSERT_MESSAGE("BrFilePutLine",f!=NULL);
|
|
|
|
ASSERT(fw.fsys->putline != NULL);
|
|
|
|
|
|
fw.fsys->putline(buf,((br_file *)f)->raw_file);
|
|
}
|
|
|
|
void BR_PUBLIC_ENTRY BrFileAdvance(long int count, void *f)
|
|
{
|
|
UASSERT_MESSAGE("In BrFileAdvance",f!=NULL);
|
|
|
|
ASSERT(fw.fsys->advance != NULL);
|
|
|
|
fw.fsys->advance(count,((br_file *)f)->raw_file);
|
|
}
|
|
|
|
|
|
int BR_PUBLIC_ENTRY BrFilePrintf(void *f, char *fmt, ...)
|
|
{
|
|
int n;
|
|
va_list args;
|
|
UASSERT_MESSAGE("In BrFilePrintf",f!=NULL);
|
|
|
|
ASSERT(fw.fsys->write != NULL);
|
|
|
|
va_start(args, fmt);
|
|
n = BrVSprintf(BrScratchString(), fmt, args);
|
|
va_end(args);
|
|
|
|
fw.fsys->write(BrScratchString(), 1, n, ((br_file *)f)->raw_file);
|
|
|
|
return n;
|
|
}
|
|
|