]> git.mxchange.org Git - simgear.git/blobdiff - simgear/timing/lowleveltime.cxx
Fix #1783: repeated error message on console
[simgear.git] / simgear / timing / lowleveltime.cxx
index ec3cf98844e16c46227a72054376683f497cbf81..fc4fb566235d435f6929728a2a951fe7fa81f992 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Library General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA  02111-1307, USA.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  *
  **************************************************************************/
 
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
+
+#include <simgear/structure/exception.hxx>
+
 #include "lowleveltime.h"
 
 
 /* BIG FAT WARNING: NOTICE THAT I HARDCODED ENDIANNES. PLEASE CHANGE THIS */
-#ifndef BIG_ENDIAN 
+#ifndef BIG_ENDIAN
 #define BIG_ENDIAN 4321
 #endif
 
 #define LITTLE_ENDIAN 1234
 #endif
 
-#ifndef BYTE_ORDER 
+#ifndef BYTE_ORDER
 #define BYTE_ORDER LITTLE_ENDIAN
 #endif
 
 
 #ifndef BYTE_ORDER
-#define BYTE_ORDER 
+#define BYTE_ORDER
 #endif
 
 /* END OF BIG FAT WARNING */
@@ -265,7 +267,7 @@ void show(const char *zone, time_t t, int v)
 
 static char *abbr(struct tm *tmp)
 {
-       register char * result;
+       char *  result;
        static char     nada;
 
        if (tmp->tm_isdst != 0 && tmp->tm_isdst != 1)
@@ -304,16 +306,11 @@ static void fgtzset_internal (int always, const char *tz)
     /* User specified the empty string; use UTC explicitly.  */
     tz = "Universal";
 
-#ifdef macintosh
-  /* as you well know, mac paths contain leading colon, this code
-     messes things up.... */
-#else
   /* A leading colon means "implementation defined syntax".
      We ignore the colon and always use the same algorithm:
      try a data file, and if none exists parse the 1003.1 syntax.  */
   if (tz && *tz == ':')
     ++tz;
-#endif
 
   /* Check whether the value changes since the last run.  */
   if (old_fgtz != NULL && tz != NULL && strcmp (tz, old_fgtz) == 0)
@@ -332,22 +329,21 @@ static void fgtzset_internal (int always, const char *tz)
   fgtzfile_read (tz);
   if (use_fgtzfile)
     return;
-  // The default behaviour of the originale tzset_internal (int always, char* tz) 
-  // function is to set up a default timezone, in any casetz file_read() fails
-  // Currently this leads to problems, because it modidifies the system timezone
-  // and not the local aircraft timezone, contained in FlightGear. I could adapt 
+  // The default behaviour of the original tzset_internal (int always, char* tz)
+  // function is to set up a default timezone, in any case file_read() fails
+  // Currently this leads to problems, because it modifies the system timezone
+  // and not the local aircraft timezone, contained in FlightGear. I could adapt
   // this in future versions of this code, but doubt whether this is what we really
-  // want. So right now, exit when timezone information reading failed. 
+  // want. So right now, throw an exception when timezone information reading failed.
   // Guess I'll change that to something like 12 * (FG_LON / 180.0)
-  // 
+  //
   // For now, I'll leave it like this.
   else
   {
-    printf ("Timezone reading failed\n");
-    exit(1);
+    throw sg_exception("Timezone reading failed");
   }
   // this emacs "comment out" function is cool!
+
 //   // /* No data file found.  Default to UTC if nothing specified.  */
 // //   printf ("1. Current local time          = %24s", asctime(localtime(&now)));
 //   if (tz == NULL || *tz == '\0')
@@ -584,7 +580,7 @@ static void fgtzset_internal (int always, const char *tz)
 //       tzr->computed_for = -1;
 //     }
 // //   printf ("10. Current local time          = %24s", asctime(localtime(&now)));
-// 
+//
 }
 
 /************************************************************************/
@@ -631,7 +627,7 @@ static int fgcompute_change (fgtz_rule *rule, int year)
   //     tz_rule *rule;
   // int year;
 {
-  register time_t t;
+  time_t t;
   int y;
 
   if (year != -1 && rule->computed_for == year)
@@ -664,8 +660,8 @@ static int fgcompute_change (fgtz_rule *rule, int year)
     case fgtz_rule::M:
       /* Mm.n.d - Nth "Dth day" of month M.  */
       {
-       register int i, d, m1, yy0, yy1, yy2, dow;
-       register const unsigned short int *myday =
+       int i, d, m1, yy0, yy1, yy2, dow;
+       const unsigned short int *myday =
          &mon_yday[isleap (year)][rule->m];
 
        /* First add SECSPERDAY for each day in months before M.  */
@@ -711,7 +707,7 @@ static int fgcompute_change (fgtz_rule *rule, int year)
 int fgtzfile_compute (time_t timer, int use_localtime,
                  long int *leap_correct, int *leap_hit)
 {
-  register size_t i;
+  size_t i;
 
   if (use_localtime)
     {
@@ -792,10 +788,10 @@ void fgtzfile_read (const char *file)
 {
   // static const char default_tzdir[] = TZDIR;
   size_t num_isstd, num_isgmt;
-  register FILE *f;
+  FILE *f;
   struct tzhead tzhead;
   size_t chars;
-  register size_t i;
+  size_t i;
   struct ttinfo *info;
 
   use_fgtzfile = 0;
@@ -862,8 +858,12 @@ void fgtzfile_read (const char *file)
 //     }
 
   f = fopen (file, "rb");
-  if (f == NULL)
-    return;
+
+  if (f == NULL) {
+      perror( "fgtzfile_read(): " );
+      errno = 0;
+      return;
+  }
 
   if (fread ((void *) &tzhead, sizeof (tzhead), 1, f) != 1)
     goto lose;
@@ -1046,8 +1046,8 @@ void offtime (const time_t *t, long int offset, struct tm *tp)
   // long int offset;
   // struct tm *tp;
 {
-  register long int days, rem, y;
-  register const unsigned short int *ip;
+  long int days, rem, y;
+  const unsigned short int *ip;
 
   days = *t / SECS_PER_DAY;
   rem = *t % SECS_PER_DAY;
@@ -1134,3 +1134,24 @@ char *tzstring (const char* string)
 
   return strncpy (p, string, needed);
 }
+
+time_t sgGMTime()
+{
+    // this was created to fix:
+    // https://code.google.com/p/flightgear-bugs/issues/detail?id=1207
+    // however applying the code on Unix causes bug:
+    // https://code.google.com/p/flightgear-bugs/issues/detail?id=1301
+    // One solution would be to deinfe our own 'timegm' as suggested here:
+    // http://linux.die.net/man/3/timegm
+    // but for the moment we'll assume time(0) on Unix is UTC, and hence we
+    // return it directly.
+
+       time_t now_sec = time(0);
+#if defined(SG_WINDOWS)
+    struct tm now;
+       now = *gmtime(&now_sec);
+    return mktime(&now);
+#else
+       return now_sec;
+#endif
+}