00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __MAGISTREAM_H__
00026 #define __MAGISTREAM_H__
00027
00028 #include "magic/mobject.h"
00029 #include "magic/mstring.h"
00030
00031 class File;
00032 class DumpContext;
00033 class Stream;
00034 class OStream;
00035
00036 class IODevice : public Object {
00037 public:
00038 };
00039
00040 class File : public IODevice {
00041 protected:
00042 FILE* mpFile;
00043 String mName;
00044 public:
00045 File (FILE* str=stdout) : mpFile (str) {;}
00046 File (const String& n) : mpFile(NULL), mName(n) {;}
00047 FILE* getfp () {return mpFile;}
00048 bool isopen () const {return mpFile;}
00049
00050 };
00051
00052 class Stream : public Object {
00053 protected:
00054 int mode;
00055 FILE* stream;
00056 public:
00057 Stream (FILE* strm) {stream=strm; mode=0;}
00058 void operator= (FILE* strm) {stream=strm; mode=0;}
00059
00060 void close ();
00061
00062 friend DumpContext;
00063 };
00064
00065
00066
00068
00069
00070
00071
00072
00073
00074
00076
00077 class OStream : public Stream {
00078 protected:
00079 bool aflush;
00080 unsigned long mUserFlags;
00081 public:
00082 OStream (FILE* strm=stdout);
00083 OStream (OStream& o);
00084
00085 OStream& print (const char c);
00086 OStream& print (const char* str);
00087 void flush () {fflush (stream);}
00088 void autoflush (bool afl=true) {aflush=afl;}
00089 void operator= (const OStream& other);
00090
00094 void setFlag (int flag, bool=true);
00095
00099 bool flag (int flag) const;
00100
00104 bool operator[] (int f) const {return flag(f);}
00105
00106
00107
00108 virtual OStream& printf (const char* format, ...);
00109 virtual OStream& operator<< (const char* str);
00110 virtual OStream& operator<< (int i);
00111 virtual OStream& operator<< (long i);
00112
00113 };
00114
00115
00116 extern OStream sout;
00117 extern OStream serr;
00118
00120
00121
00122
00123
00124
00125
00126
00128
00129 class DumpContext : public OStream {
00130 protected:
00131 String nextname;
00132 int depth;
00133 int prevdepth;
00134 Array<String>* attribs;
00135 int errst;
00136
00137 int open (const char* filename, int flag);
00138 public:
00139 bool names;
00140 bool classnames;
00141
00142 DumpContext (FILE* strm=stdout);
00143 DumpContext (OStream& o);
00144 ~DumpContext ();
00145
00146 DumpContext& printf (const char* format, ...);
00147
00148
00149
00150 DumpContext& operator<< (int i);
00151 DumpContext& operator<< (long i);
00152 DumpContext& operator<< (char i);
00153 DumpContext& operator<< (float i);
00154 DumpContext& operator<< (double i);
00155 DumpContext& operator<< (const char* str);
00156 DumpContext& write (const char* p, int n);
00157
00158
00159 DumpContext& name (const char* nam) {nextname=nam; return *this;}
00160
00161 const Array<String>& getattribs () const {return *attribs;}
00162
00163 protected:
00164
00165 DumpContext& printName ();
00166
00167
00168 void printIndent ();
00169
00170
00171 void printComma ();
00172
00173 friend DumpContext& operator<< (DumpContext& out, const Object& obj);
00174 friend DumpContext& operator>> (DumpContext& in, Object& obj);
00175 };
00176
00177
00178
00179
00180
00181
00182 enum { DUMP_LOAD=0, DUMP_SAVE=1, DUMP_RECORD=2,
00183 DUMP_BINARY=0, DUMP_TEXT=16, DUMP_FORMATTED=32,
00184 DUMP_VERINFO=64,
00185 DUMP_ADDRESSES=128, DUMP_CLASSNAMES};
00186
00187
00188
00190
00191
00192
00193
00194
00195
00196
00198
00199 class IStream : public Stream {
00200
00201 public:
00202
00203 IStream (FILE* strm=stdin) : Stream (strm) {;}
00204
00205
00206
00207 bool openload (const char* filename = NULL);
00208
00209
00210 IStream& operator>> (int& i);
00211
00212
00213 IStream& operator>> (long& i);
00214
00215
00216 IStream& operator>> (char& i);
00217 IStream& operator>> (uchar& i) {return operator>> ((char&)i);}
00218
00219
00220 IStream& operator>> (float& i);
00221
00222
00223 IStream& operator>> (double& i);
00224
00225
00226
00227 IStream& read (char* p, int n);
00228
00229
00230 };
00231
00232 class TextStream {
00233 public:
00234 TextStream (String& str, int mode);
00235
00236 protected:
00237 private:
00238 };
00239
00240 #endif