bool ReadObject(HSQUIRRELVM v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &o) { SQObjectType t; _CHECK_IO(SafeRead(v,read,up,&t,sizeof(SQObjectType))); switch(t){ case OT_STRING:{ SQInteger len; _CHECK_IO(SafeRead(v,read,up,&len,sizeof(SQInteger))); _CHECK_IO(SafeRead(v,read,up,_ss(v)->GetScratchPad(rsl(len)),rsl(len))); o=SQString::Create(_ss(v),_ss(v)->GetScratchPad(-1),len); } break; case OT_INTEGER:{ SQInteger i; _CHECK_IO(SafeRead(v,read,up,&i,sizeof(SQInteger))); o = i; break; } case OT_FLOAT:{ SQFloat f; _CHECK_IO(SafeRead(v,read,up,&f,sizeof(SQFloat))); o = f; break; } case OT_NULL: o=_null_; break; default: v->Raise_Error(_SC("cannot serialize a %s"),IdType2Name(t)); return false; } return true; }
SQString *SQVM::PrintObjVal(const SQObject &o) { switch(type(o)) { case OT_STRING: return _string(o); case OT_INTEGER: scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%d"), _integer(o)); return SQString::Create(_ss(this), _spval); break; case OT_FLOAT: scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o)); return SQString::Create(_ss(this), _spval); break; default: return SQString::Create(_ss(this), GetTypeName(o)); } }
void tcp_connector::async_connect( int port, std::string const& hostname , FactoryFunc fact_func, ConnectHandler const& handler, options_ptr opts ) { tcp::resolver::iterator resolver_it; tcp::endpoint endpoint; boost::system::error_code ec; // hostname尝试当作IP地址使用 address addr = address::from_string(hostname, ec); if (!ec) endpoint = tcp::endpoint(addr, port); else { // hostname不是IP, 当作域名解析 ec.clear(); tcp::resolver::query query(hostname, lexical_cast_def<std::string>(port)); tcp::resolver rsl(m_ios); resolver_it = rsl.resolve(query, ec); if (ec || tcp::resolver::iterator() == resolver_it) { // 解析失败 handler(tcp_session_ptr(), ec); return ; } // 解析成功, 在地址列表中逐个尝试连接 endpoint = *resolver_it++; } socket_ptr pSock(new socket(m_ios)); pSock->async_connect(endpoint , boost::bind(&tcp_connector::async_connect_handler, this, placeholders::error , pSock, fact_func, handler, opts, resolver_it )); }
void SQVM::Raise_Error(const SQChar *s, ...) { va_list vl; va_start(vl, s); scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl); va_end(vl); _lasterror = SQString::Create(_ss(this),_spval,-1); }
SQString *SQVM::PrintObjVal(const SQObject &o) { switch(type(o)) { case OT_STRING: return _string(o); case OT_INTEGER: // C::B patch: Support for Windows 64 bit #if defined(_WIN64) scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%I64d"), _integer(o)); // C::B patch: Support for Linux 64 bit #elif defined(_SQ64) scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%ld"), _integer(o)); #else scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%d"), _integer(o)); #endif return SQString::Create(_ss(this), _spval); break; case OT_FLOAT: scsprintf(_sp(rsl(NUMBER_MAX_CHAR+1)), _SC("%.14g"), _float(o)); return SQString::Create(_ss(this), _spval); break; default: return SQString::Create(_ss(this), GetTypeName(o)); } }
tcp_session_ptr tcp_connector::connect( FactoryFunc fact_func, int port, std::string const& hostname, boost::system::error_code & ec, options_ptr opts) { address addr = address::from_string(hostname, ec); if (ec) { // hostname不是IP地址, 尝试当作域名解析 ec.clear(); tcp::resolver::query query(hostname, lexical_cast_def<std::string>(port)); tcp::resolver rsl(m_ios); tcp::resolver::iterator resolver_it = rsl.resolve(query, ec); if (ec) return tcp_session_ptr(); ec = error::host_not_found; socket_ptr pSock(new socket(m_ios)); while (ec && tcp::resolver::iterator() != resolver_it) { tcp::endpoint endpoint = *resolver_it++; std::cout << endpoint << std::endl; boost::system::error_code close_ec; pSock->close(close_ec); if (close_ec) pSock.reset(new socket(m_ios)); pSock->connect(endpoint, ec); } boost::system::error_code remote_ec, local_ec; if (!ec && pSock->remote_endpoint(remote_ec) != pSock->local_endpoint(local_ec) && !remote_ec && !local_ec) return fact_func(pSock, session_initialized(session_id(), group_id(), opts)); else return tcp_session_ptr(); } // hostname是IP地址 tcp::endpoint endpoint(addr, port); socket_ptr pSock(new socket(m_ios)); pSock->connect(endpoint, ec); boost::system::error_code remote_ec, local_ec; if (!ec && pSock->remote_endpoint(remote_ec) != pSock->local_endpoint(local_ec) && !remote_ec && !local_ec) return fact_func(pSock, session_initialized(session_id(), group_id(), opts)); else return tcp_session_ptr(); }
Span3d IsPtsSpan3d(const double* a, int n, double tolerance, double* deviation) { // returns a span3d if all points are within tolerance int np = n / 3; // number of points if(np < 2) return Span3d(); // Invalid span3d Point3d sp = Point3d(&a[0]); Point3d ep = Point3d(&a[n-3]); Line line = IsPtsLine(a, n, tolerance, deviation); if(line.ok) return Span3d(sp, ep); // it's a line *deviation = 0; // cumulative deviation Point3d mp = Point3d(&a[np / 2 * 3]); // mid point Plane plane(sp, mp, ep); if(plane.ok) { // plane of the arc is ok // calculate centre point Vector3d vs(mp, sp); vs.normalise(); Vector3d ve(mp, ep); ve.normalise(); Vector3d rs = vs ^ plane.normal; Vector3d re = ve ^ plane.normal; Line rsl(sp.Mid(mp), rs, false); Line rel(ep.Mid(mp), re, false); Point3d pc; Intof(rsl, rel, pc); double radius = pc.Dist(sp); // check other points on circle for(int i = 2; i < np - 1; i++) { Point3d p(&a[i*3]); double dp = fabs(plane.Dist(p)); double dr = fabs(p.Dist(pc) - radius); double tolerance = 10.0 * 1.0e-6; if(dp > tolerance || dr > tolerance) { return Span3d(); } } return Span3d(CW, plane.normal, sp, ep, pc); } return Span3d(); }
bool WriteObject( HSQUIRRELVM v, SQUserPointer up, SQWRITEFUNC write, SQObjectPtr &o ) { _CHECK_IO( SafeWrite( v, write, up, &type( o ), sizeof( SQObjectType ) ) ); switch ( type( o ) ) { case OT_STRING: _CHECK_IO( SafeWrite( v, write, up, &_string( o )->_len, sizeof( SQInteger ) ) ); _CHECK_IO( SafeWrite( v, write, up, _stringval( o ), rsl( _string( o )->_len ) ) ); break; case OT_INTEGER: _CHECK_IO( SafeWrite( v, write, up, &_integer( o ), sizeof( SQInteger ) ) );break; case OT_FLOAT: _CHECK_IO( SafeWrite( v, write, up, &_float( o ), sizeof( SQFloat ) ) );break; case OT_NULL: break; default: v->Raise_Error( _SC( "cannot serialize a %s" ), GetTypeName( o ) ); return false; } return true; }
void SQVM::Raise_ErrorV(const SQChar *s, va_list &vl) { scvsprintf(_sp(rsl((SQInteger)scstrlen(s)+(NUMBER_MAX_CHAR*2))), s, vl); Raise_Error(_spval); }