⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pstreams.h

📁 PTypes (C++ Portable Types Library) is a simple alternative to the STL that includes multithreading
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * *  C++ Portable Types Library (PTypes) *  Version 1.7.5   Released 9-Mar-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#endifPTYPES_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 ipsocketconst 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;//// 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();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -