|
|
@@ -0,0 +1,134 @@
|
|
|
+/*============================================================================
|
|
|
+ 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);
|
|
|
+}
|