예제 #1
0
파일: executor.c 프로젝트: Rela-X/rlang
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");
}
예제 #2
0
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;
}
예제 #3
0
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
	}
}
예제 #4
0
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
	}
}
예제 #5
0
/*
 * 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");
    }
}
예제 #6
0
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");
    }
}
예제 #7
0
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");
        }
    }
}
예제 #8
0
	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());
	}
예제 #9
0
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));
	}
}
예제 #10
0
파일: Timer.cpp 프로젝트: chanona/Guardians
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;
}
예제 #11
0
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));
	}
}
예제 #12
0
파일: sqobject.cpp 프로젝트: q4a/scourge
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;
}
예제 #13
0
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;
}
예제 #14
0
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));
	}
}
예제 #15
0
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;
}