| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
- // All rights reserved.
- // Code licensed under the BSD License.
- // http://www.anki3d.org/LICENSE
- #include <AnKi/Util/CVarSet.h>
- #include <AnKi/Util/File.h>
- namespace anki {
- void CVar::getFullNameInternal(Array<Char, 256>& arr) const
- {
- snprintf(arr.getBegin(), arr.getSize(), "%s.%s", m_subsystem.cstr(), m_name.cstr());
- }
- String CVar::getFullName() const
- {
- String out;
- out.sprintf("%s.%s", m_subsystem.cstr(), m_name.cstr());
- return out;
- }
- void CVarSet::registerCVar(CVar* cvar)
- {
- for([[maybe_unused]] CVar& it : m_cvars)
- {
- ANKI_ASSERT(it.m_name != cvar->m_name || it.m_subsystem != cvar->m_subsystem);
- }
- m_cvars.pushBack(cvar);
- }
- Error CVarSet::setMultiple(ConstWeakArray<const Char*> arr)
- {
- for(U32 i = 0; i < arr.getSize(); ++i)
- {
- ANKI_ASSERT(arr[i]);
- const CString varName = arr[i];
- // Get the value string
- ++i;
- if(i >= arr.getSize())
- {
- ANKI_UTIL_LOGE("Expecting a command line argument after %s", varName.cstr());
- return Error::kUserData;
- }
- ANKI_ASSERT(arr[i]);
- const CString value = arr[i];
- // Find the CVar
- CVar* foundCVar = nullptr;
- Array<Char, 256> fullnameArr;
- for(CVar& it : m_cvars)
- {
- it.getFullNameInternal(fullnameArr);
- CString fullname = &fullnameArr[0];
- if(fullname == varName || it.m_name == varName)
- {
- if(foundCVar)
- {
- ANKI_UTIL_LOGE("Command line arg %s has ambiguous name. Skipping", varName.cstr());
- }
- else
- {
- foundCVar = ⁢
- }
- }
- }
- if(foundCVar)
- {
- #define ANKI_CVAR_NUMERIC_SET(type) \
- case CVar::Type::kNumeric##type: \
- { \
- type v; \
- err = value.toNumber(v); \
- if(!err) \
- { \
- static_cast<NumericCVar<type>&>(*foundCVar) = v; \
- } \
- break; \
- }
- Error err = Error::kNone;
- switch(foundCVar->m_type)
- {
- case CVar::Type::kString:
- static_cast<StringCVar&>(*foundCVar) = value;
- break;
- case CVar::Type::kBool:
- {
- U32 v;
- err = value.toNumber(v);
- if(!err)
- {
- static_cast<BoolCVar&>(*foundCVar) = (v != 0);
- }
- break;
- }
- ANKI_CVAR_NUMERIC_SET(U8)
- ANKI_CVAR_NUMERIC_SET(U16)
- ANKI_CVAR_NUMERIC_SET(U32)
- ANKI_CVAR_NUMERIC_SET(PtrSize)
- ANKI_CVAR_NUMERIC_SET(F32)
- ANKI_CVAR_NUMERIC_SET(F64)
- default:
- ANKI_ASSERT(0);
- }
- if(err)
- {
- foundCVar->getFullNameInternal(fullnameArr);
- ANKI_UTIL_LOGE("Wrong value for %s. Value will not be set", &fullnameArr[0]);
- }
- }
- else
- {
- ANKI_UTIL_LOGE("Can't recognize command line argument: %s. Skipping", varName.cstr());
- }
- }
- return Error::kNone;
- }
- } // end namespace anki
|