/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2012 Kitware, Inc., Insight Software Consortium Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #include "cmTimestamp.h" #include #include #include //---------------------------------------------------------------------------- std::string cmTimestamp::CurrentTime( const std::string& formatString, bool utcFlag) { time_t currentTimeT = time(0); if(currentTimeT == time_t(-1)) return std::string(); return CreateTimestampFromTimeT(currentTimeT, formatString, utcFlag); } std::string cmTimestamp::FileModificationTime(const char* path, const std::string& formatString, bool utcFlag) { #ifdef _WIN32 struct _stat info; std::memset(&info, 0, sizeof(info)); if(_stat(path, &info) != 0) return std::string(); time_t currentTimeT = info.st_mtime; #else struct stat info; std::memset(&info, 0, sizeof(info)); if(stat(path, &info) != 0) return std::string(); time_t currentTimeT = info.st_mtime; #endif return CreateTimestampFromTimeT(currentTimeT, formatString, utcFlag); } std::string cmTimestamp::CreateTimestampFromTimeT(time_t timeT, std::string formatString, bool utcFlag) { if(formatString.empty()) { formatString = "%Y-%m-%dT%H:%M:%S"; if(utcFlag) formatString += "Z"; } struct tm timeStruct; std::memset(&timeStruct, 0, sizeof(timeStruct)); if(utcFlag) { tm* ptr = gmtime(&timeT); if(ptr == 0) return std::string(); timeStruct = *ptr; } else { struct tm* ptr = localtime(&timeT); if(ptr == 0) return std::string(); timeStruct = *ptr; } std::string result; for(std::string::size_type i = 0; i < formatString.size(); ++i) { char c1 = formatString[i]; char c2 = (i+1 < formatString.size()) ? formatString[i+1] : 0; if(c1 == '%' && c2 != 0) { result += AddTimestampComponent(c2, timeStruct); ++i; } else { result += c1; } } return result; } //---------------------------------------------------------------------------- std::string cmTimestamp::AddTimestampComponent( char flag, struct tm& timeStruct) { std::string formatString = "%"; formatString += flag; switch(flag) { case 'd': case 'H': case 'I': case 'j': case 'm': case 'M': case 'S': case 'U': case 'w': case 'y': case 'Y': break; default: { return formatString; } } char buffer[16]; size_t size = strftime(buffer, sizeof(buffer), formatString.c_str(), &timeStruct); return std::string(buffer, size); }