📄 ck_num.cpp
字号:
/* Copyright is licensed under GNU LGPL. by I.J.Wang 2004 Build: ck_num.o*///#include "wystr.h"#include "wynum.h"#include <limits>#include <cstdlib>#include "wymath.h"#include <math.h> // for fabs#include <cstdio> // for sscanf#include <iostream>#if WYLIB_VERSION!=31#error Test code is for WYLIB_VERSION 31#endifextern void ck_strnum(void); // defined in ckn_strnum.cpptemplate <typename NumType>static void ck_uty(void){ WyRet r; // chk Wy::_strnum(...) { NumType tnn; const char s1[]="52"; const char* endptr; tnn=7; if((r=Wy::_strnum(tnn,0,"0",10))!=Ok) { WY_THROW(r); } if(tnn!=NumType(0)) { WY_THROW(r); } if((r=Wy::_strnum(tnn,NULL,WyCSeg("0",1),10))!=Ok) { WY_THROW(r); } if(tnn!=NumType(0)) { WY_THROW(r); } if((r=Wy::_strnum(tnn,&endptr,WyCSeg(s1,sizeof(s1)-1),16))!=Ok) { WY_THROW(r); } if(endptr-s1!=sizeof(s1)-1) { WY_THROW( WyRet() ); } if(tnn!=NumType(0x52)) { WY_THROW( WyRet() ); } if((r=Wy::_strnum(tnn,&endptr,WyCSeg(s1,sizeof(s1)-1),0))!=Ok) { WY_THROW(r); } if(endptr-s1!=sizeof(s1)-1) { WY_THROW( WyRet() ); } if(tnn!=NumType(52)) { WY_THROW( WyRet() ); } const char s2[]="0x041"; int radix; radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(s2,sizeof(s2)-1),radix))!=Ok) { WY_THROW(r); } if(endptr-s2!=sizeof(s2)-1) { WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } if(tnn!=NumType(0x41)) { WY_THROW( WyRet() ); } radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(s2+2,sizeof(s2)-3),radix))!=Ok) { WY_THROW(r); } if(endptr-s2!=sizeof(s2)-1) { WY_THROW( WyRet() ); } if(radix!=8) { WY_THROW( WyRet() ); } if(tnn!=NumType(041)) { WY_THROW( WyRet() ); } radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(s2,1),radix))!=Ok) { WY_THROW(r); } if(endptr-s2!=1) { WY_THROW( WyRet() ); } if(radix!=10) { WY_THROW( WyRet() ); } if(tnn!=NumType(0)) { WY_THROW( WyRet() ); } radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg("00"),radix))!=Ok) { WY_THROW(r); } if(radix!=8) { WY_THROW( WyRet() ); } if(tnn!=NumType(0)) { WY_THROW( WyRet() ); } radix=5; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(s2+2,sizeof(s2)-3),radix))!=Ok) { WY_THROW(r); } if(endptr-s2!=sizeof(s2)-1) { WY_THROW( WyRet() ); } if(radix!=5) { WY_THROW( WyRet() ); } if(tnn!=NumType(21)) { WY_THROW( WyRet() ); } if(std::numeric_limits<NumType>::is_signed) { const char ns1[]="-52"; if((r=Wy::_strnum(tnn,0,WyCSeg("-0",2),10))!=Ok) { WY_THROW(r); } if(tnn!=NumType(0)) { WY_THROW(r); } if((r=Wy::_strnum(tnn,&endptr,WyCSeg(ns1,sizeof(ns1)-1),10))!=Ok) { WY_THROW(r); } if(endptr-ns1!=sizeof(ns1)-1) { WY_THROW( WyRet() ); } if(tnn!=NumType(-52)) { WY_THROW( WyRet() ); } const char ns2[]="-0x041"; radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(ns2,sizeof(ns2)-1),radix))!=Ok) { WY_THROW(r); } if(endptr-ns2!=sizeof(ns2)-1) { WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } if(tnn!=NumType(-0x41)) { WY_THROW( WyRet() ); } const char ns3[]="-041"; radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(ns3,sizeof(ns3)-1),radix))!=Ok) { WY_THROW(r); } if(endptr-ns3!=sizeof(ns3)-1) { WY_THROW( WyRet() ); } if(radix!=8) { WY_THROW( WyRet() ); } if(tnn!=NumType(-041)) { WY_THROW( WyRet() ); } const char ns4[]="-41"; radix=5; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(ns4,sizeof(ns4)-1),radix))!=Ok) { WY_THROW(r); } if(endptr-ns4!=sizeof(ns4)-1) { WY_THROW( WyRet() ); } if(radix!=5) { WY_THROW( WyRet() ); } if(tnn!=NumType(-21)) { WY_THROW( WyRet() ); } } } // chk error Wy::_strnum(...) { NumType tnn=3; const char* buf=0; const char* endptr=(const char*)1; int radix; try { r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,1),3); WY_THROW(r); } catch(const WyCSeg::Reply& e) { if(e!=Wym_EFAULT) { WY_THROW( WyRet(e) ); } // FALLTHROUGH }; buf="73!"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,2),1))!=Wym_EINVAL) { WY_THROW(r); } if(endptr-buf!=0) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,2),37))!=Wym_EINVAL) { WY_THROW(r); } if(endptr-buf!=0) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),10))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=73) { WY_THROW( WyRet() ); } buf="+"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,1),2))!=Wym_ENOENT) { WY_THROW(r); } if(endptr-buf!=0) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } buf="0xx"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),0))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),16))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } buf="0xg"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),0))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),16))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } buf="0xx"; radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=16; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } buf="0xg"; radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=16; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=1) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } buf="0xfg"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),16))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=3) { WY_THROW( WyRet() ); } if(tnn!=0xf) { WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } if((r=Wy::_strnum(tnn,&endptr,WyCSeg("fffffffffffffffffffffff"),16))!=Wym_ERANGE) { WY_THROW(r); } if(endptr-buf<(int)(2*sizeof(NumType))) { WY_THROW( WyRet() ); } if(tnn<15) { WY_THROW( WyRet() ); } if(std::numeric_limits<NumType>::is_signed) { buf=(const char*)0; tnn=4; try { r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,1),3); WY_THROW(r); } catch(const WyCSeg::Reply& e) { if(e!=Wym_EFAULT) { WY_THROW( WyRet(e) ); } // FALLTHROUGH }; buf="-7"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,2),37))!=Wym_EINVAL) { WY_THROW(r); } if(endptr-buf!=0) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,3),8))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=NumType(-7)) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,2),1))!=Wym_EINVAL) { WY_THROW(r); } if(endptr-buf!=0) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } buf="-0xx"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),0))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),16))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } buf="-0xg"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),0))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),16))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } buf="-0xx"; radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=16; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } buf="-0xg"; radix=0; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } tnn=99; radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=0; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } radix=16; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,4),radix))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=2) { WY_THROW( WyRet() ); } if(tnn!=0) { WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } buf="-0xfg"; tnn=99; if((r=Wy::_strnum(tnn,&endptr,WyCSeg(buf,5),16))!=Wym_EBADMSG) { WY_THROW(r); } if(endptr-buf!=4) { WY_THROW( WyRet() ); } if(tnn+0xf!=0) { // compiler complains "tnn!=-0xf" WY_THROW( WyRet() ); } if(radix!=16) { WY_THROW( WyRet() ); } if((r=Wy::_strnum(tnn,&endptr,WyCSeg("-fffffffffffffffffffffff"),16))!=Wym_ERANGE) { WY_THROW(r); } if(endptr-buf<(int)(2*sizeof(NumType))) { WY_THROW( WyRet() ); } if(tnn>0) { WY_THROW( WyRet() ); } } }};template <typename NumT>static void ck_sqrt(void){ if(std::numeric_limits<NumT>::is_signed) { return; } if(Wy::_sqrt(NumT(0))!=0) { WY_THROW( WyRet() ); } if(Wy::_sqrt(NumT(1))!=1) { WY_THROW( WyRet() ); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -