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

📄 outputbytestream.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
字号:
// Copyright (c) 1997 James Clark// See the file COPYING for copying permission.#include "splib.h"#include "OutputByteStream.h"#include <sys/types.h>#ifdef SP_INCLUDE_IO_H#include <io.h>		// for open, fstat, lseek, read prototypes#endif#ifdef SP_INCLUDE_UNISTD_H#include <unistd.h>#endif#ifdef SP_INCLUDE_OSFCN_H#include <osfcn.h>#endif#include <fcntl.h>#include <sys/stat.h>#include <errno.h>#include <stdio.h>#ifdef SP_WIDE_SYSTEM#define STRICT#include <windows.h>#endif#ifndef O_CREAT#ifdef _O_CREAT#define O_CREAT _O_CREAT#endif#endif#ifndef O_WRONLY#ifdef _O_WRONLY#define O_WRONLY _O_WRONLY#endif#endif#ifndef O_TRUNC#ifdef _O_TRUNC#define O_TRUNC _O_TRUNC#endif#endif#ifndef O_BINARY#ifdef _O_BINARY#define O_BINARY _O_BINARY#else#define O_BINARY 0#endif#endif#ifndef S_IRUSR#if defined(S_IREAD)#define S_IRUSR S_IREAD#elif defined(_S_IREAD)#define S_IRUSR _S_IREAD#else#define S_IRUSR 0400#endif#endif#ifndef S_IWUSR#if defined(S_IWRITE)#define S_IWUSR S_IWRITE#elif defined(_S_IWRITE)#define S_IWUSR _S_IWRITE#else#define S_IWUSR 0200#endif#endif#ifndef S_IRGRP#if defined(S_IREAD)#define S_IRGRP S_IREAD#elif defined(_S_IREAD)#define S_IRGRP _S_IREAD#else#define S_IRGRP 0040#endif#endif#ifndef S_IWGRP#if defined(S_IWRITE)#define S_IWGRP S_IWRITE#elif defined(_S_IWRITE)#define S_IWGRP _S_IWRITE#else#define S_IWGRP 0020#endif#endif#ifndef S_IROTH#if defined(S_IREAD)#define S_IROTH S_IREAD#elif defined(_S_IREAD)#define S_IROTH _S_IREAD#else#define S_IROTH 0004#endif#endif#ifndef S_IWOTH#if defined(S_IWRITE)#define S_IWOTH S_IWRITE#elif defined(_S_IWRITE)#define S_IWOTH _S_IWRITE#else#define S_IWOTH 0002#endif#endif#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifconst int openFlags = O_CREAT|O_WRONLY|O_TRUNC|O_BINARY;const int protMode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;const int bufSize = 8192;OutputByteStream::OutputByteStream(): ptr_(0), end_(0){}OutputByteStream::~OutputByteStream(){}void OutputByteStream::sputn(const char *s, size_t n){  for (; n > 0; n--, s++)    sputc(*s);}OutputByteStream &OutputByteStream::operator<<(long n){  char buf[32];  sprintf(buf, "%ld", n);  return *this << buf;}OutputByteStream &OutputByteStream::operator<<(unsigned long n){  char buf[32];  sprintf(buf, "%lu", n);  return *this << buf;}OutputByteStream &OutputByteStream::operator<<(const char *s){  while (*s)    sputc(*s++);  return *this;}StrOutputByteStream::StrOutputByteStream(){}void StrOutputByteStream::extractString(String<char> &str){  if (ptr_)    buf_.resize(ptr_ - &buf_[0]);  str.resize(0);  buf_.swap(str);  ptr_ = end_ = 0;}void StrOutputByteStream::flush(){}void StrOutputByteStream::flushBuf(char c){  if (!ptr_) {    buf_.resize(16);    ptr_ = &buf_[0];  }  else {    size_t i = ptr_ - &buf_[0];    buf_.resize(buf_.size()*2);    ptr_ = &buf_[0] + i;  }  end_ = &buf_[0] + buf_.size();  *ptr_++ = c;}FileOutputByteStream::FileOutputByteStream(): fd_(-1){}FileOutputByteStream::FileOutputByteStream(int fd, Boolean closeFd): fd_(-1){  attach(fd, closeFd);}FileOutputByteStream::~FileOutputByteStream(){  close();}#ifdef SP_WIDE_SYSTEMBoolean FileOutputByteStream::open(const wchar_t *filename){  int fd = _wopen(filename, openFlags, protMode);  if (fd >= 0)    return attach(fd);  // _wopen will always fail on Windows 95  String<char> buf;  int len = WideCharToMultiByte(CP_ACP, 0, filename, -1, 0, 0, 0, 0);  buf.resize(len + 1);  WideCharToMultiByte(CP_ACP, 0, filename, -1, buf.begin(), len, 0, 0);  buf[len] = '\0';  return attach(::open(buf.data(), openFlags, protMode));}#else /* not SP_WIDE_SYSTEM */Boolean FileOutputByteStream::open(const char *filename){  return attach(::open(filename, openFlags, protMode));}#endif /* not SP_WIDE_SYSTEM */Boolean FileOutputByteStream::attach(int fd, Boolean closeFd){  close();  fd_ = fd;  closeFd_ = closeFd;  return fd_ >= 0;}Boolean FileOutputByteStream::close(){  if (fd_ < 0)    return 0;  flush();  int fd = fd_;  fd_ = -1;  if (!closeFd_)    return 1;  return ::close(fd) == 0;}void FileOutputByteStream::flush(){  if (!buf_.size()) {    if (fd_ < 0)      return;    buf_.resize(bufSize);    ptr_ = &buf_[0];    end_ = ptr_ + buf_.size();  }  size_t n = ptr_ - &buf_[0];  const char *s = buf_.data();  while (n > 0) {    int nw = ::write(fd_, s, n);    if (nw < 0)      break;    n -= nw;    s += nw;  }  ptr_ = &buf_[0];}void FileOutputByteStream::flushBuf(char c){  flush();  *ptr_++ = c;}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

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