string_format.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*
  2. * Copyright (C) 2024 Xiaomi Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #ifndef STRING_FORMAT_H_
  6. #define STRING_FORMAT_H_
  7. #include <cstdarg>
  8. #include <string>
  9. #include <vector>
  10. #include "config.h"
  11. #define PRIstringview "%.*s"
  12. #define ANALYZER_PRINTF_STRING_VIEW_ARG(x) \
  13. static_cast<int>((x).length()), (x).data()
  14. #define PRItypecode "%s%#x"
  15. #define ANALYZER_DEFAULT_SNPRINTF_ALLOCA_BUFSIZE 128
  16. #define ANALYZER_SNPRINTF_ALLOCA(buffer, len, format) \
  17. va_list args; \
  18. va_list args_copy; \
  19. va_start(args, format); \
  20. va_copy(args_copy, args); \
  21. char fixed_buf[ANALYZER_DEFAULT_SNPRINTF_ALLOCA_BUFSIZE]; \
  22. char *buffer = fixed_buf; \
  23. size_t len = \
  24. analyzer_vsnprintf(fixed_buf, sizeof(fixed_buf), format, args); \
  25. va_end(args); \
  26. if (len + 1 > sizeof(fixed_buf)) { \
  27. buffer = static_cast<char *>(alloca(len + 1)); \
  28. len = analyzer_vsnprintf(buffer, len + 1, format, args_copy); \
  29. } \
  30. va_end(args_copy)
  31. namespace analyzer {
  32. inline std::string ANALYZER_PRINTF_FORMAT(1, 2)
  33. StringPrintf(const char *format, ...)
  34. {
  35. va_list args;
  36. va_list args_copy;
  37. va_start(args, format);
  38. va_copy(args_copy, args);
  39. size_t len = analyzer_vsnprintf(nullptr, 0, format, args) + 1;
  40. std::vector<char> buffer(len);
  41. va_end(args);
  42. analyzer_vsnprintf(buffer.data(), len, format, args_copy);
  43. va_end(args_copy);
  44. return std::string(buffer.data(), len - 1);
  45. }
  46. } // namespace analyzer
  47. #endif