📄 ck_sysfile.cpp
字号:
/* Copyright is licensed under GNU LGPL. by I.J.Wang 2005*/#include "wysysfile.h"#include "wy_atdestroy.h"#include "wy__cfunc.h"#include <iostream>#if WYSYSFILE_VERSION!=31#error Test code is for WYSYSFILE_VERSION 31#endifvoid ck_sysfile(void);#ifdef WY_DEBUGstatic int initial_fdcnt=0;#endif// Assert sysf is default//static void assert_default(const WySysFile& sysf){ WyRet r; if(sysf.is_default()==false) { WY_THROW( WyRet() ); } if(sysf.fh().is_default()==false) { WY_THROW( WyRet() ); } // chk fh() if(sysf.fh()!=WyFileHandle()) { WY_THROW( WyRet() ); } // stat { WyFileStat stt; if((r=sysf.stat(stt))!=Wym_EBADF) { WY_THROW(r); } if(stt.is_default()==false) { WY_THROW( WyRet() ); } } if(sysf.wy_fd()!=WY__DEFAULT_FD) { WY_THROW( WyRet() ); } if(sysf.ftype()!=0) { WY_THROW( WyRet() ); }};static void assert_not_default(const WySysFile& sysf){ WyRet r; if(sysf.is_default()) { WY_THROW( WyRet() ); } if(sysf.fh().is_default()) { WY_THROW( WyRet() ); } // chk fh() if(sysf.fh()==WyFileHandle()) { WY_THROW( WyRet() ); } // stat { WyFileStat stt; if((r=sysf.stat(stt))!=Ok) { WY_THROW(r); } if(stt.is_default()) { WY_THROW( WyRet() ); } } if(sysf.wy_fd()==WY__DEFAULT_FD) { WY_THROW( WyRet() ); } if(sysf.ftype()==0) { WY_THROW( WyRet() ); }};// Assert f1,f2 refers to the same systerm file//template<typename Dev1, typename Dev2>static void assert_same_ftype(const Dev1&,const Dev2&) {};static void assert_same_ftype(const WySysFile& f1,const WySysFile& f2) { if(f1.ftype()!=f2.ftype()) { WY_THROW( WyRet() ); }};template<typename Dev1, typename Dev2>static void assert_same_sysf(const Dev1& f1,const Dev2& f2){ assert_same_ftype(f1,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_DEFAULT(p)\ try { assert_default(p); } catch(...) { WY_THROW( WyRet()); }#define CHK_NOT_DEFAULT(p)\ try { assert_not_default(p); } catch(...) { WY_THROW( WyRet()); }#define CHK_SAME_SYSF(p1,p2)\ try { assert_same_sysf(p1,p2); } catch(...) { WY_THROW( WyRet()); }static void exaust_cpy_ctor(const WySysFile& sysf){ WySysFile tmp(sysf); exaust_cpy_ctor(sysf); // recursive until failure};static WyRet exaust_reset(const WySysFile& sysf) throw(){ WySysFile tmp; WyRet r( tmp.reset(sysf) ); if(r!=Ok) { WY_RETURN(r); } return exaust_reset(sysf); // recursive until failure};static WyRet exaust_reset(WyFileHandle fh) throw(){ WySysFile tmp; WyRet r( tmp.reset(fh) ); if(r!=Ok) { WY_RETURN(r); } return exaust_reset(fh); // recursive until failure};/* stack may overflow firststatic void exaust_allocconst WySysFile& sysf) throw(){ WySysFile* p=sysf._alloc); if(p==0) { return; } Wy_AtDestroy<void,WySysFile*> rrid(Wy::_delete_one,p); exaust_allocsysf);}*/// chk stat//static void ck_0(void){ WyFileHandle tfh(STDIN_FILENO); // use STDIN_FILENO struct ::stat stt0; if(::fstat(tfh.fd(),&stt0)==-1) { WY_THROW( WyRet(WyReply(errno)) ); } WyRet r; WyFileStat stt1; if((r=WySysFile(tfh).stat(stt1))!=Ok) { WY_THROW( WyRet() ); } if((stt0.st_dev!=stt1.sf_dev())|| (stt0.st_ino!=stt1.sf_ino())|| (stt0.st_mode!=stt1.sf_mode())|| (stt0.st_nlink!=stt1.sf_nlink())|| (stt0.st_uid!=stt1.sf_uid())|| (stt0.st_gid!=stt1.sf_gid())|| (stt0.st_rdev!=stt1.sf_rdev())|| (stt0.st_size!=stt1.sf_size())|| (stt0.st_blksize!=stt1.sf_blksize())|| (stt0.st_blocks!=stt1.sf_blocks())|| (stt0.st_atime!=stt1.sf_atime())|| (stt0.st_mtime!=stt1.sf_mtime())|| (stt0.st_ctime!=stt1.sf_ctime())) { WY_THROW( WyRet() ); }};void ck_sysfile_1(void) // global name to access WySysFile protected member{ const WyFileHandle HSrc0(STDIN_FILENO); const WyFileHandle HSrc1(STDOUT_FILENO); WyRet r; #ifdef WY_DEBUG const int ObjCnt=WySysFile::wydbg_get_objcnt(); #endif WySysFile tmp; CHK_DEFAULT(tmp); #ifdef WY_DEBUG if(WySysFile::wydbg_get_objcnt()!=ObjCnt+1) { WY_THROW( WyRet() ); } #endif try { // ctor() { WySysFile t0; WySysFile t1(t0); CHK_DEFAULT(t0); CHK_DEFAULT(t1); if((r=t0.reset())!=Ok) { WY_THROW(r); } if((r=t1.reset())!=Ok) { WY_THROW(r); } CHK_DEFAULT(t0); CHK_DEFAULT(t1); #ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt) { WY_THROW( WyRet() ); } #endif }#ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt) { WY_THROW( WyRet() ); }#endif // ctor(WyFileHanlde)/(const WySysFile&) { WySysFile tmp0(HSrc0); CHK_NOT_DEFAULT(tmp0); CHK_SAME_SYSF(tmp0,HSrc0); if(tmp0.fh()==HSrc0) { WY_THROW( WyRet() ); } WySysFile tmp1(HSrc1); CHK_NOT_DEFAULT(tmp1); CHK_SAME_SYSF(tmp1,HSrc1); if(tmp1.fh()==HSrc1) { WY_THROW( WyRet() ); } WySysFile ctmp0(tmp0); CHK_NOT_DEFAULT(ctmp0); CHK_SAME_SYSF(tmp0,ctmp0); if(tmp0.fh()==ctmp0.fh()) { WY_THROW( WyRet() ); } WySysFile ctmp1(tmp1); CHK_NOT_DEFAULT(ctmp1); CHK_SAME_SYSF(tmp1,ctmp1); if(tmp1.fh()==ctmp1.fh()) { WY_THROW( WyRet() ); } WyFileHandle H0; WySysFile tmp9(H0); CHK_DEFAULT(tmp9); }#ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt) { WY_THROW( WyRet() ); }#endif // ctor(const char*,int)/ctor(const WyStr&,int) { WySysFile tmp1(__FILE__,O_RDONLY); WySysFile tmp2(WyStr(__FILE__),O_RDONLY); CHK_NOT_DEFAULT(tmp1); CHK_NOT_DEFAULT(tmp2); CHK_SAME_SYSF(tmp1,tmp2); #ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt+2) { WY_THROW( WyRet() ); } #endif // convenient chk reset if((r=tmp1.reset(tmp1))!=Ok) { // self-ops WY_THROW( WyRet(r) ); } #ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt+2) { WY_THROW( WyRet() ); } #endif CHK_SAME_SYSF(tmp1,tmp2); if((r=tmp1.reset())!=Ok) { WY_THROW( WyRet(r) ); } #ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt+1) { WY_THROW( WyRet() ); } #endif }#ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt) { WY_THROW( WyRet() ); }#endif // chk move ctor { char raw_buf[2*sizeof(WySysFile)]; ::memset(raw_buf,0,sizeof(raw_buf)); WySysFile * const p1( reinterpret_cast<WySysFile*>(raw_buf) ); WySysFile * const p2(p1+1); new(p1) WySysFile(__FILE__,O_RDONLY); #ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt+1) { WY_THROW( WyRet() ); } #endif { try { CHK_NOT_DEFAULT(*p1); } catch(...) { p1->~WySysFile(); throw; }; } // move *p1 to p2 WyFileHandle ofh( p1->fh() ); mode_t oft( p1->ftype() ); if(oft!=S_IFREG) { WY_THROW( WyRet() ); } try { new(p2) WySysFile(*p1,Wy::ByMove); } catch(...) { p1->~WySysFile(); throw; }; #ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt+1) { WY_THROW( WyRet() ); } #endif WyFileHandle nfh( p2->fh() ); mode_t nft( p2->ftype() ); p2->~WySysFile(); if(nfh!=ofh) { WY_THROW( WyRet() ); } if(nft!=oft) { WY_THROW( WyRet() ); } }#ifdef WY_DEBUG if(wydbg_get_fdcnt()!=initial_fdcnt) { WY_THROW( WyRet() ); }#endif // chk reset()/reset(WyFileHandle)/reset(const SysFile&) { WySysFile tmp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -