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

📄 chk_cerr.cpp

📁 一个不错
💻 CPP
字号:
/* Copyright is licensed under GNU LGPL.                 by I.J.Wang 2003   Check Wy::cerr   Build: make chk_cerr   Note: Test data files should exist in the working directory         Files may be created in the working directory and unlinked*/#include "wyterminal.h"#include "wyregfile.h"#include "chk_data.h"#include <unistd.h>#include <iostream>#if WYBYTEFLOW_VERSION!=31#error Test code is for WYBYTEFLOW_VERSION 31#endif#if WYREGFILE_VERSION!=31#error Test code is for WYREGFILE_VERSION 31#endif#if WYCHRFILE_VERSION!=31#error Test code is for WYCHRFILE_VERSION 31#endif#if WYTERMINAL_VERSION!=31#error Test code is for WYTERMINAL_VERSION 31#endif//// Assert f1,f2 the same systerm file//static void assert_same_sysf(const WyByteFlow& f1,const WyByteFlow& f2){ if(f1.is_default()&&f2.is_default()) {   return; } WyRet r; WyFileStat stt1,stt2; if((r=f1.stat(stt1))!=Ok) {   WY_THROW( WyRet() ); } if((r=f2.stat(stt2))!=Ok) {   WY_THROW( WyRet() ); } if(stt1.sf_ino()!=stt2.sf_ino()) {   WY_THROW( WyRet() ); } if(stt1.sf_dev()!=stt2.sf_dev()) {   WY_THROW( WyRet() ); }};#define CHK_SAME_SYSF(p1,p2)\    try { assert_same_sysf(p1,p2); } catch(...) { throw; }//// Setup the test //static void setup_test(void){};//// Undo setup_test//static void close_test(void){};static void t1(void){ WyRegFile TFile("chk_cerr.cpp",O_RDONLY); WyRet r; class RAID {      WyByteFlow _org;   public:     RAID(const WyByteFlow& src) : _org(src) {        if(_org.wy_is_std_fd()==true) {          WY_THROW( WyRet() );        }     };     ~RAID() {        Wy::cout.reset(_org);     };     const WyByteFlow& sysf(void) const { return _org; }; } rrid(Wy::cerr); CHK_SAME_SYSF(Wy::cerr,rrid.sysf()); // reset(const WyByteFlow&) if((r=Wy::cerr.reset(static_cast<const WyByteFlow&>(TFile)))!=Ok) {   WY_THROW(r); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) {   WY_THROW( WyRet() ); } CHK_SAME_SYSF(Wy::cerr,TFile); if(Wy::cerr.wy_is_std_fd()==false) {   WY_THROW( WyRet() ); }/* if(Wy::cerr.reset(WyFileHandle(STDERR_FILENO))!=Ok) {   WY_THROW(r); } CHK_SAME_SYSF(Wy::cerr,TFile);  // reset(WyFileHandle) if((r=Wy::cerr.reset(TFile.fh()))!=Ok) {   WY_THROW(r); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) {   WY_THROW( WyRet() ); } CHK_SAME_SYSF(Wy::cerr,TFile); */ // recover Wy::cerr if(Wy::cerr.is_default()==true) {   WY_THROW( WyRet() ); } if((r=Wy::cerr.reset(rrid.sysf()))!=Ok) {   WY_THROW(r); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) {   WY_THROW( WyRet() ); } CHK_SAME_SYSF(Wy::cerr,rrid.sysf());  // _swap if((r=Wy::cerr._swap(TFile))!=Wym_EBADTYPE) {   WY_THROW(r); } // _alloc if((Wy::cerr._alloc(r))!=NULL) {   WY_THROW( WyRet() ); } if(r!=Wym_ENOSYS) {   WY_THROW(r); }};// chk reset()//static void t_last(void){ class RAID {     const WyByteFlow _org_std;   public:     RAID() : _org_std(Wy::cerr) {};     ~RAID() {        ::dup2(_org_std.wy_fd(),STDERR_FILENO);      }; } not_use_me; const WyRegFile TFile("chk_cerr.cpp",O_RDONLY); WyByteFlow& STDOBJ(Wy::cerr); WyRet r; if((r=STDOBJ.reset(TFile))!=Ok) {   WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); if((r=STDOBJ.reset(TFile.fh()))!=Ok) {   WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); // chk error if((r=STDOBJ.reset(WyFileHandle()))!=Wym_EBADF) {   WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); if((r=STDOBJ.reset(WyByteFlow()))!=Wym_EBADF) {   WY_THROW(r); } CHK_SAME_SYSF(STDOBJ,TFile); try {   STDOBJ.reset();   WY_THROW( WyRet() ); } catch(const WyByteFlow::Reply& e) {   WY_THROW( WyRet(e) ); } catch(const WyRet& e) {   if(e!=Wym_EBADF) {     WY_THROW( WyRet(e) );   } }; CHK_SAME_SYSF(STDOBJ,TFile);};//// Write stdout as a regular file//static void t_cerr_reg(void){  // std::cerr is being testing, use std::cout for message  std::cout<< "Wy::cerr is a regular file\n" << std::flush;  WyRet r;  WyRegFile regf;  if((r=regf.reset(Wy::cerr.fh()))!=Ok) {     WY_THROW(r);  }  // write stdout file  const char buf[]="\"This string is sent to Wy::cerr(reg)\"\n";  size_t n_wr;  if((r=regf.write(buf,sizeof(buf),n_wr))!=Ok) {    WY_THROW(r);  }  if(n_wr!=sizeof(buf)) {    WY_THROW( WyRet() );  }  if((r=regf.fdatasync())!=Ok) {    WY_THROW(r);  }};//// Read stdout as a character file//static void t_cerr_chr(void){   // std::cerr is being testing, use std::cout for message   std::cout << "Wy::cerr is a character file\n";   WyRet r;   WyChrFile chrf;   if((r=chrf.reset(Wy::cerr.fh()))!=Ok) {     WY_THROW(r);   }   // Write   const char buf[]="\"This string is sent to Wy::cerr(chr)\"\n";   size_t n_wr;   if((r=chrf.write(buf,sizeof(buf),n_wr))!=Ok) {     WY_THROW(r);   }   if(n_wr!=sizeof(buf)) {      WY_THROW( WyRet() );   }};//// Check Wy::stdout//static void t_cerr(void){ WyRet r; // startup condition check if(Wy::cerr.is_default()) {   WY_THROW( WyRet() ); } if(Wy::cerr.fh().fd()!=STDERR_FILENO) {   WY_THROW( WyRet() ); } // stat WyFileStat stt; if((r=Wy::cerr.stat(stt))!=Ok) {   WY_THROW(r); } if(stt.is_chr()) {   t_cerr_chr();   return; } if(stt.is_reg()) {   t_cerr_reg();   return; } WY_THROW( WyRet() );  // neither chr nor reg file};static void t_exception(void){ // // Test copy constructor exception // try { } catch(...) {   throw; }; // // Test destructor exception // { }};static WyStr chdr("+---------------+\n"                  "| main() caught:|\n"                  "+---------------+\n");int main(void) throw()try { try {   // std::cerr is being testing, use std::cout for message   std::cout << "Checking Wy::cerr ...\n";   setup_test();   t1();   t_cerr();   t_exception();   close_test();   t_last();   // std::cerr is being testing, use std::cout for message   std::cout << "Checked Ok\n"; } catch(...) {   close_test();   throw; } return(0);}// Using cout for cerr may have been damaged//catch(const WyRet& e) { std::cout << chdr.c_str() << Wy::wrd(e).c_str() << std::endl; return(-1);}catch(const std::exception& e) { std::cout << chdr.c_str() << "std::exception" << std::endl; return(-1);}catch(...) { std::cout << chdr.c_str() << "unknown unwind" << std::endl; return(-1);};

⌨️ 快捷键说明

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