171 lines
3.4 KiB
C++
171 lines
3.4 KiB
C++
|
|
#include "std.h"
|
|
#include "bbfilesystem.h"
|
|
#include "bbstream.h"
|
|
#include <fstream>
|
|
|
|
gxFileSystem *gx_filesys;
|
|
|
|
struct bbFile : public bbStream{
|
|
filebuf *buf;
|
|
bbFile( filebuf *f ):buf(f){
|
|
}
|
|
~bbFile(){
|
|
delete buf;
|
|
}
|
|
int read( char *buff,int size ){
|
|
return buf->sgetn( (char*)buff,size );
|
|
}
|
|
int write( const char *buff,int size ){
|
|
return buf->sputn( (char*)buff,size );
|
|
}
|
|
int avail(){
|
|
return buf->in_avail();
|
|
}
|
|
int eof(){
|
|
return buf->sgetc()==EOF;
|
|
}
|
|
};
|
|
|
|
static set<bbFile*> file_set;
|
|
|
|
static inline void debugFile( bbFile *f ){
|
|
if( debug ){
|
|
if( !file_set.count( f ) ) RTEX( "File does not exist" );
|
|
}
|
|
}
|
|
|
|
static inline void debugDir( gxDir *d ){
|
|
if( debug ){
|
|
if( !gx_filesys->verifyDir( d ) ) RTEX( "Directory does not exist" );
|
|
}
|
|
}
|
|
|
|
static bbFile *open( BBStr *f,int n ){
|
|
string t=*f;
|
|
filebuf *buf=d_new filebuf();
|
|
if( buf->open( t.c_str(),n|ios_base::binary ) ){
|
|
bbFile *f=d_new bbFile( buf );
|
|
file_set.insert( f );
|
|
return f;
|
|
}
|
|
delete buf;
|
|
return 0;
|
|
}
|
|
|
|
bbFile *bbReadFile( BBStr *f ){
|
|
return open( f,ios_base::in );
|
|
}
|
|
|
|
bbFile *bbWriteFile( BBStr *f ){
|
|
return open( f,ios_base::out|ios_base::trunc );
|
|
}
|
|
|
|
bbFile *bbOpenFile( BBStr *f ){
|
|
return open( f,ios_base::in|ios_base::out );
|
|
}
|
|
|
|
void bbCloseFile( bbFile *f ){
|
|
debugFile( f );
|
|
file_set.erase( f );
|
|
delete f;
|
|
}
|
|
|
|
int bbFilePos( bbFile *f ){
|
|
return f->buf->pubseekoff( 0,ios_base::cur );
|
|
}
|
|
|
|
int bbSeekFile( bbFile *f,int pos ){
|
|
return f->buf->pubseekoff( pos,ios_base::beg );
|
|
}
|
|
|
|
gxDir *bbReadDir( BBStr *d ){
|
|
string t=*d;delete d;
|
|
return gx_filesys->openDir( t,0 );
|
|
}
|
|
|
|
void bbCloseDir( gxDir *d ){
|
|
gx_filesys->closeDir( d );
|
|
}
|
|
|
|
BBStr *bbNextFile( gxDir *d ){
|
|
debugDir( d );
|
|
return d_new BBStr( d->getNextFile() );
|
|
}
|
|
|
|
BBStr *bbCurrentDir(){
|
|
return d_new BBStr( gx_filesys->getCurrentDir() );
|
|
}
|
|
|
|
void bbChangeDir( BBStr *d ){
|
|
gx_filesys->setCurrentDir( *d );
|
|
delete d;
|
|
}
|
|
|
|
void bbCreateDir( BBStr *d ){
|
|
gx_filesys->createDir( *d );
|
|
delete d;
|
|
}
|
|
|
|
void bbDeleteDir( BBStr *d ){
|
|
gx_filesys->deleteDir( *d );
|
|
delete d;
|
|
}
|
|
|
|
int bbFileType( BBStr *f ){
|
|
string t=*f;delete f;
|
|
int n=gx_filesys->getFileType( t );
|
|
return n==gxFileSystem::FILE_TYPE_FILE ? 1 : (n==gxFileSystem::FILE_TYPE_DIR ? 2 : 0);
|
|
}
|
|
|
|
int bbFileSize( BBStr *f ){
|
|
string t=*f;delete f;
|
|
return gx_filesys->getFileSize( t );
|
|
}
|
|
|
|
void bbCopyFile( BBStr *f,BBStr *to ){
|
|
string src=*f,dest=*to;
|
|
delete f;delete to;
|
|
gx_filesys->copyFile( src,dest );
|
|
}
|
|
|
|
void bbDeleteFile( BBStr *f ){
|
|
gx_filesys->deleteFile( *f );
|
|
delete f;
|
|
}
|
|
|
|
bool filesystem_create(){
|
|
if( gx_filesys=gx_runtime->openFileSystem( 0 ) ){
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool filesystem_destroy(){
|
|
while( file_set.size() ) bbCloseFile( *file_set.begin() );
|
|
gx_runtime->closeFileSystem( gx_filesys );
|
|
return true;
|
|
}
|
|
|
|
void filesystem_link( void(*rtSym)(const char*,void*) ){
|
|
rtSym( "%OpenFile$filename",bbOpenFile );
|
|
rtSym( "%ReadFile$filename",bbReadFile );
|
|
rtSym( "%WriteFile$filename",bbWriteFile );
|
|
rtSym( "CloseFile%file_stream",bbCloseFile );
|
|
rtSym( "%FilePos%file_stream",bbFilePos );
|
|
rtSym( "%SeekFile%file_stream%pos",bbSeekFile );
|
|
|
|
rtSym( "%ReadDir$dirname",bbReadDir );
|
|
rtSym( "CloseDir%dir",bbCloseDir );
|
|
rtSym( "$NextFile%dir",bbNextFile );
|
|
rtSym( "$CurrentDir",bbCurrentDir );
|
|
rtSym( "ChangeDir$dir",bbChangeDir );
|
|
rtSym( "CreateDir$dir",bbCreateDir );
|
|
rtSym( "DeleteDir$dir",bbDeleteDir );
|
|
|
|
rtSym( "%FileSize$file",bbFileSize );
|
|
rtSym( "%FileType$file",bbFileType );
|
|
rtSym( "CopyFile$file$to",bbCopyFile );
|
|
rtSym( "DeleteFile$file",bbDeleteFile );
|
|
}
|