#include <stdio.h>
#include <errno.h>
#include <fcntl.h>

typedef enum {FALSE, TRUE} BOOLEAN;

#define lowbyte(w) ((w) & 0377)
#define highbyte(w) lowbyte((w) >> 8)

#include <time.h>

long timecvt(atime) /* Convert YYMMDDhhmmss to internal time stamp */
char *atime;
{
long tm;
int i, n, days, tzone;
char s[3], *getenv(), *tz, buf[25];
BOOLEAN isleapyear;
extern struct tm *localtime();
	
	strcpy(buf, atime);
	strcat(buf, "000000000000");
	buf[12] = '\0';
	for (i = 0; i < 11; i++)
		if (buf[i] < '0' || buf[i] > '9') {
			fprintf(stderr, "%s\n", buf);
			fprintf(stderr, "Time contains non-numeric character\n");
			return(0);
		}
	
	tzone = 0;
	s[2] = '\0';
	for (i = 0; i < 12; i += 2) {
		s[0] = atime[i];
		s[1] = atime[i + 1];
		n = atoi(s);
		switch (i) {
		case 0:  /* YY */
			isleapyear = (n != 0) && (n % 4 == 0);
			if (n < 70)
				n += 100;
			days = (n - 70L) * 365L;
			days += ((n - 69L) / 4);
			continue;
		case 2:  /* MM */
			switch (n) {
			case 12:
			days += 30;    /* 11 */
			case 11:
				days += 31;    /* 10 */
			case 10:
				days += 30;    /*  9 */
			case  9:
				days += 31;    /*  8 */
			case  8:
				days += 31;    /*  7 */
			case  7:
				days += 30;    /*  6 */
			case  6:
				days += 31;    /*  5 */
			case  5:
				days += 30;    /*  4 */
			case  4:
				days += 31;    /*  3 */
			case  3:
				days += (isleapyear ? 29 : 28); /*  2 */
			case  2:
				days += 31;    /*  1 */
			case  1:
				break;
			default:
				fprintf(stderr, "%d:Invalid month\n", n);
			return(0);
			}
			continue;
		case 4:   /* DD */
			if (n > 31) {
				fprintf(stderr, "%d:Invalid day\n", n);
				return(0);
			}
			tm = (days + n - 1) * 24L * 60L * 60L;
			continue;
		case 6:   /* hh */
			if (n > 23) {
				fprintf(stderr, "%d:Invalid hour\n", n);
				return(0);
			}
			n += tzone;  /* for time zoon */
			tm += n * 60L * 60L;
			continue;
		case 8:   /* mm */
			if (n > 59) {
				fprintf(stderr, "%d:Invalid minute\n", n);
				return(0);
			}
			tm += n * 60L;
			continue;
		case 10:  /* ss */
			if (n > 59) {
				fprintf(stderr, "%d:Invalid second\n", n);
				return(0);
			}
			tm += n;
		}
		if (localtime(&tm)->tm_isdst)
			tm -= 60L * 60L;
		return(tm);
	}
}
