You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.0 KiB
135 lines
3.0 KiB
12 years ago
|
/*============================================================================
|
||
|
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)
|
||
|
{
|
||
|
struct stat info;
|
||
|
memset(&info, 0, sizeof(info));
|
||
|
|
||
|
if(stat(path, &info) != 0)
|
||
|
{
|
||
|
return std::string();
|
||
|
}
|
||
|
|
||
|
return CreateTimestampFromTimeT(info.st_mtime, 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;
|
||
|
memset(&timeStruct, 0, sizeof(timeStruct));
|
||
|
|
||
|
struct tm* ptr = (struct tm*) 0;
|
||
|
if(utcFlag)
|
||
|
{
|
||
|
ptr = gmtime(&timeT);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
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] : static_cast<char>(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);
|
||
|
}
|