CVarSet.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Util/CVarSet.h>
  6. #include <AnKi/Util/File.h>
  7. namespace anki {
  8. void CVar::getFullNameInternal(Array<Char, 256>& arr) const
  9. {
  10. snprintf(arr.getBegin(), arr.getSize(), "%s.%s", m_subsystem.cstr(), m_name.cstr());
  11. }
  12. String CVar::getFullName() const
  13. {
  14. String out;
  15. out.sprintf("%s.%s", m_subsystem.cstr(), m_name.cstr());
  16. return out;
  17. }
  18. void CVarSet::registerCVar(CVar* cvar)
  19. {
  20. for([[maybe_unused]] CVar& it : m_cvars)
  21. {
  22. ANKI_ASSERT(it.m_name != cvar->m_name || it.m_subsystem != cvar->m_subsystem);
  23. }
  24. m_cvars.pushBack(cvar);
  25. }
  26. Error CVarSet::setMultiple(ConstWeakArray<const Char*> arr)
  27. {
  28. for(U32 i = 0; i < arr.getSize(); ++i)
  29. {
  30. ANKI_ASSERT(arr[i]);
  31. const CString varName = arr[i];
  32. // Get the value string
  33. ++i;
  34. if(i >= arr.getSize())
  35. {
  36. ANKI_UTIL_LOGE("Expecting a command line argument after %s", varName.cstr());
  37. return Error::kUserData;
  38. }
  39. ANKI_ASSERT(arr[i]);
  40. const CString value = arr[i];
  41. // Find the CVar
  42. CVar* foundCVar = nullptr;
  43. Array<Char, 256> fullnameArr;
  44. for(CVar& it : m_cvars)
  45. {
  46. it.getFullNameInternal(fullnameArr);
  47. CString fullname = &fullnameArr[0];
  48. if(fullname == varName || it.m_name == varName)
  49. {
  50. if(foundCVar)
  51. {
  52. ANKI_UTIL_LOGE("Command line arg %s has ambiguous name. Skipping", varName.cstr());
  53. }
  54. else
  55. {
  56. foundCVar = &it;
  57. }
  58. }
  59. }
  60. if(foundCVar)
  61. {
  62. #define ANKI_CVAR_NUMERIC_SET(type) \
  63. case CVar::Type::kNumeric##type: \
  64. { \
  65. type v; \
  66. err = value.toNumber(v); \
  67. if(!err) \
  68. { \
  69. static_cast<NumericCVar<type>&>(*foundCVar) = v; \
  70. } \
  71. break; \
  72. }
  73. Error err = Error::kNone;
  74. switch(foundCVar->m_type)
  75. {
  76. case CVar::Type::kString:
  77. static_cast<StringCVar&>(*foundCVar) = value;
  78. break;
  79. case CVar::Type::kBool:
  80. {
  81. U32 v;
  82. err = value.toNumber(v);
  83. if(!err)
  84. {
  85. static_cast<BoolCVar&>(*foundCVar) = (v != 0);
  86. }
  87. break;
  88. }
  89. ANKI_CVAR_NUMERIC_SET(U8)
  90. ANKI_CVAR_NUMERIC_SET(U16)
  91. ANKI_CVAR_NUMERIC_SET(U32)
  92. ANKI_CVAR_NUMERIC_SET(PtrSize)
  93. ANKI_CVAR_NUMERIC_SET(F32)
  94. ANKI_CVAR_NUMERIC_SET(F64)
  95. default:
  96. ANKI_ASSERT(0);
  97. }
  98. if(err)
  99. {
  100. foundCVar->getFullNameInternal(fullnameArr);
  101. ANKI_UTIL_LOGE("Wrong value for %s. Value will not be set", &fullnameArr[0]);
  102. }
  103. }
  104. else
  105. {
  106. ANKI_UTIL_LOGE("Can't recognize command line argument: %s. Skipping", varName.cstr());
  107. }
  108. }
  109. return Error::kNone;
  110. }
  111. } // end namespace anki