/*
 * dateconv - convert a split-out date back into a time_t
 */

#include <time.h>
#include <sys/types.h>
#include <sys/timeb.h>

/* imports */
extern time_t qmktime();

/* turn a (struct tm) and a few variables into a time_t, with range checking */
time_t
dateconv(tm, zone)
register struct tm *tm;
int zone;
{
	tm->tm_wday = tm->tm_yday = 0;

	/* validate, before going out of range on some members */
	if (!validtm(tm))
		return -1;

	/*
	 * zone should really be -zone, and tz should be set to tp->value, not
	 * -tp->value.  Or the table could be fixed.
	 */
	tm->tm_min += zone;		/* mktime lets it be out of range */

	/* convert to seconds */
	return qmktime(tm);
}

int
validtm(tm)
register struct tm *tm;
{
	if (tm->tm_year < 0 || tm->tm_mon < 0 || tm->tm_mon > 11 ||
	    tm->tm_mday < 1 || tm->tm_hour < 0 || tm->tm_hour >= 24 ||
	    tm->tm_min < 0 || tm->tm_min > 59 ||
	    tm->tm_sec < 0 || tm->tm_sec > 61)	/* allow 2 leap seconds */
		return 0;
	return 1;
}


syntax highlighted by Code2HTML, v. 0.9.1