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

Last change on this file since 206 was 206, checked in by Maciej Komosinski, 10 years ago

VirtFILE base class provides Vprintf, Vgetc, Vputc, Vrewind, so that subclasses do not have to implement these functions

  • Property svn:eol-style set to native
File size: 3.3 KB
Line 
1// This file is a part of the Framsticks GDK.
2// Copyright (C) 1999-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) {unsigned char data=c; return (Vwrite(&data,1,1)==1)?data:EOF;}
29virtual int Vputs(const char *s)=0;
30virtual int Vgetc() {unsigned char data; if (Vread(&data,1,1)==1) return data; else return EOF;}
31virtual int Vseek(long offset, int whence)=0;
32virtual int Vtell()=0;
33virtual void Vrewind() {Vseek(0,SEEK_SET);}
34virtual int Vflush()=0;
35virtual char *Vgets(char *s, int size)=0;
36virtual int Vprintf(const char *format, va_list args);
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.