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

📄 poutstm.cxx

📁 PTypes (C++ Portable Types Library) is a simple alternative to the STL that includes multithreading
💻 CXX
字号:
/* * *  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/ * */#include <string.h>#ifdef WIN32#  include <windows.h>#else#  include <unistd.h>#endif#include "pstreams.h"PTYPES_BEGINoutstm::outstm(bool iflusheol, int ibufsize)    : iobase(ibufsize), flusheol(iflusheol) {}outstm::~outstm() {}int outstm::classid(){    return CLASS_OUTSTM;}int outstm::dorawwrite(const char* buf, int count){    if (handle == invhandle)	return -1;#ifdef WIN32    unsigned long ret;    if (!WriteFile(HANDLE(handle), buf, count, &ret, nil))     {        error(uerrno(), "Couldn't write");        ret = uint(-1);    }#else    int ret;    if ((ret = ::write(handle, buf, count)) < 0)        error(uerrno(), "Couldn't write");#endif    return ret;}int outstm::rawwrite(const char* buf, int count) {    if (!active)        errstminactive();    try     {        int ret = dorawwrite(buf, count);        if (ret < 0)            ret = 0;        else            abspos += ret;        chstat(IO_WRITING);        if (ret < count)         {            eof = true;            chstat(IO_EOF);        }        return ret;    }    catch (estream*)     {        eof = true;        chstat(IO_EOF);        throw;    }}void outstm::bufvalidate() {    if (!active)        errstminactive();    if (bufend > 0)        rawwrite(bufdata, bufend);    bufclear();}int outstm::seek(int newpos, ioseekmode mode) {    if (bufsize != 0 && mode != IO_END)     {        int pos;        if (mode == IO_BEGIN)            pos = newpos;        else            pos = tell() + newpos;        pos -= abspos;        if (pos >= 0 && pos <= bufend)         {            bufpos = pos;            eof = false;            return tell();        }    }    return iobase::seek(newpos, mode);}bool outstm::canwrite() {    if (bufsize > 0 && bufpos >= bufsize)     {        bufvalidate();        return bufend < bufsize;    }    else        return true;}void outstm::flush() {    if (bufsize > 0 && stmerrno == 0)        bufvalidate();}void outstm::put(char c) {    if (!active)        errstminactive();    if (bufsize == 0)        rawwrite(&c, 1);    else if (canwrite())     {        bufdata[bufpos] = c;            bufadvance(1);        if (c == 10 && flusheol)            flush();    }}int outstm::write(const void* buf, int count) {    if (!active)        errstminactive();    int ret = 0;    if (bufsize == 0)        ret = rawwrite(pconst(buf), count);    else     {        while (count > 0 && canwrite())         {            int n = imin(count, bufsize - bufpos);            memcpy(bufdata + bufpos, buf, n);            ret += n;            count -= n;            buf = pconst(buf) + n;            bufadvance(n);        }    }    return ret;}void outstm::put(const char* str) {    if (str != nil)        write(str, hstrlen(str));}void outstm::put(const string& str) {    write(pconst(str), length(str));}void outstm::putline(const char* s) {    put(s);    puteol();}void outstm::putline(const string& s) {    put(s);    puteol();}void outstm::puteol() {#ifdef WIN32    put(13);#endif    put(10);}PTYPES_END

⌨️ 快捷键说明

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