util.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Formatting library for C++ - test utilities
  2. //
  3. // Copyright (c) 2012 - present, Victor Zverovich
  4. // All rights reserved.
  5. //
  6. // For the license information refer to format.h.
  7. #include <cstdarg>
  8. #include <cstdio>
  9. #include <locale>
  10. #include <string>
  11. #include "fmt/os.h"
  12. #ifdef _MSC_VER
  13. # define FMT_VSNPRINTF vsprintf_s
  14. #else
  15. # define FMT_VSNPRINTF vsnprintf
  16. #endif
  17. template <size_t SIZE>
  18. void safe_sprintf(char (&buffer)[SIZE], const char* format, ...) {
  19. std::va_list args;
  20. va_start(args, format);
  21. FMT_VSNPRINTF(buffer, SIZE, format, args);
  22. va_end(args);
  23. }
  24. extern const char* const file_content;
  25. // Opens a buffered file for reading.
  26. auto open_buffered_file(FILE** fp = nullptr) -> fmt::buffered_file;
  27. inline auto safe_fopen(const char* filename, const char* mode) -> FILE* {
  28. #if defined(_WIN32) && !defined(__MINGW32__)
  29. // Fix MSVC warning about "unsafe" fopen.
  30. FILE* f = nullptr;
  31. errno = fopen_s(&f, filename, mode);
  32. return f;
  33. #else
  34. return std::fopen(filename, mode);
  35. #endif
  36. }
  37. template <typename Char> class basic_test_string {
  38. private:
  39. std::basic_string<Char> value_;
  40. static const Char empty[];
  41. public:
  42. explicit basic_test_string(const Char* value = empty) : value_(value) {}
  43. auto value() const -> const std::basic_string<Char>& { return value_; }
  44. };
  45. template <typename Char> const Char basic_test_string<Char>::empty[] = {0};
  46. using test_string = basic_test_string<char>;
  47. using test_wstring = basic_test_string<wchar_t>;
  48. template <typename Char>
  49. auto operator<<(std::basic_ostream<Char>& os, const basic_test_string<Char>& s)
  50. -> std::basic_ostream<Char>& {
  51. os << s.value();
  52. return os;
  53. }
  54. class date {
  55. int year_, month_, day_;
  56. public:
  57. date(int year, int month, int day) : year_(year), month_(month), day_(day) {}
  58. auto year() const -> int { return year_; }
  59. auto month() const -> int { return month_; }
  60. auto day() const -> int { return day_; }
  61. };
  62. // Returns a locale with the given name if available or classic locale
  63. // otherwise.
  64. auto get_locale(const char* name, const char* alt_name = nullptr)
  65. -> std::locale;