130 lines
3.9 KiB
C
130 lines
3.9 KiB
C
/*
|
|
dostime.c - routines for converting UNIX time to MS-DOS time.
|
|
|
|
Borrowed from Info-zip's unzip
|
|
|
|
Copyright (C) 1999 Bryan Burns
|
|
|
|
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.
|
|
*/
|
|
|
|
/* $Id: dostime.c,v 1.1 2000/12/09 03:08:23 apbianco Exp $
|
|
|
|
$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>
|
|
#endif
|
|
|
|
#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.
|
|
*/
|
|
{
|
|
struct tm *t; /* argument for mktime() */
|
|
time_t clock = 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;
|
|
|
|
return mktime(t);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
|
|
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. */
|
|
{
|
|
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);
|
|
}
|
|
|