/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 *	from Arthur Olson's 6.1
 */

#ifndef _LIBSPL_SYS_TZFILE_H
#define	_LIBSPL_SYS_TZFILE_H

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Information about time zone files.
 */

#define	TZDIR	"/usr/share/lib/zoneinfo" /* Time zone object file directory */

#define	TZDEFAULT	(getenv("TZ"))

#define	TZDEFRULES	"posixrules"

/*
 * Each file begins with. . .
 */

struct tzhead {
	char	tzh_reserved[24];	/* reserved for future use */
	char	tzh_ttisstdcnt[4];	/* coded number of trans. time flags */
	char	tzh_leapcnt[4];		/* coded number of leap seconds */
	char	tzh_timecnt[4];		/* coded number of transition times */
	char	tzh_typecnt[4];		/* coded number of local time types */
	char	tzh_charcnt[4];		/* coded number of abbr. chars */
};

/*
 * . . .followed by. . .
 *
 *	tzh_timecnt (char [4])s		coded transition times a la time(2)
 *	tzh_timecnt (unsigned char)s	types of local time starting at above
 *	tzh_typecnt repetitions of
 *		one (char [4])		coded GMT offset in seconds
 *		one (unsigned char)	used to set tm_isdst
 *		one (unsigned char)	that's an abbreviation list index
 *	tzh_charcnt (char)s		'\0'-terminated zone abbreviations
 *	tzh_leapcnt repetitions of
 *		one (char [4])		coded leap second transition times
 *		one (char [4])		total correction after above
 *	tzh_ttisstdcnt (char)s		indexed by type; if TRUE, transition
 *					time is standard time, if FALSE,
 *					transition time is wall clock time
 *					if absent, transition times are
 *					assumed to be wall clock time
 */

/*
 * In the current implementation, "tzset()" refuses to deal with files that
 * exceed any of the limits below.
 */

/*
 * The TZ_MAX_TIMES value below is enough to handle a bit more than a
 * year's worth of solar time (corrected daily to the nearest second) or
 * 138 years of Pacific Presidential Election time
 * (where there are three time zone transitions every fourth year).
 */
#define	TZ_MAX_TIMES	370

#define	TZ_MAX_TYPES	256	/* Limited by what (unsigned char)'s can hold */

#define	TZ_MAX_CHARS	50	/* Maximum number of abbreviation characters */

#define	TZ_MAX_LEAPS	50	/* Maximum number of leap second corrections */

#define	SECSPERMIN	60
#define	MINSPERHOUR	60
#define	HOURSPERDAY	24
#define	DAYSPERWEEK	7
#define	DAYSPERNYEAR	365
#define	DAYSPERLYEAR	366
#define	SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
#define	SECSPERDAY	((long)SECSPERHOUR * HOURSPERDAY)
#define	MONSPERYEAR	12

#define	TM_SUNDAY	0
#define	TM_MONDAY	1
#define	TM_TUESDAY	2
#define	TM_WEDNESDAY	3
#define	TM_THURSDAY	4
#define	TM_FRIDAY	5
#define	TM_SATURDAY	6

#define	TM_JANUARY	0
#define	TM_FEBRUARY	1
#define	TM_MARCH	2
#define	TM_APRIL	3
#define	TM_MAY		4
#define	TM_JUNE		5
#define	TM_JULY		6
#define	TM_AUGUST	7
#define	TM_SEPTEMBER	8
#define	TM_OCTOBER	9
#define	TM_NOVEMBER	10
#define	TM_DECEMBER	11

#define	TM_YEAR_BASE	1900

#define	EPOCH_YEAR	1970
#define	EPOCH_WDAY	TM_THURSDAY

/*
 * Accurate only for the past couple of centuries;
 * that will probably do.
 */

#define	isleap(y) (((y) % 4) == 0 && ((y) % 100) != 0 || ((y) % 400) == 0)

/*
 * Use of the underscored variants may cause problems if you move your code to
 * certain System-V-based systems; for maximum portability, use the
 * underscore-free variants.  The underscored variants are provided for
 * backward compatibility only; they may disappear from future versions of
 * this file.
 */

#define	SECS_PER_MIN	SECSPERMIN
#define	MINS_PER_HOUR	MINSPERHOUR
#define	HOURS_PER_DAY	HOURSPERDAY
#define	DAYS_PER_WEEK	DAYSPERWEEK
#define	DAYS_PER_NYEAR	DAYSPERNYEAR
#define	DAYS_PER_LYEAR	DAYSPERLYEAR
#define	SECS_PER_HOUR	SECSPERHOUR
#define	SECS_PER_DAY	SECSPERDAY
#define	MONS_PER_YEAR	MONSPERYEAR

#ifdef	__cplusplus
}
#endif

#endif /* _LIBSPL_SYS_TZFILE_H */
