📄 pstreams.h
字号:
/*
*
* C++ Portable Types Library (PTypes)
* Version 1.8.3 Released 25-Aug-2003
*
* Copyright (c) 2001, 2002, 2003 Hovik Melikyan
*
* http://www.melikyan.com/ptypes/
* http://ptypes.sourceforge.net/
*
*/
#ifndef __PSTREAMS_H__
#define __PSTREAMS_H__
#ifndef __PPORT_H__
#include "pport.h"
#endif
#ifndef __PTYPES_H__
#include "ptypes.h"
#endif
#include <stdarg.h>
#include <errno.h>
#ifdef WIN32
# define _WINSOCKAPI_ // prevent inclusion of winsock.h, because we need winsock2.h
# include "windows.h" // for OVERLAPPED
#endif
PTYPES_BEGIN
#ifdef _MSC_VER
#pragma pack(push, 4)
#endif
// -------------------------------------------------------------------- //
// --- abstract stream i/o classes ----------------------------------- //
// -------------------------------------------------------------------- //
//
// stream exception class
//
class iobase;
class ptpublic estream: public exceptobj
{
protected:
int code;
iobase* errstm;
public:
estream(iobase* ierrstm, int icode, const char* imsg);
estream(iobase* ierrstm, int icode, const string& imsg);
virtual ~estream();
int get_code() { return code; }
iobase* get_errstm() { return errstm; }
};
typedef void (*iostatusevent)(iobase* sender, int code);
ptpublic int unixerrno();
ptpublic const char* unixerrmsg(int code);
// status codes: compatible with WinInet API
// additional status codes are defined in pinet.h for ipsocket
const int IO_CREATED = 1;
const int IO_OPENING = 5;
const int IO_OPENED = 35;
const int IO_READING = 37;
const int IO_WRITING = 38;
const int IO_EOF = 45;
const int IO_CLOSING = 250;
const int IO_CLOSED = 253;
//
// iobase
//
enum ioseekmode
{
IO_BEGIN,
IO_CURRENT,
IO_END
};
const int invhandle = -1;
class ptpublic iobase: public component
{
friend class fdxoutstm;
protected:
bool active; // active status, changed by open() and close()
bool cancelled; // the stream was cancelled by cancel()
bool eof; // end of file reached, only for input streams
int handle; // used in many derivative classes
int abspos; // physical stream position
int bufsize; // buffer size, can be changed only when not active
char* bufdata; // internal: allocated buffer data
int bufpos; // internal: current position
int bufend; // internal: current data size in the buffer
int stmerrno; // UNIX-compatible error numbers, see comments in piobase.cxx
string deferrormsg; // internal: default error message when an exception is thrown,
int status; // stream status code, see IO_xxx constants above
iostatusevent onstatus; // user-defined status change handler
virtual void bufalloc();
virtual void buffree();
void bufclear() { bufpos = 0; bufend = 0; }
void errstminactive();
void errbufrequired();
virtual void doopen() = 0;
virtual void doclose();
virtual int doseek(int newpos, ioseekmode mode);
virtual void chstat(int newstat);
virtual int uerrno();
virtual const char* uerrmsg(int code);
public:
iobase(int ibufsize = -1);
virtual ~iobase();
void open();
void close();
void cancel();
int seek(int newpos, ioseekmode mode = IO_BEGIN);
void error(int code, const char* defmsg);
virtual void flush();
virtual string get_errormsg();
virtual string get_errstmname();
virtual string get_streamname() = 0;
bool get_active() { return active; }
void set_active(bool newval);
bool get_cancelled() { return cancelled; }
void set_cancelled(bool newval) { cancelled = newval; }
int get_handle() { return handle; }
int get_bufsize() { return bufsize; }
void set_bufsize(int newval);
int get_stmerrno() { return stmerrno; }
int get_status() { return status; }
iostatusevent get_onstatus() { return onstatus; }
void set_onstatus(iostatusevent newval) { onstatus = newval; }
};
typedef iobase* piobase;
ptpublic extern int defbufsize;
ptpublic extern int stmbalance;
//
// instm - abstract input stream
//
const char eofchar = 0;
class ptpublic instm: public iobase
{
protected:
virtual int dorawread(char* buf, int count);
int rawread(char* buf, int count);
virtual void bufvalidate();
void skipeol();
public:
instm(int ibufsize = -1);
virtual ~instm();
virtual int classid();
bool get_eof();
void set_eof(bool ieof) { eof = ieof; }
bool get_eol();
int get_dataavail();
char preview();
char get();
void putback();
string token(const cset& chars);
string token(const cset& chars, int limit);
int token(const cset& chars, char* buf, int size);
string line();
string line(int limit);
int line(char* buf, int size, bool eateol = true);
int read(void* buf, int count);
int skip(int count);
int skiptoken(const cset& chars);
void skipline(bool eateol = true);
int tell();
int seek(int newpos, ioseekmode mode = IO_BEGIN);
};
typedef instm* pinstm;
//
// outstm - abstract output stream
//
class ptpublic outstm: public iobase
{
protected:
bool flusheol;
virtual int dorawwrite(const char* buf, int count);
int rawwrite(const char* buf, int count);
virtual void bufvalidate();
void bufadvance(int delta)
{ bufpos += delta; if (bufend < bufpos) bufend = bufpos; }
bool canwrite();
public:
outstm(bool iflusheol = false, int ibufsize = -1);
virtual ~outstm();
virtual int classid();
bool get_flusheol() { return flusheol; }
void set_flusheol(bool newval) { flusheol = newval; }
virtual void flush();
bool get_eof() { return eof; }
void put(char c);
void put(const char* str);
void put(const string& str);
void vputf(const char* fmt, va_list);
void putf(const char* fmt, ...);
void putline(const char* str);
void putline(const string& str);
void puteol();
int write(const void* buf, int count);
int tell() { return abspos + bufpos; }
int seek(int newpos, ioseekmode mode = IO_BEGIN);
};
typedef outstm* poutstm;
// %t and %T formats
extern char* shorttimefmt; // "%d-%b-%Y %X"
extern char* longtimefmt; // "%a %b %d %X %Y"
//
// internal class used in fdxstm
//
class ptpublic fdxoutstm: public outstm
{
friend class fdxstm;
protected:
fdxstm* in;
virtual void chstat(int newstat);
virtual int uerrno();
virtual const char* uerrmsg(int code);
virtual void doopen();
virtual void doclose();
virtual int dorawwrite(const char* buf, int count);
public:
fdxoutstm(int ibufsize, fdxstm* iin);
virtual ~fdxoutstm();
virtual string get_streamname();
};
typedef fdxstm* pfdxstm;
//
// fdxstm: abstract full-duplex stream (for sockets and pipes)
//
class ptpublic fdxstm: public instm
{
friend class fdxoutstm;
protected:
fdxoutstm out;
virtual int dorawwrite(const char* buf, int count);
public:
fdxstm(int ibufsize = -1);
virtual ~fdxstm();
void set_bufsize(int newval); // sets both input and output buffer sizes
void open(); // rewritten to pass the call to the output stream too
void close();
void cancel();
virtual void flush();
int tell(bool); // true for input and false for output
// output interface: pretend this class is derived both
// from instm and outstm. actually we can't use multiple
// inheritance here, since this is a full-duplex stream,
// hence everything must be duplicated for input and output
void putf(const char* fmt, ...);
void put(char c) { out.put(c); }
void put(const char* str) { out.put(str); }
void put(const string& str) { out.put(str); }
void putline(const char* str) { out.putline(str); }
void putline(const string& str) { out.putline(str); }
void puteol() { out.puteol(); }
int write(const void* buf, int count) { return out.write(buf, count); }
bool get_flusheol() { return out.get_flusheol(); }
void set_flusheol(bool newval) { out.set_flusheol(newval); }
operator outstm&() { return out; }
};
//
// abstract input filter class
//
class ptpublic infilter: public instm
{
protected:
instm* stm;
char* savebuf;
int savecount;
string postponed;
void copytobuf(string& s);
void copytobuf(pconst& buf, int& count);
bool copytobuf(char c);
virtual void freenotify(component* sender);
virtual void doopen();
virtual void doclose();
virtual int dorawread(char* buf, int count);
virtual void dofilter() = 0;
bool bufavail() { return savecount > 0; }
void post(const char* buf, int count);
void post(const char* s);
void post(char c);
virtual void post(string s);
public:
infilter(instm* istm, int ibufsize = -1);
virtual ~infilter();
virtual string get_errstmname();
instm* get_stm() { return stm; }
void set_stm(instm* stm);
};
//
// abstract output filter class
//
class ptpublic outfilter: public outstm
{
protected:
outstm* stm;
virtual void freenotify(component* sender);
virtual void doopen();
virtual void doclose();
public:
outfilter(outstm* istm, int ibufsize = -1);
virtual ~outfilter();
virtual string get_errstmname();
outstm* get_stm() { return stm; }
void set_stm(outstm* stm);
};
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -