⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tztime.c

📁 Android 一些工具
💻 C
📖 第 1 页 / 共 4 页
字号:
				detzcode(p) : detzcode64(p);			p += stored;			lsisp->ls_corr = detzcode(p);			p += 4;		}		for (i = 0; i < sp->typecnt; ++i) {			register struct ttinfo *	ttisp;			ttisp = &sp->ttis[i];			if (ttisstdcnt == 0)				ttisp->tt_ttisstd = FALSE;			else {				ttisp->tt_ttisstd = *p++;				if (ttisp->tt_ttisstd != TRUE &&					ttisp->tt_ttisstd != FALSE)						return -1;			}		}		for (i = 0; i < sp->typecnt; ++i) {			register struct ttinfo *	ttisp;			ttisp = &sp->ttis[i];			if (ttisgmtcnt == 0)				ttisp->tt_ttisgmt = FALSE;			else {				ttisp->tt_ttisgmt = *p++;				if (ttisp->tt_ttisgmt != TRUE &&					ttisp->tt_ttisgmt != FALSE)						return -1;			}		}		/*		** Out-of-sort ats should mean we're running on a		** signed time_t system but using a data file with		** unsigned values (or vice versa).		*/		for (i = 0; i < sp->timecnt - 2; ++i)			if (sp->ats[i] > sp->ats[i + 1]) {				++i;				if (TYPE_SIGNED(time_t)) {					/*					** Ignore the end (easy).					*/					sp->timecnt = i;				} else {					/*					** Ignore the beginning (harder).					*/					register int	j;					for (j = 0; j + i < sp->timecnt; ++j) {						sp->ats[j] = sp->ats[j + i];						sp->types[j] = sp->types[j + i];					}					sp->timecnt = j;				}				break;			}		/*		** If this is an old file, we're done.		*/		if (u.tzhead.tzh_version[0] == '\0')			break;		nread -= p - u.buf;		for (i = 0; i < nread; ++i)			u.buf[i] = p[i];		/*		** If this is a narrow integer time_t system, we're done.		*/		if (stored >= (int) sizeof(time_t) && TYPE_INTEGRAL(time_t))			break;	}	if (doextend && nread > 2 &&		u.buf[0] == '\n' && u.buf[nread - 1] == '\n' &&		sp->typecnt + 2 <= TZ_MAX_TYPES) {			struct state	ts;			register int	result;			u.buf[nread - 1] = '\0';			result = tzparse(&u.buf[1], &ts, FALSE);			if (result == 0 && ts.typecnt == 2 &&				sp->charcnt + ts.charcnt <= TZ_MAX_CHARS) {					for (i = 0; i < 2; ++i)						ts.ttis[i].tt_abbrind +=							sp->charcnt;					for (i = 0; i < ts.charcnt; ++i)						sp->chars[sp->charcnt++] =							ts.chars[i];					i = 0;					while (i < ts.timecnt &&						ts.ats[i] <=						sp->ats[sp->timecnt - 1])							++i;					while (i < ts.timecnt &&					    sp->timecnt < TZ_MAX_TIMES) {						sp->ats[sp->timecnt] =							ts.ats[i];						sp->types[sp->timecnt] =							sp->typecnt +							ts.types[i];						++sp->timecnt;						++i;					}					sp->ttis[sp->typecnt++] = ts.ttis[0];					sp->ttis[sp->typecnt++] = ts.ttis[1];			}	}	i = 2 * YEARSPERREPEAT;	sp->goback = sp->goahead = sp->timecnt > i;	sp->goback &= sp->types[i] == sp->types[0] &&		differ_by_repeat(sp->ats[i], sp->ats[0]);	sp->goahead &=		sp->types[sp->timecnt - 1] == sp->types[sp->timecnt - 1 - i] &&		differ_by_repeat(sp->ats[sp->timecnt - 1],			 sp->ats[sp->timecnt - 1 - i]);	return 0;}static const int	mon_lengths[2][MONSPERYEAR] = {	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }};static const int	year_lengths[2] = {	DAYSPERNYEAR, DAYSPERLYEAR};/*** Given a pointer into a time zone string, scan until a character that is not** a valid character in a zone name is found. Return a pointer to that** character.*/static const char *getzname(strp)register const char *	strp;{	register char	c;	while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' &&		c != '+')			++strp;	return strp;}/*** Given a pointer into an extended time zone string, scan until the ending** delimiter of the zone name is located. Return a pointer to the delimiter.**** As with getzname above, the legal character set is actually quite** restricted, with other characters producing undefined results.** We don't do any checking here; checking is done later in common-case code.*/static const char *getqzname(register const char *strp, const int delim){	register int	c;	while ((c = *strp) != '\0' && c != delim)		++strp;	return strp;}/*** Given a pointer into a time zone string, extract a number from that string.** Check that the number is within a specified range; if it is not, return** NULL.** Otherwise, return a pointer to the first character not part of the number.*/static const char *getnum(strp, nump, min, max)register const char *	strp;int * const		nump;const int		min;const int		max;{	register char	c;	register int	num;	if (strp == NULL || !is_digit(c = *strp))		return NULL;	num = 0;	do {		num = num * 10 + (c - '0');		if (num > max)			return NULL;	/* illegal value */		c = *++strp;	} while (is_digit(c));	if (num < min)		return NULL;		/* illegal value */	*nump = num;	return strp;}/*** Given a pointer into a time zone string, extract a number of seconds,** in hh[:mm[:ss]] form, from the string.** If any error occurs, return NULL.** Otherwise, return a pointer to the first character not part of the number** of seconds.*/static const char *getsecs(strp, secsp)register const char *	strp;long * const		secsp;{	int	num;	/*	** `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like	** "M10.4.6/26", which does not conform to Posix,	** but which specifies the equivalent of	** ``02:00 on the first Sunday on or after 23 Oct''.	*/	strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1);	if (strp == NULL)		return NULL;	*secsp = num * (long) SECSPERHOUR;	if (*strp == ':') {		++strp;		strp = getnum(strp, &num, 0, MINSPERHOUR - 1);		if (strp == NULL)			return NULL;		*secsp += num * SECSPERMIN;		if (*strp == ':') {			++strp;			/* `SECSPERMIN' allows for leap seconds. */			strp = getnum(strp, &num, 0, SECSPERMIN);			if (strp == NULL)				return NULL;			*secsp += num;		}	}	return strp;}/*** Given a pointer into a time zone string, extract an offset, in** [+-]hh[:mm[:ss]] form, from the string.** If any error occurs, return NULL.** Otherwise, return a pointer to the first character not part of the time.*/static const char *getoffset(strp, offsetp)register const char *	strp;long * const		offsetp;{	register int	neg = 0;	if (*strp == '-') {		neg = 1;		++strp;	} else if (*strp == '+')		++strp;	strp = getsecs(strp, offsetp);	if (strp == NULL)		return NULL;		/* illegal time */	if (neg)		*offsetp = -*offsetp;	return strp;}/*** Given a pointer into a time zone string, extract a rule in the form** date[/time]. See POSIX section 8 for the format of "date" and "time".** If a valid rule is not found, return NULL.** Otherwise, return a pointer to the first character not part of the rule.*/static const char *getrule(strp, rulep)const char *			strp;register struct rule * const	rulep;{	if (*strp == 'J') {		/*		** Julian day.		*/		rulep->r_type = JULIAN_DAY;		++strp;		strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);	} else if (*strp == 'M') {		/*		** Month, week, day.		*/		rulep->r_type = MONTH_NTH_DAY_OF_WEEK;		++strp;		strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);		if (strp == NULL)			return NULL;		if (*strp++ != '.')			return NULL;		strp = getnum(strp, &rulep->r_week, 1, 5);		if (strp == NULL)			return NULL;		if (*strp++ != '.')			return NULL;		strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);	} else if (is_digit(*strp)) {		/*		** Day of year.		*/		rulep->r_type = DAY_OF_YEAR;		strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);	} else	return NULL;		/* invalid format */	if (strp == NULL)		return NULL;	if (*strp == '/') {		/*		** Time specified.		*/		++strp;		strp = getsecs(strp, &rulep->r_time);	} else	rulep->r_time = 2 * SECSPERHOUR;	/* default = 2:00:00 */	return strp;}/*** Given the Epoch-relative time of January 1, 00:00:00 UTC, in a year, the** year, a rule, and the offset from UTC at the time that rule takes effect,** calculate the Epoch-relative time that rule takes effect.*/static time_ttranstime(janfirst, year, rulep, offset)const time_t				janfirst;const int				year;register const struct rule * const	rulep;const long				offset;{	register int	leapyear;	register time_t	value;	register int	i;	int		d, m1, yy0, yy1, yy2, dow;	INITIALIZE(value);	leapyear = isleap(year);	switch (rulep->r_type) {	case JULIAN_DAY:		/*		** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap		** years.		** In non-leap years, or if the day number is 59 or less, just		** add SECSPERDAY times the day number-1 to the time of		** January 1, midnight, to get the day.		*/		value = janfirst + (rulep->r_day - 1) * SECSPERDAY;		if (leapyear && rulep->r_day >= 60)			value += SECSPERDAY;		break;	case DAY_OF_YEAR:		/*		** n - day of year.		** Just add SECSPERDAY times the day number to the time of		** January 1, midnight, to get the day.		*/		value = janfirst + rulep->r_day * SECSPERDAY;		break;	case MONTH_NTH_DAY_OF_WEEK:		/*		** Mm.n.d - nth "dth day" of month m.		*/		value = janfirst;		for (i = 0; i < rulep->r_mon - 1; ++i)			value += mon_lengths[leapyear][i] * SECSPERDAY;		/*		** Use Zeller's Congruence to get day-of-week of first day of		** month.		*/		m1 = (rulep->r_mon + 9) % 12 + 1;		yy0 = (rulep->r_mon <= 2) ? (year - 1) : year;		yy1 = yy0 / 100;		yy2 = yy0 % 100;		dow = ((26 * m1 - 2) / 10 +			1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7;		if (dow < 0)			dow += DAYSPERWEEK;		/*		** "dow" is the day-of-week of the first day of the month. Get		** the day-of-month (zero-origin) of the first "dow" day of the		** month.		*/		d = rulep->r_day - dow;		if (d < 0)			d += DAYSPERWEEK;		for (i = 1; i < rulep->r_week; ++i) {			if (d + DAYSPERWEEK >=				mon_lengths[leapyear][rulep->r_mon - 1])					break;			d += DAYSPERWEEK;		}		/*		** "d" is the day-of-month (zero-origin) of the day we want.		*/		value += d * SECSPERDAY;		break;	}	/*	** "value" is the Epoch-relative time of 00:00:00 UTC on the day in	** question. To get the Epoch-relative time of the specified local	** time on that day, add the transition time and the current offset	** from UTC.	*/	return value + rulep->r_time + offset;}/*** Given a POSIX section 8-style TZ string, fill in the rule tables as** appropriate.*/static inttzparse(name, sp, lastditch)const char *			name;register struct state * const	sp;const int			lastditch;{	const char *			stdname;	const char *			dstname;	size_t				stdlen;	size_t				dstlen;	long				stdoffset;	long				dstoffset;	register time_t *		atp;	register unsigned char *	typep;	register char *			cp;	register int			load_result;	INITIALIZE(dstname);	stdname = name;	if (lastditch) {		stdlen = strlen(name);	/* length of standard zone name */		name += stdlen;		if (stdlen >= sizeof sp->chars)			stdlen = (sizeof sp->chars) - 1;		stdoffset = 0;	} else {		if (*name == '<') {			name++;			stdname = name;			name = getqzname(name, '>');			if (*name != '>')				return (-1);			stdlen = name - stdname;			name++;		} else {			name = getzname(name);			stdlen = name - stdname;		}		if (*name == '\0')			return -1;		name = getoffset(name, &stdoffset);		if (name == NULL)			return -1;	}	load_result = tzload(TZDEFRULES, sp, FALSE);	if (load_result != 0)		sp->leapcnt = 0;		/* so, we're off a little */	sp->timecnt = 0;	if (*name != '\0') {		if (*name == '<') {			dstname = ++name;			name = getqzname(name, '>');			if (*name != '>')				return -1;			dstlen = name - dstname;			name++;		} else {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -