OSDN Git Service

* testsuite/lib/libstdc++.exp (libstdc++_init): Require
[pf3gnuchains/gcc-fork.git] / fastjar / dostime.c
index c29d991..10c0bf3 100644 (file)
-/*
-  dostime.c - routines for converting UNIX time to MS-DOS time.  
-
-  Borrowed from Info-zip's unzip
+/* dostime.c - convert dos time to/from time_t.
 
-  Copyright (C) 1999 Bryan Burns
+   Copyright (C) 2002 Free Software Foundation
 
   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2
   of the License, or (at your option) any later version.
-
+  
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
-
+  
   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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
 
-/* $Id: dostime.c,v 1.1.1.1 1999/12/06 03:09:12 toast Exp $
-
-   $Log: dostime.c,v $
-   Revision 1.1.1.1  1999/12/06 03:09:12  toast
-   initial checkin..
-
-
-
-   Revision 1.6  1999/05/10 08:32:26  burnsbr
-   added dos2unixtime
-
-   Revision 1.5  1999/04/27 10:03:50  burnsbr
-   configure support
-
-   Revision 1.4  1999/04/26 21:55:19  burnsbr
-   switched from sys/time.h to time.h for better portability
-
-   Revision 1.3  1999/04/20 08:54:30  burnsbr
-   added GPL comment
-
-   Revision 1.2  1999/04/20 05:10:53  burnsbr
-   added RCS tags
-
-
-*/
-#include "config.h"
+#include <config.h>
 
-#ifdef TM_IN_SYS_TIME
-#include <sys/time.h>
-#else
 #include <time.h>
-#endif
 
-#include "dostime.h"
+#include <stddef.h>
 
-static char rcsid[] = "$Id: dostime.c,v 1.1.1.1 1999/12/06 03:09:12 toast Exp $";
+#include "dostime.h"
 
 /*
-
- Copyright (C) 1990-1997 Mark Adler, Richard B. Wales, Jean-loup Gailly,
- Kai Uwe Rommel, Onno van der Linden and Igor Mandrichenko.
- Permission is granted to any individual or institution to use, copy, or
- redistribute this software so long as all of the original files are included,
- that it is not sold for profit, and that this copyright notice is retained.
-
-*/
-
-
-time_t dos2unixtime(dostime)
-     unsigned long dostime;            /* DOS time to convert */
-     /* Return the Unix time_t value (GMT/UTC time) for the DOS format (local)
-      * time dostime, where dostime is a four byte value (date in most
-      * significant word, time in least significant word), see dostime() 
-      * function.
-      */
+ * The specification to which this was written.  From Joe Buck.
+ * The DOS format appears to have only 2 second resolution.  It is an
+ * unsigned long, and ORs together
+ * 
+ * (year-1980)<<25
+ * month<<21  (month is tm_mon + 1, 1=Jan through 12=Dec)
+ * day<<16    (day is tm_mday, 1-31)
+ * hour<<11   (hour is tm_hour, 0-23)
+ * min<<5         (min is tm_min, 0-59)
+ * sec>>1         (sec is tm_sec, 0-59, that's right, we throw away the LSB)
+ * 
+ * DOS uses local time, so the localtime() call is used to turn the time_t
+ * into a struct tm.
+ */
+
+time_t
+dos2unixtime (unsigned long dostime)
 {
-  struct tm *t;         /* argument for mktime() */
-  time_t clock = time(NULL);
+  struct tm ltime;
+  time_t now = time (NULL);
 
-  t = localtime(&clock);
-  t->tm_isdst = -1;     /* let mktime() determine if DST is in effect */
-  /* Convert DOS time to UNIX time_t format */
-  t->tm_sec  = (((int)dostime) <<  1) & 0x3e;
-  t->tm_min  = (((int)dostime) >>  5) & 0x3f;
-  t->tm_hour = (((int)dostime) >> 11) & 0x1f;
-  t->tm_mday = (int)(dostime >> 16) & 0x1f;
-  t->tm_mon  = ((int)(dostime >> 21) & 0x0f) - 1;
-  t->tm_year = ((int)(dostime >> 25) & 0x7f) + 80;
+  /* Call localtime to initialize timezone in TIME.  */
+  ltime = *localtime (&now);
 
-  return mktime(t);
-}
+  ltime.tm_year = (dostime >> 25) + 80;
+  ltime.tm_mon = ((dostime >> 21) & 0x0f) - 1;
+  ltime.tm_mday = (dostime >> 16) & 0x1f;
+  ltime.tm_hour = (dostime >> 11) & 0x0f;
+  ltime.tm_min = (dostime >> 5) & 0x3f;
+  ltime.tm_sec = (dostime & 0x1f) << 1;
 
-unsigned long dostime(y, n, d, h, m, s)
-int y;                  /* year */
-int n;                  /* month */
-int d;                  /* day */
-int h;                  /* hour */
-int m;                  /* minute */
-int s;                  /* second */
-/* Convert the date y/n/d and time h:m:s to a four byte DOS date and
-   time (date in high two bytes, time in low two bytes allowing magnitude
-   comparison). */
-{
-  return y < 1980 ? dostime(1980, 1, 1, 0, 0, 0) :
-    (((unsigned long)y - 1980) << 25) | ((unsigned long)n << 21) | 
-    ((unsigned long)d << 16) | ((unsigned long)h << 11) | 
-    ((unsigned long)m << 5) | ((unsigned long)s >> 1);
-}
+  ltime.tm_wday = -1;
+  ltime.tm_yday = -1;
+  ltime.tm_isdst = -1;
 
+  return mktime (&ltime);
+}
 
-unsigned long unix2dostime(t)
-time_t *t;             /* unix time to convert */
-/* Return the Unix time t in DOS format, rounded up to the next two
-   second boundary. */
+unsigned long
+unix2dostime (time_t *time)
 {
-  time_t t_even;
-  struct tm *s;         /* result of localtime() */
-
-  t_even = (*t + 1) & (~1);     /* Round up to even seconds. */
-  s = localtime(&t_even);       /* Use local time since MSDOS does. */
-  return dostime(s->tm_year + 1900, s->tm_mon + 1, s->tm_mday,
-                 s->tm_hour, s->tm_min, s->tm_sec);
+  struct tm *ltime = localtime (time);
+  int year = ltime->tm_year - 80;
+  if (year < 0)
+    year = 0;
+
+  return (year << 25
+         | (ltime->tm_mon + 1) << 21
+         | ltime->tm_mday << 16
+         | ltime->tm_hour << 11
+         | ltime->tm_min << 5
+         | ltime->tm_sec >> 1);
 }
-