Fix a FIXME about the format and add a test.

While at it, use strftime on Unix too and use the thread safe versions
of localtime.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186090 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2013-07-11 15:35:23 +00:00
parent 11eb51e239
commit 71857ccdb8
4 changed files with 43 additions and 40 deletions

View File

@ -22,18 +22,13 @@ namespace llvm {
using namespace sys; using namespace sys;
std::string TimeValue::str() const { std::string TimeValue::str() const {
char buffer[32]; time_t OurTime = time_t(this->toEpochTime());
struct tm Storage;
time_t ourTime = time_t(this->toEpochTime()); struct tm *LT = ::localtime_r(&OurTime, &Storage);
#ifdef __hpux assert(LT);
// note that the following line needs -D_REENTRANT on HP-UX to be picked up char Buffer[25];
asctime_r(localtime(&ourTime), buffer); strftime(Buffer, 25, "%b %e %H:%M %Y", LT);
#else return std::string(Buffer);
::asctime_r(::localtime(&ourTime), buffer);
#endif
std::string result(buffer);
return result.substr(0,24);
} }
TimeValue TimeValue::now() { TimeValue TimeValue::now() {

View File

@ -31,20 +31,15 @@ TimeValue TimeValue::now() {
} }
std::string TimeValue::str() const { std::string TimeValue::str() const {
#ifdef __MINGW32__ struct tm LT;
// This ban may be lifted by either: __time64_t OurTime = this->toEpochTime();
// (i) a future MinGW version other than 1.0 inherents the __time64_t type, or errno_t Error = ::_localtime64_s(&LT, &OurTime);
// (ii) configure tests for either the time_t or __time64_t type. assert(!Error);
time_t ourTime = time_t(this->toEpochTime());
struct tm *lt = ::localtime(&ourTime);
#else
__time64_t ourTime = this->toEpochTime();
struct tm *lt = ::_localtime64(&ourTime);
#endif
char buffer[25]; char Buffer[25];
strftime(buffer, 25, "%a %b %d %H:%M:%S %Y", lt); // FIXME: the windows version of strftime doesn't support %e
return std::string(buffer); strftime(Buffer, 25, "%b %d %H:%M %Y", &LT);
return std::string(Buffer);
} }

View File

@ -1,16 +1,31 @@
REQUIRES: shell
RUN: export TZ=GMT
Test reading an archive created by gnu ar Test reading an archive created by gnu ar
RUN: llvm-ar t %p/Inputs/GNU.a | FileCheck %s RUN: llvm-ar tv %p/Inputs/GNU.a | FileCheck %s --check-prefix=GNU -strict-whitespace
GNU: rw-r--r-- 500/500 8 Nov 19 02:57 2004 evenlen
GNU-NEXT: rw-r--r-- 500/500 7 Nov 19 02:57 2004 oddlen
GNU-NEXT: rwxr-xr-x 500/500 1465 Nov 19 03:01 2004 very_long_bytecode_file_name.bc
GNU-NEXT: rw-r--r-- 500/500 2280 Nov 19 03:04 2004 IsNAN.o
Test reading an archive createdy by Mac OS X ar Test reading an archive createdy by Mac OS X ar
RUN: llvm-ar t %p/Inputs/MacOSX.a | FileCheck %s RUN: llvm-ar tv %p/Inputs/MacOSX.a | FileCheck %s --check-prefix=OSX -strict-whitespace
OSX: rw-r--r-- 501/501 8 Nov 19 02:57 2004 evenlen
OSX-NEXT: rw-r--r-- 501/501 8 Nov 19 02:57 2004 oddlen
OSX-NEXT: rw-r--r-- 502/502 1465 Feb 4 06:59 2010 very_long_bytecode_file_name.bc
OSX-NEXT: rw-r--r-- 501/501 2280 Nov 19 04:32 2004 IsNAN.o
Test reading an archive created on Solaris by /usr/ccs/bin/ar Test reading an archive created on Solaris by /usr/ccs/bin/ar
RUN: llvm-ar t %p/Inputs/SVR4.a | FileCheck %s RUN: llvm-ar tv %p/Inputs/SVR4.a | FileCheck %s -strict-whitespace
Test reading an archive created on Solaris by /usr/xpg4/bin/ar Test reading an archive created on Solaris by /usr/xpg4/bin/ar
RUN: llvm-ar t %p/Inputs/xpg4.a | FileCheck %s RUN: llvm-ar tv %p/Inputs/xpg4.a | FileCheck %s -strict-whitespace
CHECK: evenlen CHECK: rw-r--r-- 1002/102 8 Nov 19 03:24 2004 evenlen
CHECK-NEXT: oddlen CHECK-NEXT: rw-r--r-- 1002/102 7 Nov 19 03:24 2004 oddlen
CHECK-NEXT: very_long_bytecode_file_name.bc CHECK-NEXT: rwxr-xr-x 1002/102 1465 Nov 19 03:24 2004 very_long_bytecode_file_name.bc
CHECK-NEXT: IsNAN.o CHECK-NEXT: rw-r--r-- 1002/102 2280 Nov 19 03:24 2004 IsNAN.o

View File

@ -325,17 +325,15 @@ doDisplayTable(std::string* ErrMsg) {
if (Paths.empty() || if (Paths.empty() ||
(std::find(Paths.begin(), Paths.end(), I->getPath()) != Paths.end())) { (std::find(Paths.begin(), Paths.end(), I->getPath()) != Paths.end())) {
if (Verbose) { if (Verbose) {
// FIXME: Output should be this format:
// Zrw-r--r-- 500/ 500 525 Nov 8 17:42 2004 Makefile
outs() << " ";
unsigned mode = I->getMode(); unsigned mode = I->getMode();
printMode((mode >> 6) & 007); printMode((mode >> 6) & 007);
printMode((mode >> 3) & 007); printMode((mode >> 3) & 007);
printMode(mode & 007); printMode(mode & 007);
outs() << " " << format("%4u", I->getUser()); outs() << ' ' << I->getUser();
outs() << "/" << format("%4u", I->getGroup()); outs() << "/" << I->getGroup();
outs() << " " << format("%8u", I->getSize()); outs() << ' ' << format("%6u", I->getSize());
outs() << " " << format("%20s", I->getModTime().str().substr(4).c_str()); sys::TimeValue ModTime = I->getModTime();
outs() << " " << ModTime.str();
outs() << " " << I->getPath().str() << "\n"; outs() << " " << I->getPath().str() << "\n";
} else { } else {
outs() << I->getPath().str() << "\n"; outs() << I->getPath().str() << "\n";