static int GM_CDECL gmfClamp(gmThread * a_thread) { GM_CHECK_NUM_PARAMS(3); //params: min, value, max int minType = gmMin3(a_thread->ParamType(0), a_thread->ParamType(1), a_thread->ParamType(2)); if(minType < GM_INT) { return GM_EXCEPTION; } int maxType = gmMax3(a_thread->ParamType(0), a_thread->ParamType(1), a_thread->ParamType(2)); if(maxType == GM_INT) { int limitMin = a_thread->Param(0).m_value.m_int; int value = a_thread->Param(1).m_value.m_int; int limitMax = a_thread->Param(2).m_value.m_int; a_thread->PushInt( gmClamp(limitMin, value, limitMax) ); return GM_OK; } else if(maxType == GM_FLOAT) { float limitMin = gmGetFloatOrIntParamAsFloat(a_thread, 0); float value = gmGetFloatOrIntParamAsFloat(a_thread, 1); float limitMax = gmGetFloatOrIntParamAsFloat(a_thread, 2); a_thread->PushFloat( gmClamp(limitMin, value, limitMax) ); return GM_OK; } else { return GM_EXCEPTION; } }
static int GM_CDECL gmfStringRightAt(gmThread * a_thread) { GM_CHECK_NUM_PARAMS(1); GM_CHECK_INT_PARAM(index, 0); const gmVariable * var = a_thread->GetThis(); GM_ASSERT(var->m_type == GM_STRING); gmStringObject * strObj = (gmStringObject *) GM_OBJECT(var->m_value.m_ref); const char * str = (const char *) *strObj; int length = strObj->GetLength(); index = gmClamp(0, index, length); int count = (length - index); char * buffer = (char *) alloca(count + 1); memcpy(buffer, str + index, count); buffer[count] = 0; a_thread->PushNewString(buffer, count); return GM_OK; }