made a lot of changes
This commit is contained in:
		
							parent
							
								
									e00f89ea6f
								
							
						
					
					
						commit
						6e2b44962f
					
				
					 14 changed files with 546 additions and 170 deletions
				
			
		
							
								
								
									
										14
									
								
								lang/cem/libcc.ansi/time/.distr
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								lang/cem/libcc.ansi/time/.distr
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
LIST
 | 
			
		||||
Makefile
 | 
			
		||||
asctime.c
 | 
			
		||||
clock.c
 | 
			
		||||
ctime.c
 | 
			
		||||
difftime.c
 | 
			
		||||
gmtime.c
 | 
			
		||||
loc_incl.h
 | 
			
		||||
localtime.c
 | 
			
		||||
misc.c
 | 
			
		||||
mktime.c
 | 
			
		||||
strftime.c
 | 
			
		||||
time.c
 | 
			
		||||
tzset.c
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,3 @@
 | 
			
		|||
tlib
 | 
			
		||||
loc_incl.h
 | 
			
		||||
ctime.c
 | 
			
		||||
asctime.c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										22
									
								
								lang/cem/libcc.ansi/time/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								lang/cem/libcc.ansi/time/Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
CFLAGS=-L -LIB
 | 
			
		||||
 | 
			
		||||
.SUFFIXES: .o .e .c
 | 
			
		||||
 | 
			
		||||
.e.o:
 | 
			
		||||
	$(CC) $(CFLAGS) -c -o $@ $*.e
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -rf ctime.o asctime.o localtime.o clock.o difftime.o gmtime.o \
 | 
			
		||||
		mktime.o strftime.o time.o tzset.o misc.o OLIST
 | 
			
		||||
 | 
			
		||||
ctime.o:
 | 
			
		||||
asctime.o:
 | 
			
		||||
localtime.o:
 | 
			
		||||
clock.o:
 | 
			
		||||
difftime.o:
 | 
			
		||||
gmtime.o:
 | 
			
		||||
mktime.o:
 | 
			
		||||
strftime.o:
 | 
			
		||||
time.o:
 | 
			
		||||
tzset.o:
 | 
			
		||||
misc.o:
 | 
			
		||||
| 
						 | 
				
			
			@ -3,7 +3,6 @@
 | 
			
		|||
 */
 | 
			
		||||
/* $Header$ */
 | 
			
		||||
 | 
			
		||||
#include	<stdio.h>
 | 
			
		||||
#include	<string.h>
 | 
			
		||||
#include	<time.h>
 | 
			
		||||
#include	"loc_incl.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +35,8 @@ four_digits(register char *pb, int i)
 | 
			
		|||
char *asctime(const struct tm *timeptr)
 | 
			
		||||
{
 | 
			
		||||
	static char buf[26];
 | 
			
		||||
	register char *pb = buf, *ps;
 | 
			
		||||
	register char *pb = buf;
 | 
			
		||||
	register const char *ps;
 | 
			
		||||
	register int n;
 | 
			
		||||
 | 
			
		||||
	strcpy(pb, DATE_STR);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,16 +4,82 @@
 | 
			
		|||
/* $Header$ */
 | 
			
		||||
 | 
			
		||||
#include	<time.h>
 | 
			
		||||
#include	<sys/time.h>
 | 
			
		||||
#include	<sys/resource.h>
 | 
			
		||||
 | 
			
		||||
#if	defined(__BSD4_2)
 | 
			
		||||
 | 
			
		||||
struct timeval {
 | 
			
		||||
	long	tv_sec;			/* seconds */
 | 
			
		||||
	long	tv_usec;		/* and microseconds */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define	RUSAGE_SELF	0
 | 
			
		||||
#define	RUSAGE_CHILDREN	-1
 | 
			
		||||
 | 
			
		||||
struct rusage {
 | 
			
		||||
	struct timeval ru_utime;	/* user time used */
 | 
			
		||||
	struct timeval ru_stime;	/* system time used */
 | 
			
		||||
	long	ru_maxrss;
 | 
			
		||||
	long	ru_ixrss;		/* integral shared memory size */
 | 
			
		||||
	long	ru_idrss;		/* integral unshared data size */
 | 
			
		||||
	long	ru_isrss;		/* integral unshared stack size */
 | 
			
		||||
	long	ru_minflt;		/* page reclaims */
 | 
			
		||||
	long	ru_majflt;		/* page faults */
 | 
			
		||||
	long	ru_nswap;		/* swaps */
 | 
			
		||||
	long	ru_inblock;		/* block input operations */
 | 
			
		||||
	long	ru_oublock;		/* block output operations */
 | 
			
		||||
	long	ru_msgsnd;		/* messages sent */
 | 
			
		||||
	long	ru_msgrcv;		/* messages received */
 | 
			
		||||
	long	ru_nsignals;		/* signals received */
 | 
			
		||||
	long	ru_nvcsw;		/* voluntary context switches */
 | 
			
		||||
	long	ru_nivcsw;		/* involuntary context switches */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void getrusage(int who, struct rusage *rusage);
 | 
			
		||||
 | 
			
		||||
#elif	defined(_POSIX_SOURCE) || defined(__USG)
 | 
			
		||||
 | 
			
		||||
struct tms {
 | 
			
		||||
	time_t	tms_utime;		/* user time */
 | 
			
		||||
	time_t	tms_stime;		/* system time */
 | 
			
		||||
	time_t	tms_cutime;		/* user time, children */
 | 
			
		||||
	time_t	tms_cstime;		/* system time, children */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
long times(struct tms *buffer);
 | 
			
		||||
 | 
			
		||||
#else					/* Version 7 UNIX */
 | 
			
		||||
 | 
			
		||||
struct tbuffer {
 | 
			
		||||
	long proc_user_time;
 | 
			
		||||
	long proc_system_time;
 | 
			
		||||
	long child_user_time;
 | 
			
		||||
	long child_system_time;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
long times(struct tbuffer *buffer);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
clock_t
 | 
			
		||||
clock(void)
 | 
			
		||||
{
 | 
			
		||||
#if	defined(__BSD4_2)
 | 
			
		||||
	struct rusage rusage;
 | 
			
		||||
 | 
			
		||||
	getrusage(RUSAGE_SELF, &rusage);
 | 
			
		||||
 | 
			
		||||
	return (((unsigned long)rusage.ru_utime.tv_sec * CLK_TCK)
 | 
			
		||||
		    + rusage.ru_utime.tv_usec);
 | 
			
		||||
	return (((unsigned long)rusage.ru_utime.tv_sec * CLOCKS_PER_SEC)
 | 
			
		||||
		+ rusage.ru_utime.tv_usec);
 | 
			
		||||
#elif	defined(_POSIX_SOURCE) || defined(__USG)
 | 
			
		||||
	struct tms tms;
 | 
			
		||||
 | 
			
		||||
	times(&tms);
 | 
			
		||||
	/* Assume that time_t can be converted to clock_t for Sys5 */
 | 
			
		||||
	return tms.tms_utime;
 | 
			
		||||
#else
 | 
			
		||||
	struct tbuffer tbuffer;
 | 
			
		||||
 | 
			
		||||
	times(&tbuffer);
 | 
			
		||||
	return tbuffer.proc_user_time;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * difftime - compute the difference bnetween two calendar times
 | 
			
		||||
 * difftime - compute the difference between two calendar times
 | 
			
		||||
 */
 | 
			
		||||
/* $Header$ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ gmtime(register const time_t *timer)
 | 
			
		|||
	register struct tm *timep = &br_time;
 | 
			
		||||
	time_t time = *timer;
 | 
			
		||||
	register unsigned long dayclock, dayno;
 | 
			
		||||
	int year = 1970;
 | 
			
		||||
	int year = EPOCH_YR;
 | 
			
		||||
 | 
			
		||||
	dayclock = time % SECS_DAY;
 | 
			
		||||
	dayno = time / SECS_DAY;
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ gmtime(register const time_t *timer)
 | 
			
		|||
		dayno -= YEARSIZE(year);
 | 
			
		||||
		year++;
 | 
			
		||||
	}
 | 
			
		||||
	timep->tm_year = year - YEAR1;
 | 
			
		||||
	timep->tm_year = year - YEAR0;
 | 
			
		||||
	timep->tm_yday = dayno;
 | 
			
		||||
	timep->tm_mon = 0;
 | 
			
		||||
	while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,18 +3,24 @@
 | 
			
		|||
 */
 | 
			
		||||
/* $Header$ */
 | 
			
		||||
 | 
			
		||||
#define	YEAR1		1900			/* the first year */
 | 
			
		||||
#define	YEAR0		1900			/* the first year */
 | 
			
		||||
#define	EPOCH_YR	1970		/* EPOCH = Jan 1 1970 00:00:00 */
 | 
			
		||||
#define	SECS_DAY	(24L * 60L * 60L)
 | 
			
		||||
#define	LEAPYEAR(year)	(!((year) % 4) && (((year) % 100) || !((year) % 400)))
 | 
			
		||||
#define	YEARSIZE(year)	(LEAPYEAR(year) ? 366 : 365)
 | 
			
		||||
#define	FIRSTSUNDAY(year)	(((year)->tm_yday - (year)->tm_wday + 420) % 7)
 | 
			
		||||
#define	FIRSTSUNDAY(timp)	(((timp)->tm_yday - (timp)->tm_wday + 420) % 7)
 | 
			
		||||
#define	FIRSTDAYOF(timp)	(((timp)->tm_wday - (timp)->tm_yday + 420) % 7)
 | 
			
		||||
#define	TIME_MAX	ULONG_MAX
 | 
			
		||||
#define	ABB_LEN		3
 | 
			
		||||
 | 
			
		||||
extern const int _ytab[2][12];
 | 
			
		||||
extern const char *_days[];
 | 
			
		||||
extern const char *_months[];
 | 
			
		||||
extern char *__tzname[];
 | 
			
		||||
 | 
			
		||||
long int _tzone(void);
 | 
			
		||||
void _tzset(void);
 | 
			
		||||
unsigned _dstget(struct tm *timep);
 | 
			
		||||
 | 
			
		||||
extern long _timezone;
 | 
			
		||||
extern long _dst_off;
 | 
			
		||||
extern int _daylight;
 | 
			
		||||
extern char *_tzname[2];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,16 +16,18 @@ struct tm *
 | 
			
		|||
localtime(const time_t *timer)
 | 
			
		||||
{
 | 
			
		||||
	struct tm *timep;
 | 
			
		||||
	long tz = _tzone();
 | 
			
		||||
	unsigned dst;
 | 
			
		||||
 | 
			
		||||
	_tzset();
 | 
			
		||||
	timep = gmtime(timer);			/* tm->tm_isdst == 0 */
 | 
			
		||||
	timep->tm_min -= tz / 60;
 | 
			
		||||
	timep->tm_min -= _timezone / 60;
 | 
			
		||||
	timep->tm_sec -= _timezone % 60;
 | 
			
		||||
	mktime(timep);
 | 
			
		||||
 | 
			
		||||
	dst = _dstget(timep);
 | 
			
		||||
	if (dst) {
 | 
			
		||||
		timep->tm_min += dst / 60;
 | 
			
		||||
		timep->tm_sec += dst % 60;
 | 
			
		||||
		mktime(timep);
 | 
			
		||||
	}
 | 
			
		||||
	return timep;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,101 +3,308 @@
 | 
			
		|||
 */
 | 
			
		||||
/* $Header$ */
 | 
			
		||||
 | 
			
		||||
#include	<ctype.h>
 | 
			
		||||
#include	<time.h>
 | 
			
		||||
#include	<stdlib.h>
 | 
			
		||||
#include	<string.h>
 | 
			
		||||
 | 
			
		||||
#ifdef	__BSD4_2
 | 
			
		||||
#include	<sys/time.h>
 | 
			
		||||
#elif	!defined(__USG)
 | 
			
		||||
struct timeb
 | 
			
		||||
{
 | 
			
		||||
	timez_t	time;
 | 
			
		||||
	unsigned short millitm;
 | 
			
		||||
	short timezone;
 | 
			
		||||
	short dstflag;
 | 
			
		||||
#if	defined(__BSD4_2)
 | 
			
		||||
 | 
			
		||||
struct timeval {
 | 
			
		||||
	long	tv_sec;		/* seconds */
 | 
			
		||||
	long	tv_usec;	/* and microseconds */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct timezone {
 | 
			
		||||
	int	tz_minuteswest;	/* minutes west of Greenwich */
 | 
			
		||||
	int	tz_dsttime;	/* type of dst correction */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int gettimeofday(struct timeval *tp, struct timezone *tzp);
 | 
			
		||||
 | 
			
		||||
#elif !defined(_POSIX_SOURCE) && !defined(__USG)
 | 
			
		||||
#if	!defined(_MINIX)	/* MINIX has no ftime() */
 | 
			
		||||
struct timeb {
 | 
			
		||||
	long	time;
 | 
			
		||||
	undigned short millitm;
 | 
			
		||||
	short	timezone;
 | 
			
		||||
	short	dstflag;
 | 
			
		||||
};
 | 
			
		||||
void ftime(struct timeb *bp);
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include	"loc_incl.h"
 | 
			
		||||
 | 
			
		||||
#ifdef	__USG
 | 
			
		||||
long	timezone = -1 * 60;
 | 
			
		||||
/* The following define of TZ_LEN must match the number of characters
 | 
			
		||||
 * of the elements of tzname.
 | 
			
		||||
 */
 | 
			
		||||
#define	TZ_LEN		10
 | 
			
		||||
#define	RULE_LEN	120
 | 
			
		||||
 | 
			
		||||
#if	defined(__USG) || defined(_POSIX_SOURCE)
 | 
			
		||||
char	*tzname[2] = {"MET\0\0\0\0\0\0\0", "MDT\0\0\0\0\0\0\0"};
 | 
			
		||||
 | 
			
		||||
#if	defined(__USG)
 | 
			
		||||
long	timezone = -1 * 60 * 60;
 | 
			
		||||
int	daylight = 1;
 | 
			
		||||
char	*tzname[] = {"MET", "MDT",};
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
long	__timezone = -1 * 60;
 | 
			
		||||
static	int __daylight = 1;
 | 
			
		||||
char	*__tzname[] = {"MET", "MDT",};
 | 
			
		||||
long	_timezone = -1 * 60 * 60;
 | 
			
		||||
long	_dst_off = 60 * 60;
 | 
			
		||||
int	_daylight = -1;
 | 
			
		||||
char	*_tzname[2] = {"MET\0\0\0\0\0\0\0", "MDT\0\0\0\0\0\0\0"};
 | 
			
		||||
 | 
			
		||||
static struct dsttype {
 | 
			
		||||
	char ds_type;		/* Unknown, Julian, Zero-based or M */
 | 
			
		||||
	int ds_date[3];		/* months, weeks, days */
 | 
			
		||||
	long ds_sec;		/* usually 02:00:00 */
 | 
			
		||||
}	dststart = { 'U', { 0, 0, 0 }, 2 * 60 * 60 }
 | 
			
		||||
	, dstend = { 'U', { 0, 0, 0 }, 2 * 60 * 60 };
 | 
			
		||||
 | 
			
		||||
const char *_days[] = {
 | 
			
		||||
		    "Sunday", "Monday", "Tuesday", "Wednesday",
 | 
			
		||||
		    "Thursday", "Friday", "Saturday"
 | 
			
		||||
	    };
 | 
			
		||||
			"Sunday", "Monday", "Tuesday", "Wednesday",
 | 
			
		||||
			"Thursday", "Friday", "Saturday"
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
const char *_months[] = {
 | 
			
		||||
		    "January", "February", "March",
 | 
			
		||||
		    "April", "May", "June",
 | 
			
		||||
		    "July", "August", "September",
 | 
			
		||||
		    "October", "November", "December"
 | 
			
		||||
	    };
 | 
			
		||||
			"January", "February", "March",
 | 
			
		||||
			"April", "May", "June",
 | 
			
		||||
			"July", "August", "September",
 | 
			
		||||
			"October", "November", "December"
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
const int _ytab[2][12] = {
 | 
			
		||||
		{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
 | 
			
		||||
		{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
_leap(int year)
 | 
			
		||||
static const char *
 | 
			
		||||
parseZoneName(register char *buf, register const char *p)
 | 
			
		||||
{
 | 
			
		||||
	return (!(year % 4) && ((year % 100) || !(year % 400)));
 | 
			
		||||
	register int n = 0;
 | 
			
		||||
 | 
			
		||||
	if (*p == ':') return NULL;
 | 
			
		||||
	while (*p && !isdigit(*p) && *p != ',' && *p != '-' && *p != '+') {
 | 
			
		||||
		if (n < TZ_LEN)
 | 
			
		||||
			*buf++ = *p;
 | 
			
		||||
		p++;
 | 
			
		||||
		n++;
 | 
			
		||||
	}
 | 
			
		||||
	if (n < 3) return NULL;				/* error */
 | 
			
		||||
	*buf = '\0';
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long
 | 
			
		||||
_tzone(void)
 | 
			
		||||
static const char *
 | 
			
		||||
parseTime(register long *tm, const char *p, register struct dsttype *dst)
 | 
			
		||||
{
 | 
			
		||||
	register char *p = getenv("TZ");
 | 
			
		||||
	register int n = 0;
 | 
			
		||||
	int sign = 1;
 | 
			
		||||
	register const char *q = p;
 | 
			
		||||
	char ds_type = (dst ? dst->ds_type : '\0');
 | 
			
		||||
 | 
			
		||||
	if (dst) dst->ds_type = 'U';
 | 
			
		||||
 | 
			
		||||
	*tm = 0;
 | 
			
		||||
	while(*p >= '0' && *p <= '9') {
 | 
			
		||||
		n = 10 * n + (*p++ - '0');
 | 
			
		||||
	}
 | 
			
		||||
	if (q == p) return NULL;	/* "The hour shall be required" */
 | 
			
		||||
	if (n < 0 || n >= 24)	return NULL;
 | 
			
		||||
	*tm = n * 60 * 60;
 | 
			
		||||
	if (*p == ':') {
 | 
			
		||||
		p++;
 | 
			
		||||
		n = 0;
 | 
			
		||||
		while(*p >= '0' && *p <= '9') {
 | 
			
		||||
			n = 10 * n + (*p++ - '0');
 | 
			
		||||
		}
 | 
			
		||||
		if (q == p) return NULL;	/* format error */
 | 
			
		||||
		if (n < 0 || n >= 60)	return NULL;
 | 
			
		||||
		*tm += n * 60;
 | 
			
		||||
		if (*p == ':') {
 | 
			
		||||
			p++;
 | 
			
		||||
			n = 0;
 | 
			
		||||
			while(*p >= '0' && *p <= '9') {
 | 
			
		||||
				n = 10 * n + (*p++ - '0');
 | 
			
		||||
			}
 | 
			
		||||
			if (q == p) return NULL;	/* format error */
 | 
			
		||||
			if (n < 0 || n >= 60)	return NULL;
 | 
			
		||||
			*tm += n;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (dst) {
 | 
			
		||||
		dst->ds_type = ds_type;
 | 
			
		||||
		dst->ds_sec = *tm;
 | 
			
		||||
	}
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
parseDate(register char *buf, register const char *p, struct dsttype *dstinfo)
 | 
			
		||||
{
 | 
			
		||||
	register const char *q;
 | 
			
		||||
	register int n = 0;
 | 
			
		||||
	int cnt = 0;
 | 
			
		||||
	const int bnds[3][2] =	{	{ 1, 12 },
 | 
			
		||||
					{ 1, 5 },
 | 
			
		||||
					{ 0, 6}
 | 
			
		||||
				 };
 | 
			
		||||
	char ds_type;
 | 
			
		||||
 | 
			
		||||
	if (*p != 'M') {
 | 
			
		||||
		if (*p == 'J') {
 | 
			
		||||
			*buf++ = *p++;
 | 
			
		||||
			ds_type = 'J';
 | 
			
		||||
		}
 | 
			
		||||
		else	ds_type = 'Z';
 | 
			
		||||
		q = p;
 | 
			
		||||
		while(*p >= '0' && *p <= '9') {
 | 
			
		||||
			n = 10 * n + (*p - '0');
 | 
			
		||||
			*buf++ = *p++;
 | 
			
		||||
		}
 | 
			
		||||
		if (q == p) return NULL;	/* format error */
 | 
			
		||||
		if (n < (ds_type == 'J') || n > 365) return NULL;
 | 
			
		||||
		dstinfo->ds_type = ds_type;
 | 
			
		||||
		dstinfo->ds_date[0] = n;
 | 
			
		||||
		return p;
 | 
			
		||||
	}
 | 
			
		||||
	ds_type = 'M';
 | 
			
		||||
	do {
 | 
			
		||||
		*buf++ = *p++;
 | 
			
		||||
		q = p;
 | 
			
		||||
		n = 0;
 | 
			
		||||
		while(*p >= '0' && *p <= '9') {
 | 
			
		||||
			n = 10 * n + (*p - '0');
 | 
			
		||||
			*buf++ = *p++;
 | 
			
		||||
		}
 | 
			
		||||
		if (q == p) return NULL;	/* format error */
 | 
			
		||||
		if (n < bnds[cnt][0] || n > bnds[cnt][1]) return NULL;
 | 
			
		||||
		dstinfo->ds_date[cnt] = n;
 | 
			
		||||
		cnt++;
 | 
			
		||||
	} while (cnt < 3 && *p == '.');
 | 
			
		||||
	if (cnt != 3) return NULL;
 | 
			
		||||
	*buf = '\0';
 | 
			
		||||
	dstinfo->ds_type = ds_type;
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
parseRule(register char *buf, register const char *p)
 | 
			
		||||
{
 | 
			
		||||
	long time;
 | 
			
		||||
	register const char *q;
 | 
			
		||||
 | 
			
		||||
	if (!(p = parseDate(buf, p, &dststart))) return NULL;
 | 
			
		||||
	buf += strlen(buf);
 | 
			
		||||
	if (*p == '/') {
 | 
			
		||||
		q = ++p;
 | 
			
		||||
		if (!(p = parseTime(&time, p, &dststart))) return NULL;
 | 
			
		||||
		while( p != q) *buf++ = *q++;
 | 
			
		||||
	}
 | 
			
		||||
	if (*p != ',') return NULL;
 | 
			
		||||
	p++;
 | 
			
		||||
	if (!(p = parseDate(buf, p, &dstend))) return NULL;
 | 
			
		||||
	buf += strlen(buf);
 | 
			
		||||
	if (*p == '/') {
 | 
			
		||||
		q = ++p;
 | 
			
		||||
		if (!(p = parseTime(&time, p, &dstend))) return NULL;
 | 
			
		||||
		while(*buf++ = *q++);
 | 
			
		||||
	}
 | 
			
		||||
	if (*p) return NULL;
 | 
			
		||||
	return p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The following routine parses timezone information in POSIX-format. For
 | 
			
		||||
 * the requirements, see IEEE Std 1003.1-1988 section 8.1.1.
 | 
			
		||||
 * The function returns as soon as it spots an error.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
parseTZ(const char *p)
 | 
			
		||||
{
 | 
			
		||||
	register int n;
 | 
			
		||||
	long tz, dst = 60 * 60, sign = 1;
 | 
			
		||||
	static char lastTZ[2 * RULE_LEN];
 | 
			
		||||
	static char buffer[RULE_LEN];
 | 
			
		||||
 | 
			
		||||
	if (!p) return;
 | 
			
		||||
 | 
			
		||||
	if (!strcmp(lastTZ, p)) return;		/* nothing changed */
 | 
			
		||||
 | 
			
		||||
	*_tzname[0] = '\0';
 | 
			
		||||
	*_tzname[1] = '\0';
 | 
			
		||||
	dststart.ds_type = 'U';
 | 
			
		||||
	dststart.ds_sec = 2 * 60 * 60;
 | 
			
		||||
	dstend.ds_type = 'U';
 | 
			
		||||
	dstend.ds_sec = 2 * 60 * 60;
 | 
			
		||||
 | 
			
		||||
	if (strlen(p) > 2 * RULE_LEN) return;
 | 
			
		||||
	strcpy(lastTZ, p);
 | 
			
		||||
 | 
			
		||||
	if (!(p = parseZoneName(buffer, p))) return;
 | 
			
		||||
 | 
			
		||||
	if (*p == '-') {
 | 
			
		||||
		sign = -1;
 | 
			
		||||
		p++;
 | 
			
		||||
	} else if (*p == '+') p++;
 | 
			
		||||
 | 
			
		||||
	if (!(p = parseTime(&tz, p, NULL))) return;
 | 
			
		||||
	tz *= sign;
 | 
			
		||||
	_timezone = tz;
 | 
			
		||||
	strncpy(_tzname[0], buffer, TZ_LEN);
 | 
			
		||||
 | 
			
		||||
	if (!(_daylight = (*p != '\0'))) return;
 | 
			
		||||
 | 
			
		||||
	buffer[0] = '\0';
 | 
			
		||||
	if (!(p = parseZoneName(buffer, p))) return;
 | 
			
		||||
	strncpy(_tzname[1], buffer, TZ_LEN);
 | 
			
		||||
 | 
			
		||||
	buffer[0] = '\0';
 | 
			
		||||
	if (*p && (*p != ','))
 | 
			
		||||
		if (!(p = parseTime(&dst, p, NULL))) return;
 | 
			
		||||
	_dst_off = dst;			/* dst was initialized to 1 hour */
 | 
			
		||||
	if (*p) {
 | 
			
		||||
		if (*p != ',') return;
 | 
			
		||||
		p++;
 | 
			
		||||
		if (strlen(p) > RULE_LEN) return;
 | 
			
		||||
		if (!(p = parseRule(buffer, p))) return;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_tzset(void)
 | 
			
		||||
{
 | 
			
		||||
#if	defined(__BSD4_2)
 | 
			
		||||
 | 
			
		||||
#ifdef	__BSD4_2
 | 
			
		||||
	struct timeval tv;
 | 
			
		||||
	struct timezone tz;
 | 
			
		||||
 | 
			
		||||
	gettimeofday(&tv, &tz);
 | 
			
		||||
	__daylight = tz.tz_dsttime;
 | 
			
		||||
	__timezone = tz.tz_minuteswest * 60;
 | 
			
		||||
	_daylight = tz.tz_dsttime;
 | 
			
		||||
	_timezone = tz.tz_minuteswest * 60;
 | 
			
		||||
 | 
			
		||||
#elif !defined(__USG)
 | 
			
		||||
#elif !defined(_POSIX_SOURCE) && !defined(__USG)
 | 
			
		||||
 | 
			
		||||
#if	!defined(_MINIX)		/* MINIX has no ftime() */
 | 
			
		||||
	struct timeb time;
 | 
			
		||||
 | 
			
		||||
	ftime(&time);
 | 
			
		||||
	__timezone = time.timezone * 60L;
 | 
			
		||||
	__daylight = time.dstflag;
 | 
			
		||||
	_timezone = time.timezone * 60L;
 | 
			
		||||
	_daylight = time.dstflag;
 | 
			
		||||
#endif
 | 
			
		||||
	if (p && *p) {
 | 
			
		||||
		strncpy(__tzname[0], p, 3);
 | 
			
		||||
		p += 3;
 | 
			
		||||
		if (*p == '-') {
 | 
			
		||||
			sign = -1;
 | 
			
		||||
			p++;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		while (*p >= '0' && *p <= '9')
 | 
			
		||||
			n = 10 * n + (*p++ - '0');
 | 
			
		||||
		n *= sign;
 | 
			
		||||
		__timezone = ((long)(n * 60)) * 60;
 | 
			
		||||
		__daylight = (*p != '\0');
 | 
			
		||||
		strncpy(__tzname[1], p, 3);
 | 
			
		||||
	}
 | 
			
		||||
#ifdef	__USG
 | 
			
		||||
	timezone = __timezone;
 | 
			
		||||
	daylight = __daylight;
 | 
			
		||||
	tzname[0] = __tzname[0];
 | 
			
		||||
	tzname[1] = __tzname[1];
 | 
			
		||||
#endif	/* !_POSIX_SOURCE && !__USG */
 | 
			
		||||
 | 
			
		||||
	parseTZ(getenv("TZ"));		/* should go inside #if */
 | 
			
		||||
 | 
			
		||||
#if	defined(__USG) || defined(_POSIX_SOURCE)
 | 
			
		||||
	tzname[0] = _tzname[0];
 | 
			
		||||
	tzname[1] = _tzname[1];
 | 
			
		||||
#if	defined(__USG)
 | 
			
		||||
	timezone = _timezone;
 | 
			
		||||
	daylight = _daylight;
 | 
			
		||||
#endif
 | 
			
		||||
	return __timezone;
 | 
			
		||||
#endif	/* __USG || _POSIX_SOURCE */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
| 
						 | 
				
			
			@ -105,36 +312,79 @@ last_sunday(register int day, register struct tm *timep)
 | 
			
		|||
{
 | 
			
		||||
	int first = FIRSTSUNDAY(timep);
 | 
			
		||||
 | 
			
		||||
	if (day >= 58 && LEAPYEAR(1900 + timep->tm_year)) day++;
 | 
			
		||||
	if (day >= 58 && LEAPYEAR(YEAR0 + timep->tm_year)) day++;
 | 
			
		||||
	if (day < first) return first;
 | 
			
		||||
	return day - (day - first) % 7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
date_of(register struct dsttype *dst, struct tm *timep)
 | 
			
		||||
{
 | 
			
		||||
	int leap = LEAPYEAR(YEAR0 + timep->tm_year);
 | 
			
		||||
	int firstday, tmpday;
 | 
			
		||||
	register int day, month;
 | 
			
		||||
 | 
			
		||||
	if (dst->ds_type != 'M') {
 | 
			
		||||
		return dst->ds_date[0] -
 | 
			
		||||
			    (dst->ds_type == 'J'
 | 
			
		||||
				&& leap
 | 
			
		||||
				&& dst->ds_date[0] < 58);
 | 
			
		||||
	}
 | 
			
		||||
	day = 0;
 | 
			
		||||
	month = 1;
 | 
			
		||||
	while (month < dst->ds_date[0]) {
 | 
			
		||||
		day += _ytab[leap][month - 1];
 | 
			
		||||
		month++;
 | 
			
		||||
	}
 | 
			
		||||
	firstday = (day + FIRSTDAYOF(timep)) % 7;
 | 
			
		||||
	tmpday = day;
 | 
			
		||||
	day += (dst->ds_date[2] - firstday + 7) % 7
 | 
			
		||||
		+ 7 * (dst->ds_date[1] - 1);
 | 
			
		||||
	if (day >= tmpday + _ytab[leap][month]) day -= 7;
 | 
			
		||||
	return day;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned
 | 
			
		||||
_dstget(struct tm *timep)
 | 
			
		||||
_dstget(register struct tm *timep)
 | 
			
		||||
{
 | 
			
		||||
	int begindst, enddst;
 | 
			
		||||
	register struct dsttype *dsts = &dststart, *dste = &dstend;
 | 
			
		||||
 | 
			
		||||
	if(__daylight == -1)
 | 
			
		||||
		_tzone();
 | 
			
		||||
	if (_daylight == -1)
 | 
			
		||||
		_tzset();
 | 
			
		||||
 | 
			
		||||
	timep->tm_isdst = __daylight;
 | 
			
		||||
	if (!__daylight) return 0;
 | 
			
		||||
	begindst = last_sunday(89, timep);	/* last Sun before Apr */
 | 
			
		||||
	enddst = last_sunday(272, timep);	/* last Sun in Sep */
 | 
			
		||||
	timep->tm_isdst = _daylight;
 | 
			
		||||
	if (!_daylight) return 0;
 | 
			
		||||
 | 
			
		||||
	/* The rules for daylight saving time differ for different coutries.
 | 
			
		||||
	 * Implemented here are heuristics that got it right in Holland for
 | 
			
		||||
	 * the last couple of years. There is, of course, no universal
 | 
			
		||||
	 * algorithm. Only tables would work perfect.
 | 
			
		||||
	 */
 | 
			
		||||
	if ( (timep->tm_yday>begindst
 | 
			
		||||
		|| (timep->tm_yday == begindst && timep->tm_hour >= 2))
 | 
			
		||||
	    && (timep->tm_yday<enddst
 | 
			
		||||
		|| (timep->tm_yday == enddst && timep->tm_hour < 3))) {
 | 
			
		||||
		/* it all happens between 2 and 3 */
 | 
			
		||||
	if (dsts->ds_type != 'U')
 | 
			
		||||
		begindst = date_of(dsts, timep);
 | 
			
		||||
	else begindst = last_sunday(89, timep);	/* last Sun before Apr */
 | 
			
		||||
	if (dste->ds_type != 'U')
 | 
			
		||||
		enddst = date_of(dste, timep);
 | 
			
		||||
	else enddst = last_sunday(272, timep);	/* last Sun in Sep */
 | 
			
		||||
 | 
			
		||||
		return 60*60;
 | 
			
		||||
	/* assume begindst != enddst (otherwise it would be no use) */
 | 
			
		||||
	if (begindst < enddst) {		/* northern hemisphere */
 | 
			
		||||
		if (timep->tm_yday > begindst && timep->tm_yday < enddst)
 | 
			
		||||
			return _dst_off;
 | 
			
		||||
	} else {				/* southern hemisphere */
 | 
			
		||||
		if (timep->tm_yday > begindst || timep->tm_yday < enddst)
 | 
			
		||||
			return _dst_off;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (timep->tm_yday == begindst || timep->tm_yday == enddst) {
 | 
			
		||||
		long dsttranssec;	/* transition when day is this old */
 | 
			
		||||
		long cursec;
 | 
			
		||||
 | 
			
		||||
		if (timep->tm_yday == begindst)
 | 
			
		||||
			dsttranssec = dsts->ds_sec;
 | 
			
		||||
		else	dsttranssec = dste->ds_sec;
 | 
			
		||||
		cursec = ((timep->tm_hour * 60) + timep->tm_min) * 60
 | 
			
		||||
			    + timep->tm_sec;
 | 
			
		||||
 | 
			
		||||
		if ((timep->tm_yday == begindst && cursec >= dsttranssec)
 | 
			
		||||
		    || (timep->tm_yday == enddst && cursec < dsttranssec))
 | 
			
		||||
			return _dst_off;
 | 
			
		||||
	}
 | 
			
		||||
	timep->tm_isdst = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,16 +7,19 @@
 | 
			
		|||
#include	<limits.h>
 | 
			
		||||
#include	"loc_incl.h"
 | 
			
		||||
 | 
			
		||||
/* The code assumes that time_t is an unsigned long. When it is not, some
 | 
			
		||||
 * things may have to change.
 | 
			
		||||
 */
 | 
			
		||||
time_t
 | 
			
		||||
mktime(register struct tm *timep)
 | 
			
		||||
{
 | 
			
		||||
	int day, year, month, yday;
 | 
			
		||||
	long tmp_sec, tz = _tzone();
 | 
			
		||||
	register time_t seconds, localseconds;
 | 
			
		||||
	int overflow = 0;
 | 
			
		||||
	register long day, year;
 | 
			
		||||
	register int tm_year;
 | 
			
		||||
	int yday, month;
 | 
			
		||||
	register time_t seconds;
 | 
			
		||||
	int overflow;
 | 
			
		||||
	unsigned dst;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	timep->tm_min += timep->tm_sec / 60;
 | 
			
		||||
	timep->tm_sec %= 60;
 | 
			
		||||
	if (timep->tm_sec < 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -43,87 +46,81 @@ mktime(register struct tm *timep)
 | 
			
		|||
	}
 | 
			
		||||
	day += (timep->tm_mday - 1);
 | 
			
		||||
	while (day < 0) {
 | 
			
		||||
		day += YEARSIZE(YEAR1 + timep->tm_year - 1);
 | 
			
		||||
		day += YEARSIZE(YEAR0 + timep->tm_year - 1);
 | 
			
		||||
		timep->tm_year--;
 | 
			
		||||
	}
 | 
			
		||||
	while (day >= YEARSIZE(YEAR1 + timep->tm_year)) {
 | 
			
		||||
		day -= YEARSIZE(YEAR1 + timep->tm_year);
 | 
			
		||||
	while (day >= YEARSIZE(YEAR0 + timep->tm_year)) {
 | 
			
		||||
		day -= YEARSIZE(YEAR0 + timep->tm_year);
 | 
			
		||||
		timep->tm_year++;
 | 
			
		||||
	}
 | 
			
		||||
	while (day >= _ytab[LEAPYEAR(YEAR1 + timep->tm_year)][timep->tm_mon]) {
 | 
			
		||||
		day -= _ytab[LEAPYEAR(YEAR1 + timep->tm_year)][timep->tm_mon];
 | 
			
		||||
	while (day >= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]) {
 | 
			
		||||
		day -= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon];
 | 
			
		||||
		if (++(timep->tm_mon) == 12) {
 | 
			
		||||
			timep->tm_mon = 0;
 | 
			
		||||
			timep->tm_year++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	timep->tm_mday = day + 1;
 | 
			
		||||
	year = 70;
 | 
			
		||||
	if (timep->tm_year < year) return -1;
 | 
			
		||||
	_tzset();			/* set timezone and dst info  */
 | 
			
		||||
	year = EPOCH_YR;
 | 
			
		||||
	if (timep->tm_year < year - YEAR0) return -1;
 | 
			
		||||
	seconds = 0;
 | 
			
		||||
	while (!overflow && year < timep->tm_year) {
 | 
			
		||||
		tmp_sec = SECS_DAY * YEARSIZE(YEAR1 + year);
 | 
			
		||||
		if (TIME_MAX - tmp_sec <= seconds) overflow++;
 | 
			
		||||
		else {
 | 
			
		||||
			seconds += tmp_sec;
 | 
			
		||||
			year++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	day = 0;			/* means days since day 0 now */
 | 
			
		||||
	overflow = 0;
 | 
			
		||||
 | 
			
		||||
	/* Assume that when day becomes negative, there will certainly
 | 
			
		||||
	 * be overflow on seconds.
 | 
			
		||||
	 * The check for overflow needs not to be done for leapyears
 | 
			
		||||
	 * divisible by 400.
 | 
			
		||||
	 * The code only works when year (1970) is not a leapyear.
 | 
			
		||||
	 */
 | 
			
		||||
#if	EPOCH_YR != 1970
 | 
			
		||||
#error	EPOCH_YR != 1970
 | 
			
		||||
#endif
 | 
			
		||||
	tm_year = timep->tm_year + YEAR0;
 | 
			
		||||
 | 
			
		||||
	if (LONG_MAX / 365 < tm_year - year) overflow++;
 | 
			
		||||
	day = (tm_year - year) * 365;
 | 
			
		||||
	if (LONG_MAX - day < (tm_year - year) / 4 + 1) overflow++;
 | 
			
		||||
	day += (tm_year - year) / 4
 | 
			
		||||
		+ ((tm_year % 4) && tm_year % 4 < year % 4);
 | 
			
		||||
	day -= (tm_year - year) / 100
 | 
			
		||||
		+ ((tm_year % 100) && tm_year % 100 < year % 100);
 | 
			
		||||
	day += (tm_year - year) / 400
 | 
			
		||||
		+ ((tm_year % 400) && tm_year % 400 < year % 400);
 | 
			
		||||
 | 
			
		||||
	yday = month = 0;
 | 
			
		||||
	while (!overflow && month < timep->tm_mon) {
 | 
			
		||||
		yday += _ytab[LEAPYEAR(YEAR1 + year)][month];
 | 
			
		||||
	while (month < timep->tm_mon) {
 | 
			
		||||
		yday += _ytab[LEAPYEAR(tm_year)][month];
 | 
			
		||||
		month++;
 | 
			
		||||
	}
 | 
			
		||||
	yday += (timep->tm_mday - 1);
 | 
			
		||||
	if (!overflow) {
 | 
			
		||||
		tmp_sec = yday * SECS_DAY;
 | 
			
		||||
		if (TIME_MAX - tmp_sec <= seconds) overflow++;
 | 
			
		||||
		else seconds += tmp_sec;
 | 
			
		||||
	}
 | 
			
		||||
	if (day + yday < 0) overflow++;
 | 
			
		||||
	day += yday;
 | 
			
		||||
 | 
			
		||||
	timep->tm_yday = yday;		/* ??? assignments should be later */
 | 
			
		||||
					/* day 0 was thursday (4) */
 | 
			
		||||
	timep->tm_wday = (seconds / SECS_DAY + 4) % 7;
 | 
			
		||||
	timep->tm_yday = yday;
 | 
			
		||||
	timep->tm_wday = (day + 4) % 7;		/* day 0 was thursday (4) */
 | 
			
		||||
 | 
			
		||||
	seconds = ((timep->tm_hour * 60) + timep->tm_min) * 60 + timep->tm_sec;
 | 
			
		||||
 | 
			
		||||
	if ((TIME_MAX - seconds) / SECS_DAY < day) overflow++;
 | 
			
		||||
	seconds += day * SECS_DAY;
 | 
			
		||||
 | 
			
		||||
	/* Now adjust according to timezone and daylight saving time */
 | 
			
		||||
 | 
			
		||||
	if (((_timezone > 0) && (TIME_MAX - _timezone < seconds))
 | 
			
		||||
	    || ((_timezone < 0) && (seconds < -_timezone)))
 | 
			
		||||
		overflow++;
 | 
			
		||||
	seconds += _timezone;
 | 
			
		||||
 | 
			
		||||
	if (timep->tm_isdst < 0)
 | 
			
		||||
		dst = _dstget(timep);
 | 
			
		||||
	else if (timep->tm_isdst)
 | 
			
		||||
		dst = 60 * 60;
 | 
			
		||||
		dst = _dst_off;
 | 
			
		||||
	else dst = 0;
 | 
			
		||||
 | 
			
		||||
	if (!overflow) {
 | 
			
		||||
		tmp_sec = timep->tm_hour * 60 * 60;
 | 
			
		||||
		if (TIME_MAX - tmp_sec <= seconds) overflow++;
 | 
			
		||||
		else seconds += tmp_sec;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!overflow) {
 | 
			
		||||
		tmp_sec = timep->tm_min * 60;
 | 
			
		||||
		if (TIME_MAX - tmp_sec <= seconds) overflow++;
 | 
			
		||||
		else seconds += tmp_sec;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!overflow) {
 | 
			
		||||
		tmp_sec = timep->tm_sec;
 | 
			
		||||
		if (TIME_MAX - tmp_sec <= seconds) overflow++;
 | 
			
		||||
		else seconds += tmp_sec;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	localseconds = seconds;
 | 
			
		||||
 | 
			
		||||
	if (!overflow) {
 | 
			
		||||
		tmp_sec = tz;
 | 
			
		||||
		if (((tmp_sec > 0) && (TIME_MAX - tmp_sec <= seconds))
 | 
			
		||||
		    || ((tmp_sec < 0) && (seconds < -tmp_sec)))
 | 
			
		||||
			overflow++;
 | 
			
		||||
		else seconds += tmp_sec;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!overflow) {
 | 
			
		||||
		tmp_sec = dst;
 | 
			
		||||
		if (tmp_sec > seconds) overflow++;
 | 
			
		||||
		else seconds -= tmp_sec;
 | 
			
		||||
	}
 | 
			
		||||
	if (dst > seconds) overflow++;	/* dst is always non-negative */
 | 
			
		||||
	seconds -= dst;
 | 
			
		||||
 | 
			
		||||
	if (overflow) return (time_t)-1;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@
 | 
			
		|||
#include	<time.h>
 | 
			
		||||
#include	"loc_incl.h"
 | 
			
		||||
 | 
			
		||||
/* The width can be negative in both s_prnt() as in u_prnt(). This
 | 
			
		||||
/* The width can be -1 in both s_prnt() as in u_prnt(). This
 | 
			
		||||
 * indicates that as many characters as needed should be printed.
 | 
			
		||||
 */
 | 
			
		||||
static char *
 | 
			
		||||
| 
						 | 
				
			
			@ -43,14 +43,15 @@ strftime(char *s, size_t maxsize,
 | 
			
		|||
 | 
			
		||||
	if (!format) return 0;
 | 
			
		||||
 | 
			
		||||
	_tzset();	/* for %Z conversion */
 | 
			
		||||
	firsts = s;
 | 
			
		||||
	while (maxsize && *format) {
 | 
			
		||||
		if (maxsize && *format && *format != '%') {
 | 
			
		||||
		while (maxsize && *format && *format != '%') {
 | 
			
		||||
			*s++ = *format++;
 | 
			
		||||
			maxsize--;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		if (*format++ != '%') break;	/* maxsize == 0 || !*format */
 | 
			
		||||
		if (!maxsize || !*format) break;
 | 
			
		||||
		format++;
 | 
			
		||||
 | 
			
		||||
		olds = s;
 | 
			
		||||
		switch (*format++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +76,8 @@ strftime(char *s, size_t maxsize,
 | 
			
		|||
		case 'c':
 | 
			
		||||
			n = strftime(s, maxsize,
 | 
			
		||||
					"%a %b %d %H:%M:%S %Y", timeptr);
 | 
			
		||||
			maxsize -= n;
 | 
			
		||||
			if (n) maxsize -= n;
 | 
			
		||||
			else maxsize = 0;
 | 
			
		||||
			s += n;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'd':
 | 
			
		||||
| 
						 | 
				
			
			@ -128,12 +130,14 @@ strftime(char *s, size_t maxsize,
 | 
			
		|||
			break;
 | 
			
		||||
		case 'x':
 | 
			
		||||
			n = strftime(s, maxsize, "%a %b %d %Y", timeptr);
 | 
			
		||||
			maxsize -= n;
 | 
			
		||||
			if (n) maxsize -= n;
 | 
			
		||||
			else maxsize = 0;
 | 
			
		||||
			s += n;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'X':
 | 
			
		||||
			n = strftime(s, maxsize, "%H:%M:%S", timeptr);
 | 
			
		||||
			maxsize -= n;
 | 
			
		||||
			if (n) maxsize -= n;
 | 
			
		||||
			else maxsize = 0;
 | 
			
		||||
			s += n;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'y':
 | 
			
		||||
| 
						 | 
				
			
			@ -141,12 +145,12 @@ strftime(char *s, size_t maxsize,
 | 
			
		|||
			maxsize -= s - olds;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'Y':
 | 
			
		||||
			s = u_prnt(s, maxsize, timeptr->tm_year + 1900, -1);
 | 
			
		||||
			s = u_prnt(s, maxsize, timeptr->tm_year + YEAR0, -1);
 | 
			
		||||
			maxsize -= s - olds;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'Z':
 | 
			
		||||
			s = s_prnt(s, maxsize,
 | 
			
		||||
					__tzname[(timeptr->tm_isdst > 0)], -1);
 | 
			
		||||
					_tzname[(timeptr->tm_isdst > 0)], -1);
 | 
			
		||||
			maxsize -= s - olds;
 | 
			
		||||
			break;
 | 
			
		||||
		case '%':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,17 +3,34 @@
 | 
			
		|||
 */
 | 
			
		||||
/* $Header$ */
 | 
			
		||||
 | 
			
		||||
#if	defined(__BSD4_2)
 | 
			
		||||
#include	<time.h>
 | 
			
		||||
#include	<sys/time.h>
 | 
			
		||||
/*
 | 
			
		||||
 * Structure returned by gettimeofday(2) system call,
 | 
			
		||||
 * and used in other calls.
 | 
			
		||||
 */
 | 
			
		||||
struct timeval {
 | 
			
		||||
	long	tv_sec;		/* seconds */
 | 
			
		||||
	long	tv_usec;	/* and microseconds */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct timezone {
 | 
			
		||||
	int	tz_minuteswest;	/* minutes west of Greenwich */
 | 
			
		||||
	int	tz_dsttime;	/* type of dst correction */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int gettimeofday(struct timeval *tp, struct timezone *tzp);
 | 
			
		||||
 | 
			
		||||
time_t
 | 
			
		||||
time(time_t *timer)
 | 
			
		||||
{
 | 
			
		||||
	struct timeval tv;
 | 
			
		||||
	struct timezone tz;
 | 
			
		||||
 | 
			
		||||
	gettimeofday(&tv, &tz);
 | 
			
		||||
 | 
			
		||||
	if (timer) *timer = tv.tv_sec;
 | 
			
		||||
	return tv.tv_sec;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
/* Assume time() is a system call */	/* ??? */
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,9 @@
 | 
			
		|||
/*
 | 
			
		||||
 * tzset - system V compatibility
 | 
			
		||||
 * tzset - set timezone information
 | 
			
		||||
 */
 | 
			
		||||
/* $Header$ */
 | 
			
		||||
 | 
			
		||||
#ifdef	__USG
 | 
			
		||||
/* This function is present for System V && POSIX */
 | 
			
		||||
 | 
			
		||||
#include	<time.h>
 | 
			
		||||
#include	"loc_incl.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -11,6 +11,5 @@
 | 
			
		|||
void
 | 
			
		||||
tzset(void)
 | 
			
		||||
{
 | 
			
		||||
	_tzone();	/* does the job */
 | 
			
		||||
	_tzset();	/* does the job */
 | 
			
		||||
}
 | 
			
		||||
#endif	/* __USG */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue