bbfilesystem.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include "std.h"
  2. #include "bbfilesystem.h"
  3. #include "bbstream.h"
  4. #include <fstream>
  5. gxFileSystem *gx_filesys;
  6. struct bbFile : public bbStream{
  7. filebuf *buf;
  8. bbFile( filebuf *f ):buf(f){
  9. }
  10. ~bbFile(){
  11. delete buf;
  12. }
  13. int read( char *buff,int size ){
  14. return buf->sgetn( (char*)buff,size );
  15. }
  16. int write( const char *buff,int size ){
  17. return buf->sputn( (char*)buff,size );
  18. }
  19. int avail(){
  20. return buf->in_avail();
  21. }
  22. int eof(){
  23. return buf->sgetc()==EOF;
  24. }
  25. };
  26. static set<bbFile*> file_set;
  27. static inline void debugFile( bbFile *f ){
  28. if( debug ){
  29. if( !file_set.count( f ) ) RTEX( "File does not exist" );
  30. }
  31. }
  32. static inline void debugDir( gxDir *d ){
  33. if( debug ){
  34. if( !gx_filesys->verifyDir( d ) ) RTEX( "Directory does not exist" );
  35. }
  36. }
  37. static bbFile *open( BBStr *f,int n ){
  38. string t=*f;
  39. filebuf *buf=d_new filebuf();
  40. if( buf->open( t.c_str(),n|ios_base::binary ) ){
  41. bbFile *f=d_new bbFile( buf );
  42. file_set.insert( f );
  43. return f;
  44. }
  45. delete buf;
  46. return 0;
  47. }
  48. bbFile *bbReadFile( BBStr *f ){
  49. return open( f,ios_base::in );
  50. }
  51. bbFile *bbWriteFile( BBStr *f ){
  52. return open( f,ios_base::out|ios_base::trunc );
  53. }
  54. bbFile *bbOpenFile( BBStr *f ){
  55. return open( f,ios_base::in|ios_base::out );
  56. }
  57. void bbCloseFile( bbFile *f ){
  58. debugFile( f );
  59. file_set.erase( f );
  60. delete f;
  61. }
  62. int bbFilePos( bbFile *f ){
  63. return f->buf->pubseekoff( 0,ios_base::cur );
  64. }
  65. int bbSeekFile( bbFile *f,int pos ){
  66. return f->buf->pubseekoff( pos,ios_base::beg );
  67. }
  68. gxDir *bbReadDir( BBStr *d ){
  69. string t=*d;delete d;
  70. return gx_filesys->openDir( t,0 );
  71. }
  72. void bbCloseDir( gxDir *d ){
  73. gx_filesys->closeDir( d );
  74. }
  75. BBStr *bbNextFile( gxDir *d ){
  76. debugDir( d );
  77. return d_new BBStr( d->getNextFile() );
  78. }
  79. BBStr *bbCurrentDir(){
  80. return d_new BBStr( gx_filesys->getCurrentDir() );
  81. }
  82. void bbChangeDir( BBStr *d ){
  83. gx_filesys->setCurrentDir( *d );
  84. delete d;
  85. }
  86. void bbCreateDir( BBStr *d ){
  87. gx_filesys->createDir( *d );
  88. delete d;
  89. }
  90. void bbDeleteDir( BBStr *d ){
  91. gx_filesys->deleteDir( *d );
  92. delete d;
  93. }
  94. int bbFileType( BBStr *f ){
  95. string t=*f;delete f;
  96. int n=gx_filesys->getFileType( t );
  97. return n==gxFileSystem::FILE_TYPE_FILE ? 1 : (n==gxFileSystem::FILE_TYPE_DIR ? 2 : 0);
  98. }
  99. int bbFileSize( BBStr *f ){
  100. string t=*f;delete f;
  101. return gx_filesys->getFileSize( t );
  102. }
  103. void bbCopyFile( BBStr *f,BBStr *to ){
  104. string src=*f,dest=*to;
  105. delete f;delete to;
  106. gx_filesys->copyFile( src,dest );
  107. }
  108. void bbDeleteFile( BBStr *f ){
  109. gx_filesys->deleteFile( *f );
  110. delete f;
  111. }
  112. bool filesystem_create(){
  113. if( gx_filesys=gx_runtime->openFileSystem( 0 ) ){
  114. return true;
  115. }
  116. return false;
  117. }
  118. bool filesystem_destroy(){
  119. while( file_set.size() ) bbCloseFile( *file_set.begin() );
  120. gx_runtime->closeFileSystem( gx_filesys );
  121. return true;
  122. }
  123. void filesystem_link( void(*rtSym)(const char*,void*) ){
  124. rtSym( "%OpenFile$filename",bbOpenFile );
  125. rtSym( "%ReadFile$filename",bbReadFile );
  126. rtSym( "%WriteFile$filename",bbWriteFile );
  127. rtSym( "CloseFile%file_stream",bbCloseFile );
  128. rtSym( "%FilePos%file_stream",bbFilePos );
  129. rtSym( "%SeekFile%file_stream%pos",bbSeekFile );
  130. rtSym( "%ReadDir$dirname",bbReadDir );
  131. rtSym( "CloseDir%dir",bbCloseDir );
  132. rtSym( "$NextFile%dir",bbNextFile );
  133. rtSym( "$CurrentDir",bbCurrentDir );
  134. rtSym( "ChangeDir$dir",bbChangeDir );
  135. rtSym( "CreateDir$dir",bbCreateDir );
  136. rtSym( "DeleteDir$dir",bbDeleteDir );
  137. rtSym( "%FileSize$file",bbFileSize );
  138. rtSym( "%FileType$file",bbFileType );
  139. rtSym( "CopyFile$file$to",bbCopyFile );
  140. rtSym( "DeleteFile$file",bbDeleteFile );
  141. }