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

📄 stdiostorage.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
字号:
// Copyright (c) 1994, 1995 James Clark// See the file COPYING for copying permission.#ifdef __GNUG__#pragma implementation#endif#include "splib.h"#include "StdioStorage.h"#include "Message.h"#include "types.h"#include "ErrnoMessageArg.h"#include "StringOf.h"#include "StringC.h"#include "CodingSystem.h"#include "StdioStorageMessages.h"#include <stdio.h>#include <string.h>#include <stddef.h>#include <errno.h>#ifndef SEEK_SET#define SEEK_SET 0#endif#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifclass StdioStorageObject : public StorageObject {public:  StdioStorageObject(FILE *fp, const StringC &filename);  ~StdioStorageObject();  Boolean read(char *buf, size_t bufSize, Messenger &mgr, size_t &nread);  Boolean rewind(Messenger &mgr);  size_t getBlockSize() const;private:  enum ErrorIndex {    invalidErrorIndex,    fopenFailed,    readError,    seekError  };  void error(Messenger &mgr, const MessageType2 &, int err);  FILE *fp_;  StringC filename_;  String<char> filenameBytes_;};StdioStorageManager::StdioStorageManager(const char *type,					 const CharsetInfo *filenameCharset,					 const OutputCodingSystem *filenameCodingSystem): IdStorageManager(filenameCharset),  type_(type),  filenameCodingSystem_(filenameCodingSystem){}StorageObject *StdioStorageManager::makeStorageObject(const StringC &str,						      const StringC &,						      Boolean,						      Boolean,						      Messenger &mgr,						      StringC &filename){  filename = str;  String<char> filenameBytes = filenameCodingSystem_->convertOut(filename);  errno = 0;  FILE *fp = fopen(filenameBytes.data(), "r");  if (!fp) {    ParentLocationMessenger(mgr).message(StdioStorageMessages::openFailed,					 StringMessageArg(filename),					 ErrnoMessageArg(errno));    return 0;  }  return new StdioStorageObject(fp, filename);}const char *StdioStorageManager::type() const{  return type_;}StdioStorageObject::StdioStorageObject(FILE *fp, const StringC &filename): fp_(fp), filename_(filename){}StdioStorageObject::~StdioStorageObject(){  if (fp_) {    fclose(fp_);    fp_ = 0;  }}Boolean StdioStorageObject::rewind(Messenger &mgr){  if (fp_) {    errno = 0;    if (fseek(fp_, 0L, SEEK_SET) < 0) {      error(mgr, StdioStorageMessages::seekFailed, errno);      return 0;    }    return 1;  }  return 1;}size_t StdioStorageObject::getBlockSize() const{  return BUFSIZ;}Boolean StdioStorageObject::read(char *buf, size_t bufSize, Messenger &mgr,				 size_t &nread){  if (!fp_)    return 0;  errno = 0;  size_t n = 0;  FILE *fp = fp_;  while (n < bufSize) {    int c = getc(fp);    if (c == EOF) {      if (ferror(fp)) {	error(mgr, StdioStorageMessages::readFailed, errno);	(void)fclose(fp);	return 0;      }      fclose(fp);      fp_ = 0;      break;    }    buf[n++] = c;  }  nread = n;  return n > 0;}void StdioStorageObject::error(Messenger &mgr,			       const MessageType2 &msg,			       int err){  ParentLocationMessenger(mgr).message(msg,				       StringMessageArg(filename_),				       ErrnoMessageArg(err));}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

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