source: cpp/frams/virtfile/virtfile.h @ 131

Last change on this file since 131 was 131, checked in by Maciej Komosinski, 7 years ago

a better way to save/restore a preprocessor macro, unfortunately not a c++ standard (yet?)

  • Property svn:eol-style set to native
File size: 3.2 KB
Line 
1// This file is a part of the Framsticks GDK.
2// Copyright (C) 2002-2014  Maciej Komosinski and Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.framsticks.com/ for further information.
4
5#ifndef _VIRTFILE_H_
6#define _VIRTFILE_H_
7
8#include <stdio.h>
9#include <stdarg.h>
10#include <common/nonstd_dir.h>
11//#include <dirent.h> //to jest inkludowane przez powyzsze
12//struct dirent; //kiedys byla ta linia jak nie bylo jeszcze implementacji windowsowej dirent, ale borlandowi sie nie podoba jak s¹ obie
13
14#ifdef DLLEXPORTACTIVE  //tylko w tym pliku uzyte
15#define DLLEXP __declspec(dllexport)
16#else
17#define DLLEXP
18#endif
19
20class DLLEXP VirtFileSystem;
21
22class DLLEXP VirtFILE
23{
24  public:
25virtual int Vread(void *ptr, size_t size, size_t nmemb)=0;
26virtual int Vwrite(const void *ptr, size_t size, size_t nmemb)=0;
27virtual int Veof()=0;
28virtual int Vputc(int c)=0;
29virtual int Vputs(const char *s)=0;
30virtual int Vgetc()=0;
31virtual int Vseek(long offset, int whence)=0;
32virtual int Vtell()=0;
33virtual void Vrewind()=0;
34virtual int Vflush()=0;
35virtual char *Vgets(char *s, int size)=0;
36virtual int Vprintf(const char *format, va_list args)=0;
37int printf(const char *format, ...);
38virtual const char *VgetPath() {return 0;} // 0=unspecified path
39virtual ~VirtFILE();
40static VirtFILE *Vstdin,*Vstdout,*Vstderr;
41static void setVstdin(VirtFILE *);
42static void setVstdout(VirtFILE *);
43static void setVstderr(VirtFILE *);
44static VirtFILE* getVstdin();
45static VirtFILE* getVstdout();
46static VirtFILE* getVstderr();
47static VirtFileSystem *vfs;
48static void selectFileSystem(VirtFileSystem *s);
49};
50
51class DLLEXP VirtDIR
52{
53  public:
54virtual ~VirtDIR() {}
55virtual dirent* Vreaddir() {return 0;}
56};
57
58class DLLEXP VirtFileSystem
59{
60public:
61virtual VirtFILE *Vfopen(const char* path,const char*mode);
62virtual int Vfexists(const char* path);
63virtual VirtDIR *Vopendir(const char* path);
64};
65
66DLLEXP VirtFILE *Vfopen(const char* path,const char*mode);
67DLLEXP VirtDIR *Vopendir(const char* path);
68DLLEXP int Vfexists(const char* path);
69
70DLLEXP int fread(void *ptr, size_t size, size_t nmemb, VirtFILE* f);
71DLLEXP int fwrite(const void *ptr, size_t size, size_t nmemb, VirtFILE* f);
72
73
74//since we want our own feof(VirtFILE*) function and some systems unfortunately define feof as a macro, we need to #undef it. Same as in virtfile.cpp
75#if defined _MSC_VER || defined __CYGWIN__ || defined SHP
76 #pragma push_macro("feof")
77 #undef feof
78#endif
79#if defined __BORLANDC__ //does not support #pragma push_macro/pop_macro
80 #undef feof
81#endif
82 
83DLLEXP int feof(VirtFILE* f);// {return f->Veof();}
84
85//...and then restore the original macro:
86#if defined _MSC_VER || defined __CYGWIN__ || defined SHP
87 #pragma pop_macro("feof")
88#endif
89#ifdef __BORLANDC__
90 #define feof(__f)     ((__f)->flags & _F_EOF)
91#endif
92
93
94DLLEXP int fputc(int c,VirtFILE* f);
95DLLEXP int fputs(const char *s,VirtFILE* f);
96DLLEXP int fgetc(VirtFILE* f);
97DLLEXP int fseek(VirtFILE* f,long offset, int whence);
98DLLEXP int ftell(VirtFILE* f);
99DLLEXP void rewind(VirtFILE* f);
100DLLEXP int fflush(VirtFILE* f);
101DLLEXP char *fgets(char *s, int size, VirtFILE* f);
102DLLEXP int fprintf(VirtFILE* f,const char *format, ...);
103DLLEXP int fclose(VirtFILE* f);
104
105DLLEXP dirent* readdir(VirtDIR* d);
106DLLEXP int closedir(VirtDIR* d);
107
108#endif
109
Note: See TracBrowser for help on using the repository browser.