예제 #1
0
time_t rfc822_parsedt(const char *rfcdt)
{
unsigned day=0, mon=0, year;
int secs;
int offset;
time_t t;
unsigned y;

	/* Ignore day of the week.  Tolerate "Tue, 25 Feb 1997 ... "
	** without the comma.  Tolerate "Feb 25 1997 ...".
	*/

	while (!day || !mon)
	{
		if (!*rfcdt)	return (0);
		if (isalpha((int)(unsigned char)*rfcdt))
		{
			if (mon)	return (0);
			mon=parsekey(&rfcdt, mnames);
			if (!mon)
				while (*rfcdt && isalpha((int)(unsigned char)*rfcdt))
					++rfcdt;
			continue;
		}

		if (isdigit((int)(unsigned char)*rfcdt))
		{
			if (day)	return (0);
			day=parsedig(&rfcdt);
			if (!day)	return (0);
			continue;
		}
		++rfcdt;
	}

	while (*rfcdt && isspace((int)(unsigned char)*rfcdt))
		++rfcdt;
	if (!isdigit((int)(unsigned char)*rfcdt))	return (0);
	year=parsedig(&rfcdt);
	if (year < 70)	year += 2000;
	if (year < 100)	year += 1900;

	while (*rfcdt && isspace((int)(unsigned char)*rfcdt))
		++rfcdt;

	if (day == 0 || mon == 0 || mon > 12 || day > mdays(mon,year))
		return (0);

	secs=parsetime(&rfcdt);
	if (secs < 0)	return (0);

	offset=0;

	/* RFC822 sez no parenthesis, but I've seen (EST) */

	while ( *rfcdt )
	{
		if (isalnum((int)(unsigned char)*rfcdt) || *rfcdt == '+' || *rfcdt == '-')
			break;
		++rfcdt;
	}

	if (isalpha((int)(unsigned char)*rfcdt))
	{
	int	n=parsekey(&rfcdt, zonenames);

		if (n > 0)	offset= zoneoffset[n-1];
	}
	else
	{
	int	sign=1;
	unsigned n;

		switch (*rfcdt)	{
		case '-':
			sign= -1;
		case '+':
			++rfcdt;
		}

		if (isdigit((int)(unsigned char)*rfcdt))
		{
			n=parsedig(&rfcdt);
			if (n > 2359 || (n % 100) > 59)	n=0;
			offset = sign * ( (n % 100) * 60 + n / 100 * 60 * 60);
		}
	}

	if (year < 1970)	return (0);
	if (year > 9999)	return (0);

	t=0;
	for (y=1970; y<year; y++)
	{
		if ( leap(y) )
		{
			if (year-y >= 4)
			{
				y += 3;
				t += ( 365*3+366 ) * 24 * 60 * 60;
				continue;
			}
			t += 24 * 60 * 60;
		}
		t += 365 * 24 * 60 * 60;
	}

	for (y=1; y < mon; y++)
		t += mdays(y, year) * 24 * 60 * 60;

	return ( t + (day-1) * 24 * 60 * 60 + secs - offset );
}
예제 #2
0
time_t pcp_gmtime(int y, int m, int d, int hh, int mm, int ss)
{
	time_t t;
	struct tm *tmptr;
	struct tm mytm;
	int n;

	if (y < 1970 || y > 3000 || m < 1 || m > 12 || d < 1 ||
	    d > mdays(m, y) || hh < 0 || mm < 0 || ss < 0 || hh > 23 ||
	    mm > 59 || ss > 59)
		return (0);

	time(&t);

	tmptr=localtime(&t);
	if (!tmptr)
		return (0);

	mytm= *tmptr;
	mytm.tm_year = y - 1900;
	mytm.tm_mon = m - 1;
	mytm.tm_mday = d;
	mytm.tm_hour=0;
	mytm.tm_min=0;
	mytm.tm_sec=0;

	t=mktime(&mytm);
	if (t == (time_t)-1)
		return (0);

	/* Do it again, due to a potential timezone change */

	tmptr=localtime(&t);
	mytm= *tmptr;
	mytm.tm_year = y - 1900;
	mytm.tm_mon = m - 1;
	mytm.tm_mday = d;
	mytm.tm_hour=0;
	mytm.tm_min=0;
	mytm.tm_sec=0;

	t=mktime(&mytm);
	if (t == (time_t)-1)
		return (0);

	/* Sanity check */

	tmptr=localtime(&t);
	if (tmptr->tm_hour || tmptr->tm_min || tmptr->tm_sec)
	{
		return (0);
	}

	tmptr=gmtime(&t);

	n=tmcmp(tmptr->tm_year + 1900,
		tmptr->tm_mon + 1,
		tmptr->tm_mday,
		y, m, d);
	if (n < 0)
	{
		while (n < 0)
		{
			t += 24 * 60 * 60;
			tmptr=gmtime(&t);
			n=tmcmp(tmptr->tm_year + 1900,
				tmptr->tm_mon + 1,
				tmptr->tm_mday,
				y, m, d);
		}
	}
	else while (n > 0)
	{
		t -= 24 * 60 * 60;
		tmptr=gmtime(&t);
		n=tmcmp(tmptr->tm_year + 1900,
			tmptr->tm_mon + 1,
			tmptr->tm_mday,
			y, m, d);
	}

	t -= tmptr->tm_hour * 60 * 60 + tmptr->tm_min * 60 + tmptr->tm_sec;

	return (t + hh * 60 * 60 + mm * 60 + ss);
}