📄 wyret.cpp
字号:
/* Copyright is licensed under GNU LGPL. by I.J.Wang 2003*/#define WYLIB_SOURCE#include "wyret.h"#include <cerrno>#include <cstring> // for strlen#include <pthread.h> // for mutex//-------------------------------------------------// Definition for Wy_RepInfo//// Note: Order of code is significant//-------------------------------------------------const Wy_RepInfo::RepCodeType Wy_RepInfo::_default_rcode=Wy::_default_errno;Wy_RepInfo::Wy_RepInfo(const char* cstr) WY__NOTHROW__ : _rcode(_default_rcode), _rstr(cstr){ if(cstr==NULL) { WY_TERMINATE(""); }};Wy_RepInfo::Wy_RepInfo(Wy_RepInfo::RepCodeType rc, const char* cstr) WY__NOTHROW__ : _rcode(rc), _rstr(cstr){ if(cstr==NULL) { WY_TERMINATE(""); }};Wy_RepInfo::RepCodeType Wy_RepInfo::c_repcode(void) const WY__NOTHROW__{ return _rcode; };const char* Wy_RepInfo::c_repstr(void) const WY__NOTHROW__{ return _rstr;};size_t Wy_RepInfo::get_reply(char* buf, size_t blen) const WY__NOTHROW__{ size_t slen( std::strlen(_rstr) ); if(buf==NULL) { return slen; } if(blen<slen) { slen=blen; } std::memcpy(buf,_rstr,slen); return slen; };//-------------------------------------------------// Definition for WyRet//// Note: Order of code is significant//-------------------------------------------------class Wy__ErrNo : public Wy_RepInfo { const char* _ap_str; // application reply string size_t _ap_len; // length of char's pointed by _ap_buf mutable ::pthread_mutex_t _mtx; // Hidden const Wy__ErrNo& operator =(const Wy__ErrNo&); bool operator ==(const Wy__ErrNo&); void* operator new(size_t); public: // [Syn] Construct object // // c_repcode() = en // c_repstr()= cstr // get_reply()= copy out cstr // Wy__ErrNo(Wy__ErrNoType en, const char* cstr) WY__NOTHROW__ : Wy_RepInfo(en,cstr), _ap_str(cstr), _ap_len(std::strlen(cstr)) { ::pthread_mutex_init(&_mtx,NULL); }; ~Wy__ErrNo() WY__NOTHROW__ { ::pthread_mutex_destroy(&_mtx); }; // Note: .Copy constructor is not defined. // .Compiler (g++) seems need to 'see' this declaration. // This may be from Standard requirement. // .Wy_RepInfo object is not supposed to be derived by copy // constructor // Wy__ErrNo(const Wy__ErrNo&) WY__NOTHROW__; // [Derived] // int c_repcode(void) const throw() // const char* c_repstr(void) const throw() // [Override] // size_t get_reply(char* buf, size_t blen) const WY__NOTHROW__ { if(::pthread_mutex_lock(&_mtx)!=0) { WY_TERMINATE(""); } if(buf==NULL) { const size_t rv(_ap_len); if(::pthread_mutex_unlock(&_mtx)!=0) { WY_TERMINATE(""); } return(rv); } const size_t slen( (blen<_ap_len)? blen:_ap_len); std::memcpy(buf,_ap_str,slen); if(::pthread_mutex_unlock(&_mtx)!=0) { WY_TERMINATE(""); } return slen; }; // [Override] // void set_reply(const char* str, size_t slen) WY__NOTHROW__ { if(::pthread_mutex_lock(&_mtx)!=0) { WY_TERMINATE(""); } _ap_str=str; _ap_len=slen; if(::pthread_mutex_unlock(&_mtx)!=0) { WY_TERMINATE(""); } };};// The object for default WyReply to refer tostatic Wy__ErrNo wye_default_repinfo(Wy::_default_errno,Wy::_default_repstr);//-------------------------------------------------// Definition for WyRet//// Note: Order of code is significant//-------------------------------------------------Wy_RepInfo* const WyReply::_default_ri_ptr=&wye_default_repinfo;// Wy__ErrNo object for errno//static Wy__ErrNo wye_tab[Wy::_max_errno+1]= { Wy__ErrNo( 0,"Success"), Wy__ErrNo( 1,"Operation not permitted"), Wy__ErrNo( 2,"No such file or directory"), Wy__ErrNo( 3,"No such process"), Wy__ErrNo( 4,"Interrupted system call"), Wy__ErrNo( 5,"Input/output error"), Wy__ErrNo( 6,"No such device or address"), Wy__ErrNo( 7,"Argument list too long"), Wy__ErrNo( 8,"Exec format error"), Wy__ErrNo( 9,"Bad file descriptor"), Wy__ErrNo( 10,"No child processes"), Wy__ErrNo( 11,"Resource temporarily unavailable"), Wy__ErrNo( 12,"Cannot allocate memory"), Wy__ErrNo( 13,"Permission denied"), Wy__ErrNo( 14,"Bad address"), Wy__ErrNo( 15,"Block device required"), Wy__ErrNo( 16,"Device or resource busy"), Wy__ErrNo( 17,"File exists"), Wy__ErrNo( 18,"Invalid cross-device link"), Wy__ErrNo( 19,"No such device"), Wy__ErrNo( 20,"Not a directory"), Wy__ErrNo( 21,"Is a directory"), Wy__ErrNo( 22,"Invalid argument"), Wy__ErrNo( 23,"Too many open files in system"), Wy__ErrNo( 24,"Too many open files"), Wy__ErrNo( 25,"Inappropriate ioctl for device"), Wy__ErrNo( 26,"Text file busy"), Wy__ErrNo( 27,"File too large"), Wy__ErrNo( 28,"No space left on device"), Wy__ErrNo( 29,"Illegal seek"), Wy__ErrNo( 30,"Read-only file system"), Wy__ErrNo( 31,"Too many links"), Wy__ErrNo( 32,"Broken pipe"), Wy__ErrNo( 33,"Numerical argument out of domain"), Wy__ErrNo( 34,"Numerical result out of range"), Wy__ErrNo( 35,"Resource deadlock would occur"), Wy__ErrNo( 36,"File name too long"), Wy__ErrNo( 37,"No locks available"), Wy__ErrNo( 38,"Function not implemented"), Wy__ErrNo( 39,"Directory not empty"), Wy__ErrNo( 40,"Too many levels of symbolic links"), Wy__ErrNo( 41,"Unknown error 41"), Wy__ErrNo( 42,"No message of desired type"), Wy__ErrNo( 43,"Identifier removed"), Wy__ErrNo( 44,"Channel number out of range"), Wy__ErrNo( 45,"Level 2 not synchronized"), Wy__ErrNo( 46,"Level 3 halted"), Wy__ErrNo( 47,"Level 3 reset"), Wy__ErrNo( 48,"Link number out of range"), Wy__ErrNo( 49,"Protocol driver not attached"), Wy__ErrNo( 50,"No CSI structure available"), Wy__ErrNo( 51,"Level 2 halted"), Wy__ErrNo( 52,"Invalid exchange"), Wy__ErrNo( 53,"Invalid request descriptor"), Wy__ErrNo( 54,"Exchange full"), Wy__ErrNo( 55,"No anode"), Wy__ErrNo( 56,"Invalid request code"), Wy__ErrNo( 57,"Invalid slot"), Wy__ErrNo( 58,"Unknown error 58"), Wy__ErrNo( 59,"Bad font file format"), Wy__ErrNo( 60,"Device not a stream"), Wy__ErrNo( 61,"No data available"), Wy__ErrNo( 62,"Timer expired"), Wy__ErrNo( 63,"Out of streams resources"), Wy__ErrNo( 64,"Machine is not on the network"), Wy__ErrNo( 65,"Package not installed"), Wy__ErrNo( 66,"Object is remote"), Wy__ErrNo( 67,"Link has been severed"), Wy__ErrNo( 68,"Advertise error"), Wy__ErrNo( 69,"Srmount error"), Wy__ErrNo( 70,"Communication error on send"), Wy__ErrNo( 71,"Protocol error"), Wy__ErrNo( 72,"Multihop attempted"), Wy__ErrNo( 73,"RFS specific error"), Wy__ErrNo( 74,"Bad message"), Wy__ErrNo( 75,"Value too large for defined data type"), Wy__ErrNo( 76,"Name not unique on network"), Wy__ErrNo( 77,"File descriptor in bad state"), Wy__ErrNo( 78,"Remote address changed"), Wy__ErrNo( 79,"Can not access a needed shared library"), Wy__ErrNo( 80,"Accessing a corrupted shared library"), Wy__ErrNo( 81,".lib section in a.out corrupted"), Wy__ErrNo( 82,"Attempting to link in too many shared libraries"), Wy__ErrNo( 83,"Cannot exec a shared library directly"), Wy__ErrNo( 84,"Illegal byte sequence"), Wy__ErrNo( 85,"Interrupted system call should be restarted"), Wy__ErrNo( 86,"Streams pipe error"), Wy__ErrNo( 87,"Too many users"),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -