📄 localtime.cc
字号:
/*** This file is in the public domain, so clarified as of** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).*//* Temporarily merged private.h and tzfile.h for ease of management - DJ */#include "winsup.h"#include "cygerrno.h"#include <windows.h>#define lint#define USG_COMPAT#ifndef lint#ifndef NOIDstatic char elsieid[] = "@(#)localtime.c 7.66";#endif /* !defined NOID */#endif /* !defined lint *//*** Leap second handling from Bradley White (bww@k.gp.cs.cmu.edu).** POSIX-style TZ environment variable handling from Guy Harris** (guy@auspex.com).*//*LINTLIBRARY*/#ifndef PRIVATE_H#define PRIVATE_H/*** This file is in the public domain, so clarified as of** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).*//*** This header is for use ONLY with the time conversion code.** There is no guarantee that it will remain unchanged,** or that it will remain at all.** Do NOT copy it to any system include directory.** Thank you!*//*** ID*/#ifndef lint#ifndef NOIDstatic char privatehid[] = "@(#)private.h 7.48";#endif /* !defined NOID */#endif /* !defined lint *//*** Defaults for preprocessor symbols.** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'.*/#ifndef HAVE_ADJTIME#define HAVE_ADJTIME 1#endif /* !defined HAVE_ADJTIME */#ifndef HAVE_GETTEXT#define HAVE_GETTEXT 0#endif /* !defined HAVE_GETTEXT */#ifndef HAVE_SETTIMEOFDAY#define HAVE_SETTIMEOFDAY 3#endif /* !defined HAVE_SETTIMEOFDAY */#ifndef HAVE_STRERROR#define HAVE_STRERROR 0#endif /* !defined HAVE_STRERROR */#ifndef HAVE_SYMLINK#define HAVE_SYMLINK 1#endif /* !defined HAVE_SYMLINK */#ifndef HAVE_UNISTD_H#define HAVE_UNISTD_H 1#endif /* !defined HAVE_UNISTD_H */#ifndef HAVE_UTMPX_H#define HAVE_UTMPX_H 0#endif /* !defined HAVE_UTMPX_H */#ifndef LOCALE_HOME#define LOCALE_HOME "/usr/lib/locale"#endif /* !defined LOCALE_HOME *//*** Nested includes*/#include "sys/types.h" /* for time_t */#include "stdio.h"#include "limits.h" /* for CHAR_BIT */#include "time.h"#include "stdlib.h"#if HAVE_GETTEXT - 0#include "libintl.h"#endif /* HAVE_GETTEXT - 0 */#if HAVE_UNISTD_H - 0#include "unistd.h" /* for F_OK and R_OK */#endif /* HAVE_UNISTD_H - 0 */#if !(HAVE_UNISTD_H - 0)#ifndef F_OK#define F_OK 0#endif /* !defined F_OK */#ifndef R_OK#define R_OK 4#endif /* !defined R_OK */#endif /* !(HAVE_UNISTD_H - 0) *//* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */#define is_digit(c) ((unsigned)(c) - '0' <= 9)/*** Workarounds for compilers/systems.*//*** SunOS 4.1.1 cc lacks const.*/#ifndef const#ifndef __STDC__#define const#endif /* !defined __STDC__ */#endif /* !defined const *//*** SunOS 4.1.1 cc lacks prototypes.*/#ifndef P#ifdef __STDC__#define P(x) x#endif /* defined __STDC__ */#ifndef __STDC__#define P(x) ()#endif /* !defined __STDC__ */#endif /* !defined P *//*** SunOS 4.1.1 headers lack EXIT_SUCCESS.*/#ifndef EXIT_SUCCESS#define EXIT_SUCCESS 0#endif /* !defined EXIT_SUCCESS *//*** SunOS 4.1.1 headers lack EXIT_FAILURE.*/#ifndef EXIT_FAILURE#define EXIT_FAILURE 1#endif /* !defined EXIT_FAILURE *//*** SunOS 4.1.1 headers lack FILENAME_MAX.*/#ifndef FILENAME_MAX#ifndef MAXPATHLEN#ifdef unix#include "sys/param.h"#endif /* defined unix */#endif /* !defined MAXPATHLEN */#ifdef MAXPATHLEN#define FILENAME_MAX MAXPATHLEN#endif /* defined MAXPATHLEN */#ifndef MAXPATHLEN#define FILENAME_MAX 1024 /* Pure guesswork */#endif /* !defined MAXPATHLEN */#endif /* !defined FILENAME_MAX *//*** SunOS 4.1.1 libraries lack remove.*/#ifndef removeextern int unlink P((const char * filename));#define remove unlink#endif /* !defined remove *//*** Finally, some convenience items.*/#ifndef TRUE#define TRUE 1#endif /* !defined TRUE */#ifndef FALSE#define FALSE 0#endif /* !defined FALSE */#ifndef TYPE_BIT#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT)#endif /* !defined TYPE_BIT */#ifndef TYPE_SIGNED#define TYPE_SIGNED(type) (((type) -1) < 0)#endif /* !defined TYPE_SIGNED */#ifndef INT_STRLEN_MAXIMUM/*** 302 / 1000 is log10(2.0) rounded up.** Subtract one for the sign bit if the type is signed;** add one for integer division truncation;** add one more for a minus sign if the type is signed.*/#define INT_STRLEN_MAXIMUM(type) \ ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type))#endif /* !defined INT_STRLEN_MAXIMUM *//*** INITIALIZE(x)*/#ifndef GNUC_or_lint#ifdef lint#define GNUC_or_lint#endif /* defined lint */#ifndef lint#ifdef __GNUC__#define GNUC_or_lint#endif /* defined __GNUC__ */#endif /* !defined lint */#endif /* !defined GNUC_or_lint */#ifndef INITIALIZE#ifdef GNUC_or_lint#define INITIALIZE(x) ((x) = 0)#endif /* defined GNUC_or_lint */#ifndef GNUC_or_lint#define INITIALIZE(x)#endif /* !defined GNUC_or_lint */#endif /* !defined INITIALIZE *//*** For the benefit of GNU folk...** `_(MSGID)' uses the current locale's message library string for MSGID.** The default is to use gettext if available, and use MSGID otherwise.*/#ifndef _#if HAVE_GETTEXT - 0#define _(msgid) gettext(msgid)#else /* !(HAVE_GETTEXT - 0) */#define _(msgid) msgid#endif /* !(HAVE_GETTEXT - 0) */#endif /* !defined _ */#ifndef TZ_DOMAIN#define TZ_DOMAIN "tz"#endif /* !defined TZ_DOMAIN *//*** UNIX was a registered trademark of UNIX System Laboratories in 1993.*/#endif /* !defined PRIVATE_H */#ifndef TZFILE_H#define TZFILE_H/*** This file is in the public domain, so clarified as of** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).*//*** This header is for use ONLY with the time conversion code.** There is no guarantee that it will remain unchanged,** or that it will remain at all.** Do NOT copy it to any system include directory.** Thank you!*//*** ID*/#ifndef lint#ifndef NOIDstatic char tzfilehid[] = "@(#)tzfile.h 7.14";#endif /* !defined NOID */#endif /* !defined lint *//*** Information about time zone files.*/#ifndef TZDIR#define TZDIR "/usr/local/etc/zoneinfo" /* Time zone object file directory */#endif /* !defined TZDIR */#ifndef TZDEFAULT#define TZDEFAULT "localtime"#endif /* !defined TZDEFAULT */#ifndef TZDEFRULES#define TZDEFRULES "posixrules"#endif /* !defined TZDEFRULES *//*** Each file begins with. . .*/#define TZ_MAGIC "TZif"struct tzhead { char tzh_magic[4]; /* TZ_MAGIC */ char tzh_reserved[16]; /* reserved for future use */ char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */ 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 UTC 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** tzh_ttisgmtcnt (char)s indexed by type; if TRUE, transition** time is UTC, if FALSE,** transition time is local time** if absent, transition times are** assumed to be local time*//*** In the current implementation, "tzset()" refuses to deal with files that** exceed any of the limits below.*/#ifndef TZ_MAX_TIMES/*** 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#endif /* !defined TZ_MAX_TIMES */#ifndef TZ_MAX_TYPES#ifndef NOSOLAR#define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */#endif /* !defined NOSOLAR */#ifdef NOSOLAR/*** Must be at least 14 for Europe/Riga as of Jan 12 1995,** as noted by Earl Chew <earl@hpato.aus.hp.com>.*/#define TZ_MAX_TYPES 20 /* Maximum number of local time types */#endif /* !defined NOSOLAR */#endif /* !defined TZ_MAX_TYPES */#ifndef TZ_MAX_CHARS#define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ /* (limited by what unsigned chars can hold) */#endif /* !defined TZ_MAX_CHARS */#ifndef TZ_MAX_LEAPS#define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */#endif /* !defined TZ_MAX_LEAPS */#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))#ifndef USG/*** 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#endif /* !defined USG */#endif /* !defined TZFILE_H */#include "fcntl.h"/*** SunOS 4.1.1 headers lack O_BINARY.*/#ifdef O_BINARY#define OPEN_MODE (O_RDONLY | O_BINARY)#endif /* defined O_BINARY */#ifndef O_BINARY#define OPEN_MODE O_RDONLY#endif /* !defined O_BINARY */#ifndef WILDABBR/*** Someone might make incorrect use of a time zone abbreviation:** 1. They might reference tzname[0] before calling tzset (explicitly** or implicitly).** 2. They might reference tzname[1] before calling tzset (explicitly** or implicitly).** 3. They might reference tzname[1] after setting to a time zone** in which Daylight Saving Time is never observed.** 4. They might reference tzname[0] after setting to a time zone** in which Standard Time is never observed.** 5. They might reference tm.TM_ZONE after calling offtime.** What's best to do in the above cases is open to debate;** for now, we just set things up so that in any of the five cases** WILDABBR is used. Another possibility: initialize tzname[0] to the** string "tzname[0] used before set", and similarly for the other cases.** And another: initialize tzname[0] to "ERA", with an explanation in the** manual page of what this "time zone abbreviation" means (doing this so** that tzname[0] has the "normal" length of three characters).*/#define WILDABBR " "#endif /* !defined WILDABBR */static char wildabbr[] NO_COPY = WILDABBR;static char gmt[] NO_COPY = "GMT";struct ttinfo { /* time type information */ long tt_gmtoff; /* UTC offset in seconds */ int tt_isdst; /* used to set tm_isdst */ int tt_abbrind; /* abbreviation list index */ int tt_ttisstd; /* TRUE if transition is std time */ int tt_ttisgmt; /* TRUE if transition is UTC */};struct lsinfo { /* leap second information */ time_t ls_trans; /* transition time */ long ls_corr; /* correction to apply */};#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b))#ifdef TZNAME_MAX#define MY_TZNAME_MAX TZNAME_MAX#endif /* defined TZNAME_MAX */#ifndef TZNAME_MAX#define MY_TZNAME_MAX 255#endif /* !defined TZNAME_MAX */struct state { int leapcnt; int timecnt; int typecnt; int charcnt; time_t ats[TZ_MAX_TIMES]; unsigned char types[TZ_MAX_TIMES]; struct ttinfo ttis[TZ_MAX_TYPES]; char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt), (2 * (MY_TZNAME_MAX + 1)))]; struct lsinfo lsis[TZ_MAX_LEAPS];};struct rule { int r_type; /* type of rule--see below */ int r_day; /* day number of rule */ int r_week; /* week number of rule */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -