| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- /*============================================================================
- 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 <cstring>
- #include <sys/types.h>
- #include <sys/stat.h>
- //----------------------------------------------------------------------------
- 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);
- }
|