Commit eeff4ca3 by Tom Tromey Committed by Tom Tromey

dostime.c: Rewrote from scratch.

	* dostime.c: Rewrote from scratch.
	* dostime.h (dostime): Removed.

From-SVN: r58892
parent 82396c2a
2002-11-07 Tom Tromey <tromey@redhat.com>
* dostime.c: Rewrote from scratch.
* dostime.h (dostime): Removed.
2002-10-24 Tom Tromey <tromey@redhat.com>
* dostime.c: Removed Id and Log.
2002-10-20 Tom Tromey <tromey@redhat.com> 2002-10-20 Tom Tromey <tromey@redhat.com>
* jartool.c: Use mode 0666 when opening new file. * jartool.c: Use mode 0666 when opening new file.
......
/* /* dostime.c - convert dos time to/from time_t.
dostime.c - routines for converting UNIX time to MS-DOS time.
Borrowed from Info-zip's unzip
Copyright (C) 1999 Bryan Burns Copyright (C) 2002 Free Software Foundation
This program is free software; you can redistribute it and/or This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License modify it under the terms of the GNU General Public License
...@@ -20,110 +17,60 @@ ...@@ -20,110 +17,60 @@
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
/* $Id: dostime.c,v 1.1 2000/12/09 03:08:23 apbianco Exp $ #include <config.h>
$Log: dostime.c,v $
Revision 1.1 2000/12/09 03:08:23 apbianco
2000-12-08 Alexandre Petit-Bianco <apbianco@cygnus.com>
* fastjar: Imported.
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"
#ifdef TM_IN_SYS_TIME
#include <sys/time.h>
#else
#include <time.h> #include <time.h>
#endif
#include "dostime.h" #include "dostime.h"
/* /*
* The specification to which this was written. From Joe Buck.
Copyright (C) 1990-1997 Mark Adler, Richard B. Wales, Jean-loup Gailly, * The DOS format appears to have only 2 second resolution. It is an
Kai Uwe Rommel, Onno van der Linden and Igor Mandrichenko. * unsigned long, and ORs together
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, * (year-1980)<<25
that it is not sold for profit, and that this copyright notice is retained. * 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)
time_t dos2unixtime(dostime) *
unsigned long dostime; /* DOS time to convert */ * DOS uses local time, so the localtime() call is used to turn the time_t
/* Return the Unix time_t value (GMT/UTC time) for the DOS format (local) * into a struct tm.
* time dostime, where dostime is a four byte value (date in most
* significant word, time in least significant word), see dostime()
* function.
*/ */
time_t
dos2unixtime (unsigned long dostime)
{ {
struct tm *t; /* argument for mktime() */ struct tm ltime;
time_t clock = time(NULL); time_t now = time (NULL);
t = localtime(&clock); /* Call localtime to initialize timezone in TIME. */
t->tm_isdst = -1; /* let mktime() determine if DST is in effect */ ltime = *localtime (&now);
/* 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;
return mktime(t); ltime.tm_year = (dostime >> 25) + 80;
} ltime.tm_mon = 1 + ((dostime >> 21) & 0x0f);
ltime.tm_mday = (dostime >> 16) & 0x1f;
ltime.tm_hour = (dostime >> 11) & 0x0f;
ltime.tm_min = (dostime >> 5) & 0x3f;
ltime.tm_sec = (dostime & 0x0f) << 1;
unsigned long dostime(y, n, d, h, m, s) ltime.tm_wday = -1;
int y; /* year */ ltime.tm_yday = -1;
int n; /* month */ ltime.tm_isdst = -1;
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);
}
return mktime (&ltime);
}
unsigned long unix2dostime(t) unsigned long
time_t *t; /* unix time to convert */ unix2dostime (time_t *time)
/* Return the Unix time t in DOS format, rounded up to the next two
second boundary. */
{ {
time_t t_even; struct tm *ltime = localtime (time);
struct tm *s; /* result of localtime() */
return ((ltime->tm_year - 80) << 25
t_even = (*t + 1) & (~1); /* Round up to even seconds. */ | ltime->tm_mon << 21
s = localtime(&t_even); /* Use local time since MSDOS does. */ | (ltime->tm_mday - 1) << 16
return dostime(s->tm_year + 1900, s->tm_mon + 1, s->tm_mday, | ltime->tm_hour << 11
s->tm_hour, s->tm_min, s->tm_sec); | ltime->tm_min << 5
| ltime->tm_sec >> 1);
} }
/* /*
dostime.h - function prototypes dostime.h - function prototypes
Copyright (C) 1999 Bryan Burns Copyright (C) 1999, 2002 Bryan Burns
This program is free software; you can redistribute it and/or This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License modify it under the terms of the GNU General Public License
...@@ -18,5 +18,4 @@ ...@@ -18,5 +18,4 @@
*/ */
time_t dos2unixtime(unsigned long dostime); time_t dos2unixtime(unsigned long dostime);
unsigned long dostime(int, int, int, int, int, int);
unsigned long unix2dostime(time_t*); unsigned long unix2dostime(time_t*);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment