// This file is a part of the Framsticks GDK. // Copyright (C) 1999-2014 Maciej Komosinski and Szymon Ulatowski. See LICENSE.txt for details. // Refer to http://www.framsticks.com/ for further information. #ifndef _STDIOFILE_H_ #define _STDIOFILE_H_ #include "virtfile.h" #include #ifdef USE_MFILE #include #else #include #endif #include class StdioFileSystem: public VirtFileSystem { public: VirtFILE *Vfopen(const char* path,const char*mode); int Vfexists(const char* path); VirtDIR *Vopendir(const char* path); }; #ifdef USE_MFILE class StdioFILE: public VirtFILE { protected: MFILE *file; SString path; public: StdioFILE(MFILE *f) {file=f;} StdioFILE(MFILE *f,const SString& p) {file=f;path=p;} static void setStdio(); int Vread(void *ptr, size_t size, size_t nmemb) {return mfread(ptr,size,nmemb,file);} int Vwrite(const void *ptr, size_t size, size_t nmemb) {return mfwrite(ptr,size,nmemb,file);} int Veof() {return mfeof(file);} int Vputs(const char *s) {return mfputs(s,file);} char *Vgets(char *s, int size) {return mfgets(s,size,file);} int Vseek(long offset, int whence) {return mfseek(file,offset,whence);} int Vtell() {return mftell(file);} int Vflush() {return 0;/*NOT IMPLEMENTED!*/;} const char* VgetPath() {return path;} ~StdioFILE() {if (file) mfclose(file);} }; #else class StdioFILE: public VirtFILE { protected: FILE *file; SString path; public: StdioFILE(FILE *f) {file=f;} StdioFILE(FILE *f,const SString& p) {file=f;path=p;} static void setStdio(); int Vread(void *ptr, size_t size, size_t nmemb) {return fread(ptr,size,nmemb,file);} int Vwrite(const void *ptr, size_t size, size_t nmemb) {return fwrite(ptr,size,nmemb,file);} int Veof() {return feof(file);} int Vputc(int c) {return fputc(c,file);} int Vputs(const char *s) {return fputs(s,file);} int Vgetc() {return fgetc(file);} char *Vgets(char *s, int size) {return fgets(s,size,file);} int Vprintf(const char *format, va_list args) { return vfprintf(file,format,args); } int Vseek(long offset, int whence) {return fseek(file,offset,whence);} int Vtell() {return ftell(file);} void Vrewind() {rewind(file);} int Vflush() {return fflush(file);} const char* VgetPath() {return path;} ~StdioFILE() {if (file) fclose(file);} }; #endif class StdioDIR: public VirtDIR { DIR *dir; public: StdioDIR(DIR* d):dir(d) {} ~StdioDIR() {if (dir) closedir(dir);} dirent* Vreaddir(); }; class StdioFILEDontClose: public StdioFILE { public: #ifdef USE_MFILE StdioFILEDontClose(MFILE *f):StdioFILE(f) {} #else StdioFILEDontClose(FILE *f):StdioFILE(f) {} #endif ~StdioFILEDontClose() {file=0;} }; #endif