#define	__NO_ASN_TABLE__
#include <GeneralizedTime.c>
#include <constraints.c>

static void
check(char *time_str, time_t expect, int as_gmt) {
	GeneralizedTime_t gt;
	struct tm tm;
	time_t tloc;

	gt.buf = time_str;
	gt.size = strlen(time_str);

	tloc = asn_GT2time(&gt, &tm, as_gmt);
	printf("%s: [%s] -> %ld == %ld\n",
		as_gmt?"GMT":"ofs", time_str, (long)tloc, (long)expect);
	if(tloc != -1)
	printf("\t%04d-%02d-%02dT%02d:%02d:%02d%+03ld%02ld\n",
		tm.tm_year + 1900,
		tm.tm_mon + 1,
		tm.tm_mday,
		tm.tm_hour,
		tm.tm_min,
		tm.tm_sec,
		(tm.tm_gmtoff / 3600),
		labs(tm.tm_gmtoff % 3600)
	);
	assert(tloc == expect);

	assert(tloc == -1 || as_gmt == 0 || tm.tm_gmtoff == 0);

	if(!as_gmt) check(time_str, expect, 1);
}

static void
rcheck(time_t tloc, const char *expect, int force_gmt) {
	GeneralizedTime_t *gt;
	struct tm tm, *tmp;

	tmp = localtime_r(&tloc, &tm);
	assert(tmp);

	gt = asn_time2GT(0, &tm, force_gmt);
	if(gt) {
		assert(expect);
		printf("[%s] vs [%s] (%d)\n",
			gt->buf, expect, force_gmt);
		assert(gt->size == (int)strlen(gt->buf));
		assert(!strcmp(gt->buf, expect));
	} else {
		assert(!expect);
	}
}

int
main(int ac, char **av) {

	(void)av;

	check("200401250", -1, 0);
	check("2004012509300", -1, 0);
	check("20040125093000-", -1, 0);
	check("20040125093007-0", -1, 0);
	check("20040125093007-080", -1, 0);
	check("200401250930.01Z", -1, 0);

	/* These six are from X.690:11.7.5 */
	check("19920520240000Z", -1, 0);  /* midnight represented incorrectly */
	//check("19920622123421.0Z", -1, 0);  /* spurious trailing zeros */
	//check("19920722132100.30Z", -1, 0); /* spurious trailing zeros */
	check("19920521000000Z", 706406400, 0);
	check("19920622123421Z", 709216461, 0);
	check("19920722132100.3Z", 711811260, 0);

	check("20040125093007Z", 1075023007, 0);
	check("20040125093007+00", 1075023007, 0);
	check("20040125093007.01+0000", 1075023007, 0);
	check("20040125093007,1+0000", 1075023007, 0);
	check("20040125093007-0800", 1075051807, 0);

	rcheck(1075023007, "20040125093007Z", 1);

	if(ac > 1) {
		/* These will be valid only inside PST time zone */
		check("20040125093007", 1075051807, 0);
		check("200401250930", 1075051800, 0);
		check("20040125093000,01", 1075051800, 0);
		check("20040125093000,1234", 1075051800, 0);

		rcheck(1075023007, "20040125013007-0800", 0);
	}

	return 0;
}

/*
 * Dummy function.
 */

der_enc_rval_t
OCTET_STRING_encode_der(asn1_TYPE_descriptor_t *td, void *ptr, int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) {
	der_enc_rval_t erval;

	(void)td;
	(void)ptr;
	(void)tag_mode;
	(void)tag;
	(void)cb;
	(void)app_key;

	return erval;
}
