#include #include #include "build.h" #ifndef BUILD_MAJOR #define BUILD_MAJOR 0 #endif #ifndef BUILD_MINOR #define BUILD_MINOR 0 #endif #ifndef BUILD_PATCH #define BUILD_PATCH 0 #endif #ifndef BUILD_TYPE #define BUILD_TYPE build::BuildType::PRIVATE #endif #ifndef BUILD_DATA #define BUILD_DATA "Unknown build" #endif #ifndef BUILD_COUNT #define BUILD_COUNT 0 #endif #define STR1(x) #x #define STR2(x) STR1(x) using namespace build; using namespace std; using namespace std::chrono; unique_ptr local_version{[]() -> Version * { const char *build_timestamp = __TIME__; //23:59:01 const char *build_date = __DATE__; //Feb 12 1996 cout << "Time " << build_timestamp << " date " << build_date << endl; tm timestamp{}, date{}; if (!strptime(build_timestamp, "%H:%M:%S", ×tamp)) cerr << "Could not parse build timestamp!" << endl; if (!strptime(build_date, "%b %d %Y", &date)) cerr << "Could not parse build date!" << endl; system_clock::time_point time = system_clock::time_point() + seconds(mktime(&date)) + hours(timestamp.tm_hour) + minutes(timestamp.tm_min) + seconds(timestamp.tm_sec); return new Version{BUILD_MAJOR, BUILD_MINOR, BUILD_PATCH, STR2(BUILD_DATA), time}; }()}; namespace build { const std::unique_ptr& version() { return local_version; } std::string Version::string(bool timestamp) { stringstream ss; ss << this->major << "." << this->minor << "." << this->patch << this->additional; if(timestamp) ss << " [Build: " << duration_cast(this->timestamp.time_since_epoch()).count() << "]"; return ss.str(); } BuildType type() { return static_cast(BUILD_TYPE); } std::string additionalData(){ return STR2(BUILD_DATA); } int buildCount(){ return BUILD_COUNT; } std::string pattern(){ //return R"([0-9]{1,5}\.[0-9]{1,5}\.[0-9]{1,5}(\-.*)?)"; return R"([0-9]{1,5}\.[0-9]{1,5}\.[0-9]{1,5}(-\S+( \[[Bb]uild: \d+\])?)?)"; } }