| 
									
										
										
										
											2018-03-04 09:16:51 -08:00
										 |  |  | // Formatting library for C++ - test utilities
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Copyright (c) 2012 - present, Victor Zverovich
 | 
					
						
							|  |  |  | // All rights reserved.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // For the license information refer to format.h.
 | 
					
						
							| 
									
										
										
										
											2014-06-06 06:38:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | #include <cstdarg>
 | 
					
						
							|  |  |  | #include <cstdio>
 | 
					
						
							| 
									
										
										
										
											2014-09-05 08:44:41 -07:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-15 14:51:37 -08:00
										 |  |  | #include "fmt/os.h"
 | 
					
						
							| 
									
										
										
										
											2015-06-24 09:16:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | enum { BUFFER_SIZE = 256 }; | 
					
						
							| 
									
										
										
										
											2014-06-06 06:38:37 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | #ifdef _MSC_VER
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | #  define FMT_VSNPRINTF vsprintf_s
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | #  define FMT_VSNPRINTF vsnprintf
 | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-07 15:59:46 -07:00
										 |  |  | template <size_t SIZE> | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | void safe_sprintf(char (&buffer)[SIZE], const char* format, ...) { | 
					
						
							| 
									
										
										
										
											2014-07-29 07:50:05 -07:00
										 |  |  |   std::va_list args; | 
					
						
							|  |  |  |   va_start(args, format); | 
					
						
							|  |  |  |   FMT_VSNPRINTF(buffer, SIZE, format, args); | 
					
						
							|  |  |  |   va_end(args); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-10 06:21:41 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-06 06:38:37 -07:00
										 |  |  | // Increment a number in a string.
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | void increment(char* s); | 
					
						
							| 
									
										
										
										
											2014-09-05 08:44:41 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | std::string get_system_error(int error_code); | 
					
						
							| 
									
										
										
										
											2015-06-24 09:16:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | extern const char* const FILE_CONTENT; | 
					
						
							| 
									
										
										
										
											2015-06-24 09:16:03 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Opens a buffered file for reading.
 | 
					
						
							| 
									
										
										
										
											2019-05-30 07:01:31 -07:00
										 |  |  | fmt::buffered_file open_buffered_file(FILE** fp = nullptr); | 
					
						
							| 
									
										
										
										
											2015-07-08 08:04:32 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | inline FILE* safe_fopen(const char* filename, const char* mode) { | 
					
						
							| 
									
										
										
										
											2015-07-08 08:04:32 -07:00
										 |  |  | #if defined(_WIN32) && !defined(__MINGW32__)
 | 
					
						
							|  |  |  |   // Fix MSVC warning about "unsafe" fopen.
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  |   FILE* f = 0; | 
					
						
							| 
									
										
										
										
											2015-07-08 08:04:32 -07:00
										 |  |  |   errno = fopen_s(&f, filename, mode); | 
					
						
							|  |  |  |   return f; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |   return std::fopen(filename, mode); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-09-08 08:36:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | template <typename Char> class BasicTestString { | 
					
						
							| 
									
										
										
										
											2015-09-08 08:36:20 -07:00
										 |  |  |  private: | 
					
						
							| 
									
										
										
										
											2015-09-18 16:26:41 -07:00
										 |  |  |   std::basic_string<Char> value_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   static const Char EMPTY[]; | 
					
						
							| 
									
										
										
										
											2015-09-08 08:36:20 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |  public: | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  |   explicit BasicTestString(const Char* value = EMPTY) : value_(value) {} | 
					
						
							| 
									
										
										
										
											2015-09-08 08:36:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  |   const std::basic_string<Char>& value() const { return value_; } | 
					
						
							| 
									
										
										
										
											2015-09-08 08:36:20 -07:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-09-18 16:26:41 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | template <typename Char> const Char BasicTestString<Char>::EMPTY[] = {0}; | 
					
						
							| 
									
										
										
										
											2015-09-18 16:26:41 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef BasicTestString<char> TestString; | 
					
						
							|  |  |  | typedef BasicTestString<wchar_t> TestWString; | 
					
						
							| 
									
										
										
										
											2016-05-06 07:37:20 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-03 08:52:05 -07:00
										 |  |  | template <typename Char> | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os, | 
					
						
							|  |  |  |                                      const BasicTestString<Char>& s) { | 
					
						
							| 
									
										
										
										
											2016-08-03 08:52:05 -07:00
										 |  |  |   os << s.value(); | 
					
						
							|  |  |  |   return os; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 07:37:20 -07:00
										 |  |  | class Date { | 
					
						
							|  |  |  |   int year_, month_, day_; | 
					
						
							| 
									
										
										
										
											2019-01-12 18:27:38 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 07:37:20 -07:00
										 |  |  |  public: | 
					
						
							|  |  |  |   Date(int year, int month, int day) : year_(year), month_(month), day_(day) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   int year() const { return year_; } | 
					
						
							|  |  |  |   int month() const { return month_; } | 
					
						
							|  |  |  |   int day() const { return day_; } | 
					
						
							|  |  |  | }; |