BfUtil.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "BfUtil.h"
  2. #include "BeefySysLib/util/Hash.h"
  3. USING_NS_BF;
  4. void* Beefy::DecodeLocalDataPtr(const char*& strRef)
  5. {
  6. void* val = (void*)stouln(strRef, sizeof(intptr) * 2);
  7. strRef += sizeof(intptr) * 2;
  8. return val;
  9. }
  10. String Beefy::EncodeDataPtr(void* addr, bool doPrefix)
  11. {
  12. if (doPrefix)
  13. {
  14. return StrFormat("0x%p", addr);
  15. }
  16. else
  17. return StrFormat("%p", addr);
  18. }
  19. String Beefy::EncodeDataPtr(uint32 addr, bool doPrefix)
  20. {
  21. if (doPrefix)
  22. return StrFormat("0x%08X", addr);
  23. else
  24. return StrFormat("%08X", addr);
  25. }
  26. String Beefy::EncodeDataPtr(int addr, bool doPrefix)
  27. {
  28. if (doPrefix)
  29. return StrFormat("0x%08X", addr);
  30. else
  31. return StrFormat("%08X", addr);
  32. }
  33. String Beefy::EncodeDataPtr(uint64 addr, bool doPrefix)
  34. {
  35. if (doPrefix)
  36. return StrFormat("0x%@", addr);
  37. else
  38. return StrFormat("%p", addr);
  39. }
  40. void* Beefy::ZeroedAlloc(int size)
  41. {
  42. //uint8* data = new uint8[size];
  43. uint8* data = (uint8*)malloc(size);
  44. BF_ASSERT(((intptr)data & 7) == 0);
  45. memset(data, 0, size);
  46. return data;
  47. }
  48. String Beefy::EncodeFileName(const StringImpl& fromStr)
  49. {
  50. String path;
  51. if (fromStr.mLength > 80)
  52. path.Insert(0, fromStr.mPtr, 80);
  53. else
  54. path += fromStr;
  55. path.Replace("$", "\\");
  56. for (auto& c : path)
  57. {
  58. if ((!::isalnum((uint8)c)) && (c != '_'))
  59. c = '-';
  60. }
  61. path += "_";
  62. path += HashEncode128(Hash128(fromStr.c_str(), (int)fromStr.length()));
  63. return path;
  64. }
  65. uint64 stouln(const char* str, int len)
  66. {
  67. uint64 val = 0;
  68. for (int i = 0; i < len; i++)
  69. {
  70. char c = str[i];
  71. val *= 0x10;
  72. if ((c >= '0') && (c <= '9'))
  73. val += c - '0';
  74. else if ((c >= 'A') && (c <= 'F'))
  75. val += (c - 'A') + 0xA;
  76. else if ((c >= 'a') && (c <= 'f'))
  77. val += (c - 'a') + 0xa;
  78. }
  79. return val;
  80. }
  81. bool Beefy::BfCheckWildcard(const StringImpl& wildcard, const StringImpl& checkStr)
  82. {
  83. bool matched = true;
  84. const char* filterPtr = wildcard.c_str();
  85. const char* namePtr = checkStr.c_str();
  86. char prevFilterC = 0;
  87. while (true)
  88. {
  89. char filterC;
  90. while (true)
  91. {
  92. filterC = *(filterPtr++);
  93. if (filterC != ' ')
  94. break;
  95. }
  96. char nameC;
  97. while (true)
  98. {
  99. nameC = *(namePtr++);
  100. if (nameC != ' ')
  101. break;
  102. }
  103. if ((filterC == 0) || (nameC == 0))
  104. {
  105. matched = (filterC == 0) && (nameC == 0);
  106. break;
  107. }
  108. bool doWildcard = false;
  109. if (nameC != filterC)
  110. {
  111. if (filterC == '*')
  112. doWildcard = true;
  113. else if (((filterC == ',') || (filterC == '>')) &&
  114. ((prevFilterC == '<') || (prevFilterC == ',')))
  115. {
  116. doWildcard = true;
  117. filterPtr--;
  118. }
  119. if (!doWildcard)
  120. {
  121. matched = false;
  122. break;
  123. }
  124. }
  125. if (doWildcard)
  126. {
  127. int openDepth = 0;
  128. const char* startNamePtr = namePtr;
  129. while (true)
  130. {
  131. nameC = *(namePtr++);
  132. if (nameC == 0)
  133. {
  134. namePtr--;
  135. if (openDepth != 0)
  136. matched = false;
  137. break;
  138. }
  139. if ((nameC == '>') && (openDepth == 0))
  140. {
  141. namePtr--;
  142. break;
  143. }
  144. if (nameC == '<')
  145. openDepth++;
  146. else if (nameC == '>')
  147. openDepth--;
  148. else if ((nameC == ',') && (openDepth == 0))
  149. {
  150. namePtr--;
  151. break;
  152. }
  153. }
  154. if (!matched)
  155. break;
  156. }
  157. prevFilterC = filterC;
  158. }
  159. return matched;
  160. }