static Value * eval(const Ast *expr) { switch(expr->class) { case N_CALL: return call(expr); case N_ASSIGNMENT: return assignment(expr); case N_IDENTIFIER: return identifier(expr); case N_NEG: return _neg(expr); case N_NOT: return _not(expr); case N_EQ: return _eq(expr); case N_NEQ: return _neq(expr); case N_AND: return _and(expr); case N_IOR: return _ior(expr); case N_XOR: return _neq(expr); // alias case N_LT: return _lt(expr); case N_LE: return _le(expr); case N_GE: return _ge(expr); case N_GT: return _gt(expr); case N_ADD: return _add(expr); case N_SUB: return _sub(expr); case N_MUL: return _mul(expr); case N_DIV: return _div(expr); case N_POW: return _pow(expr); case N_MOD: return _mod(expr); case N_BOOLEAN: return _bool(expr); case N_INTEGER: return _int(expr); case N_FLOAT: return _float(expr); case N_STRING: return _string(expr); case N_SET: return _set(expr); case N_R: return _relation(expr); } printf("EVALFAIL %d ", expr->class); pn(expr); assert(false && "should not be reached"); }
Object *BinaryEvaluator::evaluate(Object *u, IEvaluator *ev) { Pair *p = PairUtil::cast_pair(u); if (!p) return u; Object *q = ev->evaluate(PairUtil::at(p, 1), ev), *r = ev->evaluate(PairUtil::at(p, 2), ev); int_t *qi = _to_int(q), *ri = _to_int(r); float_t *qf = _to_float(q), *rf = _to_float(r); if (qi && ri) return _int (evaluate((int) *qi, (int) *ri)); // both ints.. else if (qf && rf) return _float(evaluate((float)*qf, (float)*rf)); // both floats.. else if (qi && rf) return _float(evaluate((float)*qi, (float)*rf)); // q, int; r, float else if (qf && ri) return _float(evaluate((float)*qf, (float)*ri)); // q, float; r, int return p; }
void DumpLiteral(SQObjectPtr &o) { switch(type(o)){ case OT_STRING: scprintf(_SC("\"%s\""),_stringval(o));break; case OT_FLOAT: scprintf(_SC("{%f}"),_float(o));break; case OT_INTEGER: scprintf(_SC("{") _PRINT_INT_FMT _SC("}"),_integer(o));break; case OT_BOOL: scprintf(_SC("%s"),_integer(o)?_SC("true"):_SC("false"));break; default: scprintf(_SC("(%s %p)"),GetTypeName(o),(void*)_rawval(o));break; break; //shut up compiler } }
void DumpLiteral(SQObjectPtr &o) { switch(type(o)){ case OT_STRING: printf("\"%s\"",_stringval(o));break; case OT_FLOAT: printf("{%f}",_float(o));break; case OT_INTEGER: printf("{" OTTD_PRINTF64 "}",_integer(o));break; case OT_BOOL: printf("%s",_integer(o)?"true":"false");break; default: printf("(%s %p)",GetTypeName(o),(void*)_rawval(o));break; break; //shut up compiler } }
/* * Handle being given a zero as the first char in a new token. */ TokenT *_zero(TokenizerT *tk) { nextChar(tk); if(isOctal(tk->inputIter[0])) { return _octal(tk); } else if(tk->inputIter[0] == 'x' || (tk->inputIter[0]) == 'X') { return _hex(tk, 1); } else if(tk->inputIter[0] == '.') { return _float(tk, 1); } else { return makeToken(tk, "zero integer"); } }
TokenT *_decimal(TokenizerT *tk) { nextChar(tk); if(isdigit(tk->inputIter[0])) { return _decimal(tk); } else if(tk->inputIter[0] == '.') { return _float(tk, 1); } else if(tk->inputIter[0] == 'e' || tk->inputIter[0] == 'E') { return _expofloat(tk, 1, 0); } else { return makeToken(tk, "decimal integer"); } }
TokenT *_float(TokenizerT *tk, int isFirst) { nextChar(tk); if(isdigit(tk->inputIter[0])) { return _float(tk, 0); } else if(tk->inputIter[0] == 'e' || tk->inputIter[0] == 'E') { return _expofloat(tk, 1, 0); } else { if(isFirst) { return _invalid(tk); } else { return makeToken(tk, "float"); } } }
void Test() { DBGTRACE(_T("--------------------------------------------------")); Variant _int(99); DBGTRACE(_T("%s : %d"), _int.GetString().c_str(), _int.GetInt()); Variant _float(1.5f); DBGTRACE(_T("%s : %f"), _float.GetString().c_str(), _float.GetFloat()); Variant _bool(true); DBGTRACE(_T("%s : %d"), _bool.GetString().c_str(), _bool.GetBool()); }
SQString *SQVM::PrintObjVal(const SQObject &o) { char buf[NUMBER_MAX_CHAR+1]; switch(type(o)) { case OT_STRING: return _string(o); case OT_INTEGER: seprintf(buf, lastof(buf), OTTD_PRINTF64, _integer(o)); return SQString::Create(_ss(this), buf); case OT_FLOAT: seprintf(buf, lastof(buf), "%.14g", _float(o)); return SQString::Create(_ss(this), buf); default: return SQString::Create(_ss(this), GetTypeName(o)); } }
void CTimer::Set_TimeDelta(void) { QueryPerformanceCounter(&m_FrameTime); if(m_FrameTime.QuadPart - m_FixTime.QuadPart > m_CpuTick.QuadPart) { // cpu가 1초당 증가시킬 수 있는 숫자 QueryPerformanceFrequency(&m_CpuTick); m_FixTime = m_FrameTime; } m_fTimeDelta = _float(m_FrameTime.QuadPart - m_LastTime.QuadPart) / m_CpuTick.QuadPart; m_LastTime = m_FrameTime; }
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)); } }
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; }
ISTBOOL GetParams(struct sphere_model *model, ISTFLOAT rad) { ISTSHORT i, j; ISTFLOAT min[3] = {0}; ISTFLOAT max[3] = {0}; ISTFLOAT mean[3] = {0}; ISTFLOAT var[3] = {0}; ISTFLOAT tmpf; ISTFLOAT two = _float(2); for (j = 0; j < 3; j++) { min[j] = model->offsets[0][j]; max[j] = model->offsets[0][j]; for (i = 1; i < IST_SPHERE_OFFSET_NUM; i++) { if (_lt(model->offsets[i][j], min[j])) { min[j] = model->offsets[i][j]; } if (_gt(model->offsets[i][j], max[j])) { max[j] = model->offsets[i][j]; } } mean[j] = _div(_add(max[j], min[j]), two); var[j] = _sub(max[j], min[j]); } tmpf = _mul(rad, model->ratio); if (_ge(var[0], tmpf) || _ge(var[1], tmpf) || _ge(var[2], tmpf)) { goto EXIT; } for (j = 0; j < 3; ++j) { model->mean[j] = mean[j]; model->var[j] = var[j]; } model->rad = rad; return ISTTRUE; EXIT: return ISTFALSE; }
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)); } }
ISTBOOL GetSphereFrom4Points(struct sphere_model *model) { ISTFLOAT a[4][4] = {{0}}; ISTFLOAT ho[3] = {0}; ISTFLOAT norm = 0; ISTFLOAT rad = 0; ISTFLOAT tmpf = 0; ISTFLOAT two = _float(2); ISTFLOAT m11, m12, m13, m14, m15; ISTINT i, j; // Get sphere from 4 points for (i = 0; i < 4; i++) { /* find minor 11 */ a[i][0] = model->p4s[i][0]; a[i][1] = model->p4s[i][1]; a[i][2] = model->p4s[i][2]; a[i][3] = _one; } m11 = GetDet(a, 4); for (i = 0; i < 4; i++) { /* find minor 12 */ a[i][0] = _add(_add(_mul(model->p4s[i][0], model->p4s[i][0]), _mul(model->p4s[i][1], model->p4s[i][1])), _mul(model->p4s[i][2], model->p4s[i][2])); a[i][1] = model->p4s[i][1]; a[i][2] = model->p4s[i][2]; a[i][3] = _one; } m12 = GetDet(a, 4); for (i = 0; i < 4; i++) { /* find minor 13 */ a[i][0] = _add(_add(_mul(model->p4s[i][0], model->p4s[i][0]), _mul(model->p4s[i][1], model->p4s[i][1])), _mul(model->p4s[i][2], model->p4s[i][2])); a[i][1] = model->p4s[i][0]; a[i][2] = model->p4s[i][2]; a[i][3] = _one; } m13 = GetDet(a, 4); for (i = 0; i < 4; i++) { /* find minor 14 */ a[i][0] = _add(_add(_mul(model->p4s[i][0], model->p4s[i][0]), _mul(model->p4s[i][1], model->p4s[i][1])), _mul(model->p4s[i][2], model->p4s[i][2])); a[i][1] = model->p4s[i][0]; a[i][2] = model->p4s[i][1]; a[i][3] = _one; } m14 = GetDet(a, 4); for (i = 0; i < 4; i++) { /* find minor 15 */ a[i][0] = _add(_add(_mul(model->p4s[i][0], model->p4s[i][0]), _mul(model->p4s[i][1], model->p4s[i][1])), _mul(model->p4s[i][2], model->p4s[i][2])); a[i][1] = model->p4s[i][0]; a[i][2] = model->p4s[i][1]; a[i][3] = model->p4s[i][2]; } m15 = GetDet(a, 4); if (_eq(m11, 0)) { rad = 0; } else { /* center of sphere */ ho[0] = _div(_div(m12, m11), two); ho[1] = _neg(_div(_div(m13, m11), two)); ho[2] = _div(_div(m14, m11), two); norm = _sub(_add(_add(_mul(ho[0], ho[0]), _mul(ho[1], ho[1])), _mul(ho[2], ho[2])), _div(m15, m11)); if (_ge(norm, 0)) { rad = _sqrt(norm); } } if (_le(rad, 0)) { goto EXIT; } // Check distance for (i = 0; i < 4; i++) { for (j = (i + 1); j < 4; j++) { tmpf = GetDistance(model->p4s[i], model->p4s[j]); if (_lt(tmpf, rad) || _lt(tmpf, model->rad_min)) { goto EXIT; } } } // Update offset for (i = 1; i < IST_SPHERE_OFFSET_NUM; i++) { for (j = 0; j < 3; ++j) { model->offsets[IST_SPHERE_OFFSET_NUM - i][j] = model->offsets[IST_SPHERE_OFFSET_NUM - i - 1][j]; } } for (j = 0; j < 3; ++j) { model->offsets[0][j] = ho[j]; } for (i = (IST_SPHERE_DATAMAX >> 1); i < IST_SPHERE_DATAMAX; i++) { for (j = 0; j < 3; ++j) { model->data[i][j] = _max; } } // Check offset buffer full if (IsInitedVector(model->offsets[IST_SPHERE_OFFSET_NUM - 1])) { goto EXIT; } // Calculate mean bias and radius if (!GetParams(model, rad)) { goto EXIT; } return ISTTRUE; EXIT: return ISTFALSE; }