Author: scantor Date: Wed Aug 2 21:14:44 2017 New Revision: 1803924 URL: http://svn.apache.org/viewvc?rev=1803924&view=rev Log: XERCESC-2108 - Add epoch conversion support to XMLDateTime
Modified: xerces/c/trunk/cmake/XercesFunctions.cmake xerces/c/trunk/configure.ac xerces/c/trunk/src/xercesc/util/XMLDateTime.cpp xerces/c/trunk/src/xercesc/util/XMLDateTime.hpp Modified: xerces/c/trunk/cmake/XercesFunctions.cmake URL: http://svn.apache.org/viewvc/xerces/c/trunk/cmake/XercesFunctions.cmake?rev=1803924&r1=1803923&r2=1803924&view=diff ============================================================================== --- xerces/c/trunk/cmake/XercesFunctions.cmake (original) +++ xerces/c/trunk/cmake/XercesFunctions.cmake Wed Aug 2 21:14:44 2017 @@ -31,6 +31,8 @@ check_function_exists(socket HAVE_SOCKET check_function_exists(clock_gettime HAVE_CLOCK_GETTIME) check_function_exists(ftime HAVE_FTIME) check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) +check_function_exists(gmtime_r HAVE_GMTIME_R) +check_function_exists(timegm HAVE_TIMEGM) check_function_exists(memmove HAVE_MEMMOVE) check_function_exists(memset HAVE_MEMSET) check_function_exists(nl_langinfo HAVE_NL_LANGINFO) Modified: xerces/c/trunk/configure.ac URL: http://svn.apache.org/viewvc/xerces/c/trunk/configure.ac?rev=1803924&r1=1803923&r2=1803924&view=diff ============================================================================== --- xerces/c/trunk/configure.ac (original) +++ xerces/c/trunk/configure.ac Wed Aug 2 21:14:44 2017 @@ -134,12 +134,12 @@ ACX_PTHREAD #AC_FUNC_STRTOD AC_CHECK_FUNCS([getcwd pathconf realpath \ getaddrinfo gethostbyaddr gethostbyname socket \ - clock_gettime ftime gettimeofday \ + clock_gettime ftime gettimeofday timegm gmtime_r \ memmove memset nl_langinfo setlocale localeconv \ strcasecmp strncasecmp stricmp strnicmp strchr strdup \ strrchr strstr strtol strtoul \ towupper towlower mblen \ - wcsupr wcslwr wcsnicmp wcsicmp \ + wcsupr wcslwr wcsnicmp wcsicmp \ ]) # Some Unix systems, like Gnu Hurd, don't define PATH_MAX Modified: xerces/c/trunk/src/xercesc/util/XMLDateTime.cpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/XMLDateTime.cpp?rev=1803924&r1=1803923&r2=1803924&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/util/XMLDateTime.cpp (original) +++ xerces/c/trunk/src/xercesc/util/XMLDateTime.cpp Wed Aug 2 21:14:44 2017 @@ -23,6 +23,7 @@ // Includes // --------------------------------------------------------------------------- #include <stdlib.h> +#include <stdio.h> #include <assert.h> #include <errno.h> @@ -451,6 +452,52 @@ XMLDateTime::XMLDateTime(const XMLCh* co setBuffer(aString); } +XMLDateTime::XMLDateTime(time_t epoch, bool duration, MemoryManager* const manager) +: fStart(0) +, fEnd(0) +, fBufferMaxLen(0) +, fMilliSecond(0) +, fHasTime(false) +, fBuffer(0) +, fMemoryManager(manager) +{ + if (duration) { + bool neg = false; + if (epoch < 0) { + neg = true; + epoch = -epoch; + } + + unsigned long days = epoch / 86400; + epoch %= 86400; + unsigned long hours = epoch / 3600; + epoch %= 3600; + unsigned long minutes = epoch / 60; + epoch %= 60; + unsigned long seconds = epoch; + + char timebuf[256]; + snprintf(timebuf, 256, "%sP%luDT%luH%luM%luS", neg ? "-" : "", days, hours, minutes, seconds); + + XMLCh* timeptr = XMLString::transcode(timebuf); + setBuffer(timeptr); + XMLString::release(&timeptr); + } + else { +#ifndef HAVE_GMTIME_R + struct tm* ptime=gmtime(&epoch); +#else + struct tm res; + struct tm* ptime=gmtime_r(&epoch,&res); +#endif + char timebuf[32]; + strftime(timebuf,32,"%Y-%m-%dT%H:%M:%SZ",ptime); + XMLCh* timeptr = XMLString::transcode(timebuf); + setBuffer(timeptr); + XMLString::release(&timeptr); + } +} + // ----------------------------------------------------------------------- // Copy ctor and Assignment operators // ----------------------------------------------------------------------- @@ -495,6 +542,38 @@ int XMLDateTime::getSign() const return 0; } +time_t XMLDateTime::getEpoch(bool duration) const +{ + if (duration) { + time_t epoch = getSecond() + (60 * getMinute()) + (3600 * getHour()) + (86400 * getDay()); + if (getMonth()) + epoch += (((365 * 4) + 1)/48 * 86400); + if (getYear()) + epoch += 365.25 * 86400; + return getSign()!=UTC_NEG ? epoch : -epoch; + } + else { + struct tm t; + t.tm_sec=getSecond(); + t.tm_min=getMinute(); + t.tm_hour=getHour(); + t.tm_mday=getDay(); + t.tm_mon=getMonth()-1; + t.tm_year=getYear()-1900; + t.tm_isdst=0; +#if defined(HAVE_TIMEGM) + return timegm(&t); +#elif defined(WIN32) + // Windows + return mktime(&t) - _timezone; +#else + // Hopefully most others...? + return mktime(&t) - timezone; +#endif + } +} + + // --------------------------------------------------------------------------- // Parsers // --------------------------------------------------------------------------- Modified: xerces/c/trunk/src/xercesc/util/XMLDateTime.hpp URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/XMLDateTime.hpp?rev=1803924&r1=1803923&r2=1803924&view=diff ============================================================================== --- xerces/c/trunk/src/xercesc/util/XMLDateTime.hpp (original) +++ xerces/c/trunk/src/xercesc/util/XMLDateTime.hpp Wed Aug 2 21:14:44 2017 @@ -29,6 +29,8 @@ #include <xercesc/util/SchemaDateTimeException.hpp> #include <xercesc/util/XMLChar.hpp> +#include <time.h> + XERCES_CPP_NAMESPACE_BEGIN class XSValue; @@ -65,6 +67,8 @@ public: XMLDateTime(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); XMLDateTime(const XMLCh* const, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); + XMLDateTime(time_t epoch, bool duration, + MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); ~XMLDateTime(); inline void setBuffer(const XMLCh* const); @@ -132,6 +136,14 @@ public: static int compareOrder(const XMLDateTime* const , const XMLDateTime* const); + int getYear() const {return fValue[CentYear];} + int getMonth() const {return fValue[Month];} + int getDay() const {return fValue[Day];} + int getHour() const {return fValue[Hour];} + int getMinute() const {return fValue[Minute];} + int getSecond() const {return fValue[Second];} + time_t getEpoch(bool duration=false) const; + /*** * Support for Serialization/De-serialization ***/ --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@xerces.apache.org For additional commands, e-mail: commits-h...@xerces.apache.org