# HG changeset patch # User John W. Eaton # Date 1322815898 18000 # Node ID f5bd61eb032f94059361c48f06bb0253fa1eea6a # Parent 2c664266e9d0f590e9973a29e035ad9504ad2977 handle tm_gmtoff field in struct tm * oct-time.h, oct-time.cc (octave_time::tm_gmtoff): New data member. Update all functions that manipulate time fields. (octave_time::gmtoff): New functions. (DEFINE_SET_FIELD_FCN): New macro, adapted from DEFINE_SET_INT_FIELD_FCN. (DEFINE_SET_INT_FIELD_FCN): Define using DEFINE_SET_FIELD_FCN. diff -r 2c664266e9d0 -r f5bd61eb032f liboctave/oct-time.cc --- a/liboctave/oct-time.cc Fri Dec 02 03:51:37 2011 -0500 +++ b/liboctave/oct-time.cc Fri Dec 02 03:51:38 2011 -0500 @@ -52,6 +52,7 @@ t.tm_wday = tm.wday (); t.tm_yday = tm.yday (); t.tm_isdst = tm.isdst (); + t.tm_gmtoff = tm.gmtoff (); #if defined (HAVE_STRUCT_TM_TM_ZONE) std::string s = tm.zone (); @@ -98,29 +99,17 @@ // // So, we no longer check limits here. -#if 0 -#define DEFINE_SET_INT_FIELD_FCN(f, lo, hi) \ +#define DEFINE_SET_FIELD_FCN(type, f, lo, hi) \ octave_base_tm& \ - octave_base_tm::f (int v) \ - { \ - if (v < lo || v > hi) \ - (*current_liboctave_error_handler) \ - ("invalid value specified for " #f); \ - \ - tm_ ## f = v; \ - \ - return *this; \ - } -#else -#define DEFINE_SET_INT_FIELD_FCN(f, lo, hi) \ - octave_base_tm& \ - octave_base_tm::f (int v) \ + octave_base_tm::f (type v) \ { \ tm_ ## f = v; \ \ return *this; \ } -#endif + +#define DEFINE_SET_INT_FIELD_FCN(f, lo, hi) \ + DEFINE_SET_FIELD_FCN (int, f, lo, hi) DEFINE_SET_INT_FIELD_FCN (usec, 0, 1000000) DEFINE_SET_INT_FIELD_FCN (sec, 0, 61) @@ -132,6 +121,7 @@ DEFINE_SET_INT_FIELD_FCN (wday, 0, 6) DEFINE_SET_INT_FIELD_FCN (yday, 0, 365) DEFINE_SET_INT_FIELD_FCN (isdst, 0, 1) +DEFINE_SET_FIELD_FCN (long, gmtoff, -86400, 0) octave_base_tm& octave_base_tm::zone (const std::string& s) @@ -163,6 +153,10 @@ t.tm_yday = tm_yday; t.tm_isdst = tm_isdst; +#if defined (HAVE_STRUCT_TM_GMTOFF) + t.tm_gmtoff = tm_gmtoff; +#endif + #if defined (HAVE_STRUCT_TM_TM_ZONE) char *ps = strsave (tm_zone.c_str ()); t.tm_zone = ps; @@ -215,6 +209,10 @@ tm_yday = t->tm_yday; tm_isdst = t->tm_isdst; +#if defined (HAVE_STRUCT_TM_GMTOFF) + tm_gmtoff = t->tm_gmtoff; +#endif + #if defined (HAVE_STRUCT_TM_TM_ZONE) if (t->tm_zone) tm_zone = t->tm_zone; @@ -259,6 +257,10 @@ t.tm_yday = 0; t.tm_isdst = 0; +#if defined (HAVE_STRUCT_TM_GMTOFF) + t.tm_gmtoff = 0; +#endif + #if defined (HAVE_STRUCT_TM_TM_ZONE) char *ps = strsave (""); t.tm_zone = ps; diff -r 2c664266e9d0 -r f5bd61eb032f liboctave/oct-time.h --- a/liboctave/oct-time.h Fri Dec 02 03:51:37 2011 -0500 +++ b/liboctave/oct-time.h Fri Dec 02 03:51:38 2011 -0500 @@ -174,14 +174,14 @@ octave_base_tm (void) : tm_usec (0), tm_sec (0), tm_min (0), tm_hour (0), tm_mday (0), tm_mon (0), tm_year (0), tm_wday (0), - tm_yday (0), tm_isdst (0), tm_zone ("unknown") + tm_yday (0), tm_isdst (0), tm_gmtoff (0), tm_zone ("unknown") { } octave_base_tm (const octave_base_tm& tm) : tm_usec (tm.tm_usec), tm_sec (tm.tm_sec), tm_min (tm.tm_min), tm_hour (tm.tm_hour), tm_mday (tm.tm_mday), tm_mon (tm.tm_mon), tm_year (tm.tm_year), tm_wday (tm.tm_wday), tm_yday (tm.tm_yday), - tm_isdst (tm.tm_isdst), tm_zone (tm.tm_zone) + tm_isdst (tm.tm_isdst), tm_gmtoff (tm.tm_gmtoff), tm_zone (tm.tm_zone) { } octave_base_tm& operator = (const octave_base_tm& tm) @@ -198,6 +198,7 @@ tm_wday = tm.tm_wday; tm_yday = tm.tm_yday; tm_isdst = tm.tm_isdst; + tm_gmtoff = tm.tm_gmtoff; tm_zone = tm.tm_zone; } @@ -216,6 +217,7 @@ int wday (void) const { return tm_wday; } int yday (void) const { return tm_yday; } int isdst (void) const { return tm_isdst; } + long gmtoff (void) const { return tm_gmtoff; } std::string zone (void) const { return tm_zone; } octave_base_tm& usec (int v); @@ -228,6 +230,7 @@ octave_base_tm& wday (int v); octave_base_tm& yday (int v); octave_base_tm& isdst (int v); + octave_base_tm& gmtoff (long v); octave_base_tm& zone (const std::string& s); std::string strftime (const std::string& fmt) const; @@ -268,6 +271,9 @@ int tm_isdst; // Time zone. + long tm_gmtoff; + + // Time zone. std::string tm_zone; void init (void *p);