#include <stdio.h>
#include <assert.h>
#include <math.h>
#include <float.h>

/* C11 specifies DBL_TRUE_MIN, might not be immediately available. */
#ifndef DBL_TRUE_MIN
#define DBL_TRUE_MIN    4.9406564584124654E-324
#endif

#include <REAL.h>

static char reconstructed[2][512];
static int reconstr_lens[2];

static int
callback(const void *buffer, size_t size, void *app_key) {
	char *buf = reconstructed[app_key ? 1 : 0];
	int *len = &reconstr_lens[app_key ? 1 : 0];

	if(*len + size >= sizeof(reconstructed[0]))
		return -1;

	memcpy(buf + *len, buffer, size);
	*len += size;

	return 0;
}

static char *
d2s(double d, int canonical) {
	ssize_t s;

	reconstr_lens[canonical] = 0;
	s = REAL__dump(d, canonical, callback, (void *)(ptrdiff_t)canonical);
	assert(s > 0 && (size_t)s < sizeof(reconstructed[canonical]));
	assert(s == reconstr_lens[canonical]);
	reconstructed[canonical][s] = '\0';	// ASCIIZ
	return reconstructed[canonical];
}

/*
 * Verify that a string representation of a given floating point value
 * is as given in the (sample) and (canonical_sample) arguments.
 */
static void
check_str_representation(double d, const char *sample, const char *canonical_sample, int lineno) {
	char *s0, *s1;

	s0 = d2s(d, 0);
	s1 = d2s(d, 1);

	if(sample) {
		printf("%03d: Checking %g->[\"%s\"] against [\"%s\"]%s\n",
			lineno, d, s0, sample,
			canonical_sample ? " (canonical follows...)" : ""
		);
		assert(!strcmp(s0, sample));
	}
	if(canonical_sample) {
		printf("%03d: Checking %g->[\"%s\"] against [\"%s\"] (canonical)\n",
			lineno, d, s1, canonical_sample);
		assert(!strcmp(s1, canonical_sample));
	}
}

#define	check(rn, d, str1, str2)	\
	check_impl(rn, d, str1, str2, __LINE__)

static void
check_impl(REAL_t *rn, double orig_dbl, const char *sample, const char *canonical_sample, int lineno) {
	double val;
	uint8_t *p, *end;
	int ret;

	printf("Line %d: double value %.12f [", lineno, orig_dbl);
	for(p = (uint8_t *)&orig_dbl, end = p + sizeof(double); p < end ; p++)
		printf("%02x", *p);
	printf("] (ilogb %d)\n", ilogb(orig_dbl));

	val = frexp(orig_dbl, &ret);
	printf("frexp(%f, %d): [", val, ret);
	for(p = (uint8_t *)&val, end = p + sizeof(double); p < end ; p++)
		printf("%02x", *p);
	printf("]\n");

	ret = asn_double2REAL(rn, orig_dbl);
	assert(ret == 0);

	printf("converted into [");
	for(p = rn->buf, end = p + rn->size; p < end; p++)
		printf("%02x", *p);
	printf("]: %zu\n", rn->size);

	ret = asn_REAL2double(rn, &val);
	assert(ret == 0);

	printf("and back to double: [");
	for(p = (uint8_t *)&val, end = p + sizeof(double); p < end ; p++)
		printf("%02x", *p);
	printf("] (ilogb %d)\n", ilogb(val));

	printf("%.12f vs %.12f\n", val, orig_dbl);
	assert((isnan(orig_dbl) && isnan(val)) || val == orig_dbl);
	printf("OK\n");

	check_str_representation(val, sample, canonical_sample, lineno);
}
static void
check_xer(int fuzzy, double orig_value) {
	asn_enc_rval_t er;
	asn_dec_rval_t rc;
	REAL_t st;
	REAL_t *newst0 = 0;
	REAL_t *newst1 = 0;
	REAL_t **newst0p = &newst0;
	REAL_t **newst1p = &newst1;
	double value0, value1;
	int ret;

	memset(&st, 0, sizeof(st));
	ret = asn_double2REAL(&st, orig_value);
	assert(ret == 0);

	reconstr_lens[0] = 0;
	reconstr_lens[1] = 0;
	er = xer_encode(&asn_DEF_REAL, &st,
		XER_F_BASIC, callback, 0);
	assert(er.encoded == reconstr_lens[0]);
	er = xer_encode(&asn_DEF_REAL, &st,
		XER_F_CANONICAL, callback, (void *)1);
	assert(er.encoded == reconstr_lens[1]);
	reconstructed[0][reconstr_lens[0]] = 0;
	reconstructed[1][reconstr_lens[1]] = 0;

	printf("%f vs (%d)[%s] & (%d)%s",
		orig_value,
		reconstr_lens[1], reconstructed[1],
		reconstr_lens[0], reconstructed[0]
	);

	rc = xer_decode(0, &asn_DEF_REAL, (void **)newst0p,
		reconstructed[0], reconstr_lens[0]);
	assert(rc.code == RC_OK);
	assert(reconstr_lens[0] > 0 && rc.consumed < (size_t)reconstr_lens[0]);

	rc = xer_decode(0, &asn_DEF_REAL, (void **)newst1p,
		reconstructed[1], reconstr_lens[1]);
	assert(rc.code == RC_OK);
	assert(rc.consumed == (size_t)reconstr_lens[1]);

	ret = asn_REAL2double(newst0, &value0);
	assert(ret == 0);
	ret = asn_REAL2double(newst1, &value1);
	assert(ret == 0);

	assert((isnan(value0) && isnan(orig_value))
		|| value0 == orig_value
		|| fuzzy);
	assert((isnan(value1) && isnan(orig_value))
		|| value1 == orig_value);

	assert(newst0->size == st.size || fuzzy);
	assert(newst1->size == st.size);
	assert(fuzzy || memcmp(newst0->buf, st.buf, st.size) == 0);
	assert(memcmp(newst1->buf, st.buf, st.size) == 0);
}

static void
check_ber_buffer_twoway(double d, const char *sample, const char *canonical_sample, const uint8_t *inbuf, size_t insize, uint8_t *outbuf, size_t outsize, int lineno) {
	REAL_t rn;
	double val;
	int ret;

	/*
	 * Decode our expected buffer and check that it matches the given (d).
	 */
	rn.buf = calloc(1, insize + 1); /* By convention, buffers have extra \0 */
	assert(rn.buf);
	memcpy(rn.buf, inbuf, insize);
	rn.size = insize;
	asn_REAL2double(&rn, &val);
	if(isnan(val)) assert(isnan(d));
	if(isnan(d)) assert(isnan(val));
	if(!isnan(val) && !isnan(d)) {
		assert(copysign(1.0, d) == copysign(1.0, val));
		assert(d == val);
	}

	/*
	 * Encode value and check that it matches our expected buffer.
	 */
	free(rn.buf);
	memset(&rn, 0, sizeof(rn));
	ret = asn_double2REAL(&rn, d);
	assert(ret == 0);
	if((size_t)rn.size != outsize) {
		printf("Encoded %f into %d expected %ld\n",
			d, (int)rn.size, outsize);
		assert((size_t)rn.size == outsize);
	}
	assert(memcmp(rn.buf, outbuf, rn.size) == 0);

	check_str_representation(d, sample, canonical_sample, lineno);
}

static void
check_ber_buffer_oneway(double d, const char *sample, const char *canonical_sample, uint8_t *buf, size_t bufsize, int lineno) {
	REAL_t rn;
	double val;
	uint8_t *p, *end;
	int ret;

	memset(&rn, 0, sizeof(rn));

	printf("verify double value %.12f [", d);
	for(p = (uint8_t *)&d, end = p + sizeof(double); p < end ; p++)
		printf("%02x", *p);
	printf("] (ilogb %d)\n", ilogb(d));


	ret = asn_double2REAL(&rn, d);
	assert(ret == 0);

	printf("canonical DER: [");
	for(p = rn.buf, end = p + rn.size; p < end; p++)
		printf("%02x", *p);
	printf("]\n");

	rn.buf = buf;
	rn.size = bufsize;

	printf("received as:   [");
	for(p = rn.buf, end = p + rn.size; p < end; p++)
		printf("%02x", *p);
	printf("]\n");

	ret = asn_REAL2double(&rn, &val);
	assert(ret == 0);

	printf("%.12f vs %.12f\n", d, val);

	assert(val == d);

	check_str_representation(val, sample, canonical_sample, lineno);
}

/*
 * 8.5.7 Verify binary encoding, two-way.
 */
static void
check_ber_857_encoding(int base, int sign, int scaling_factor, int exponent, int mantissa) {
	uint8_t buf[100];
	uint8_t *b = buf;
	int explen, mantlen;
	REAL_t rn;
	static REAL_t rn_check;
	double d;
	double verify;
	int baseF = 0;
	int ret;

#define	BIT(b)	(1<<(b - 1))

	switch(base) {
	case 0: baseF = 1; break;
	case 1: baseF = 3; break;
	case 2: baseF = 4; break;
	default: assert(base >= 0 && base <= 2);
	}

	if(exponent >= -128 && exponent <= 127) {
		explen = 1;
	} else {
		assert(exponent > -60000 && exponent < 60000);
		explen = 2;
	}

	if(mantissa == 0) {
		mantlen = 0;
	} else if(mantissa >= 0 && mantissa <= 255) {
		mantlen = 1;
	} else if(mantissa >= 0 && mantissa <= 65535) {
		mantlen = 2;
	} else {
		assert(mantissa >= 0 && mantissa <= 256 * 65536);
		mantlen = 3;
	}

	*b = BIT(8) | (sign ? BIT(7) : 0);
	*b |= (base & 0x03) << 4;	/* 8.5.7.2 */
	*b |= (scaling_factor & 0x03) << 2;	/* 8.5.7.3 */
	*b |= ((explen - 1) & 0x03);	/* 8.5.7.4 */
	b++;
	switch(explen) {
	case 2: *b++ = (int8_t)(exponent >> 8);
	case 1: *b++ = (int8_t)exponent;
	}
	switch(mantlen) {
	case 3: *b++ = (mantissa >> 16) & 0xff;
	case 2: *b++ = (mantissa >> 8) & 0xff;
	case 1: *b++ = (mantissa & 0xff);
	}

	verify = (sign ? -1.0 : 1.0) * ldexp(mantissa, exponent * baseF + scaling_factor);

	/* Verify than encoding of this double value round-trips */
	if(!isinf(verify)) {
		d = verify;
		verify = 0.0;
		ret = asn_double2REAL(&rn_check, d);
		assert(ret == 0);
		ret = asn_REAL2double(&rn_check, &verify);
		assert(ret == 0);
		assert(d == verify);

		/* Verify with a slight non-friendly offset. Not too easy. */
		d = verify - 0.13;
		verify = 0.0;
		ret = asn_double2REAL(&rn_check, d);
		assert(ret == 0);
		ret = asn_REAL2double(&rn_check, &verify);
		assert(ret == 0);
		assert(ret == 0);
		assert(d == verify);
	}

	verify = (sign ? -1.0 : 1.0) * ldexp(mantissa, exponent * baseF + scaling_factor);

	rn.buf = buf;
	rn.size = b - buf;
	ret = asn_REAL2double(&rn, &d);
	if(!isinf(verify) && (ret != 0 || d != verify)) {
		printf("Converting B=%d, S=%d, F=%d, E=%d/%d, M=%d/%d\n", (1 << baseF), sign, scaling_factor, exponent, explen, mantissa, mantlen);
		printf("Verify: %e\n", verify);
		uint8_t *p;
		printf("received as:   [");
		for(p = buf; p < b; p++) printf("%02x", *p);
		printf("]\n");
		assert(ret == 0);
		printf("Converted: %e\n", d);
		assert(d == verify);
	}
}

static void
check_ber_encoding() {
#define CHECK_BER_STRICT(v, nocan, can, inbuf, outbuf)			\
	check_ber_buffer_twoway(v, nocan, can, inbuf, sizeof(inbuf),	\
				outbuf, sizeof(outbuf), __LINE__)

#define CHECK_BER_NONSTRICT(v, nocan, can, buf)	\
	check_ber_buffer_oneway(v, nocan, can, buf, sizeof(buf), __LINE__)

	/*
	 * X.690 8.4 Encoding of an enumerated value.
	 */

	/* 8.5.2 If the real value is the value plus zero,
	 * there shall be no contents octet in the encoding */
	{ uint8_t b_0[] = {};
	  CHECK_BER_STRICT(0.0, "0", "0", b_0, b_0); }

	/* 8.5.3 When -0 is to be encoded, there shall be only one contents octet */
	{ uint8_t b_m0[] = { 0x43 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0, b_m0); }

    /* Old way of encoding -0.0: 8.5.6 a) */
	{ uint8_t b_m0[] = { 0x43 };
	  uint8_t b_m0_856a[]   = { 0xC0, 0x00 };  /* #8.5.6 a) */
	  uint8_t b_m0_856a_1[] = { 0xC0, 0x00, 0x00 };
	  uint8_t b_m0_856a_2[] = { 0xC0, 0x00, 0x00, 0x00 };
	  uint8_t b_m0_856a_3[] = { 0xC0, 0x00, 0x00, 0x00, 0x00 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_856a, b_m0);
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_856a_1, b_m0);
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_856a_2, b_m0);
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_856a_3, b_m0); }

	/* 8.5.6 c) => 8.5.9 SpecialRealValue */
	{ uint8_t b_pinf[] = { 0x40 };
	  uint8_t b_minf[] = { 0x41 };
	  uint8_t b_nan[]  = { 0x42 };
	  CHECK_BER_STRICT(INFINITY, "<PLUS-INFINITY/>", "<PLUS-INFINITY/>", b_pinf, b_pinf);
	  CHECK_BER_STRICT(-INFINITY, "<MINUS-INFINITY/>", "<MINUS-INFINITY/>", b_minf, b_minf);
	  CHECK_BER_STRICT(NAN, "<NOT-A-NUMBER/>", "<NOT-A-NUMBER/>", b_nan, b_nan); }

	/* 8.5.6 b) => 8.5.8 Decimal encoding is used; NR1 form */
	{ uint8_t b_0_nr1[] = { 0x01, '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr1, b_0); }
	{ uint8_t b_0_nr1[] = { 0x01, '0', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr1, b_0); }
	{ uint8_t b_0_nr1[] = { 0x01, ' ', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr1, b_0); }
	{ uint8_t b_p0_nr1[] = { 0x01, '+', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_p0_nr1, b_0); }
	{ uint8_t b_p0_nr1[] = { 0x01, ' ', '+', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_p0_nr1, b_0); }
	{ uint8_t b_m0_nr1[] = { 0x01, '-', '0' };
	  uint8_t b_m0[] = { 0x43 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_nr1, b_m0); }
	{ uint8_t b_m0_nr1[] = { 0x01, ' ', '-', '0' };
	  uint8_t b_m0[] = { 0x43 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_nr1, b_m0); }

	{ uint8_t b_1_nr1[] = { 0x01, '1' };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_1_nr1, b_1); }
	{ uint8_t b_1_nr1[] = { 0x01, '0', '1' };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_1_nr1, b_1); }
	{ uint8_t b_1_nr1[] = { 0x01, ' ', '1' };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_1_nr1, b_1); }
	{ uint8_t b_p1_nr1[] = { 0x01, '+', '1' };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_p1_nr1, b_1); }
	{ uint8_t b_p1_nr1[] = { 0x01, ' ', '+', '1' };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_p1_nr1, b_1); }
	{ uint8_t b_m1_nr1[] = { 0x01, '-', '1' };
	  uint8_t b_m1[] = { 0xC0, 0x00, 0x01 };
	  CHECK_BER_STRICT(-1.0, "-1.0", "-1.0E0", b_m1_nr1, b_m1); }
	{ uint8_t b_m1_nr1[] = { 0x01, ' ', '-', '1' };
	  uint8_t b_m1[] = { 0xC0, 0x00, 0x01 };
	  CHECK_BER_STRICT(-1.0, "-1.0", "-1.0E0", b_m1_nr1, b_m1); }

 {
  uint8_t comma_symbol[] = { '.', ',' };
  int csi;
  for(csi = 0; csi < 2; csi++) {
	uint8_t CS = comma_symbol[csi];

	/* 8.5.6 b) => 8.5.8 Decimal encoding is used; NR2 form */
	{ uint8_t b_0_nr2[] = { 0x02, '0', CS, '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr2, b_0); }
	{ uint8_t b_0_nr2[] = { 0x02, '0', '0', CS, '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr2, b_0); }
	{ uint8_t b_0_nr2[] = { 0x02, ' ', '0', CS, '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr2, b_0); }
	{ uint8_t b_p0_nr2[] = { 0x02, '+', '0', CS, '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_p0_nr2, b_0); }
	{ uint8_t b_p0_nr2[] = { 0x02, ' ', '+', '0', CS, '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_p0_nr2, b_0); }
	{ uint8_t b_m0_nr2[] = { 0x02, '-', '0', CS, '0' };
	  uint8_t b_m0[] = { 0x43 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_nr2, b_m0); }
	{ uint8_t b_m0_nr2[] = { 0x02, ' ', '-', '0', CS, '0' };
	  uint8_t b_m0[] = { 0x43 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_nr2, b_m0); }

	/* 8.5.6 b) => 8.5.8 NR2 "1." */
	{ uint8_t b_1_nr2[] = { 0x02, '1', CS };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_1_nr2, b_1); }
	{ uint8_t b_1_nr2[] = { 0x02, '0', '1', CS };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_1_nr2, b_1); }
	{ uint8_t b_1_nr2[] = { 0x02, ' ', '1', CS };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_1_nr2, b_1); }
	{ uint8_t b_p1_nr2[] = { 0x02, '+', '1', CS };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_p1_nr2, b_1); }
	{ uint8_t b_p1_nr2[] = { 0x02, ' ', '+', '1', CS };
	  uint8_t b_1[] = { 0x80, 0x00, 0x01 };
	  CHECK_BER_STRICT(1.0, "1.0", "1.0E0", b_p1_nr2, b_1); }
	{ uint8_t b_m1_nr2[] = { 0x02, '-', '1', CS };
	  uint8_t b_m1[] = { 0xC0, 0x00, 0x01 };
	  CHECK_BER_STRICT(-1.0, "-1.0", "-1.0E0", b_m1_nr2, b_m1); }
	{ uint8_t b_m1_nr2[] = { 0x02, ' ', '-', '1', CS };
	  uint8_t b_m1[] = { 0xC0, 0x00, 0x01 };
	  CHECK_BER_STRICT(-1.0, "-1.0", "-1.0E0", b_m1_nr2, b_m1); }

	/* 8.5.6 b) => 8.5.8 NR2 ".5" */
	{ uint8_t b_05_nr2[] = { 0x02, CS, '5' };
	  uint8_t b_05[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_05_nr2, b_05); }
	{ uint8_t b_05_nr2[] = { 0x02, '0', CS, '5' };
	  uint8_t b_05[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_05_nr2, b_05); }
	{ uint8_t b_05_nr2[] = { 0x02, ' ', CS, '5' };
	  uint8_t b_05[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_05_nr2, b_05); }
	{ uint8_t b_p1_nr2[] = { 0x02, '+', CS, '5' };
	  uint8_t b_05[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_p1_nr2, b_05); }
	{ uint8_t b_p1_nr2[] = { 0x02, ' ', '+', CS, '5' };
	  uint8_t b_05[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_p1_nr2, b_05); }
	{ uint8_t b_m05_nr2[] = { 0x02, '-', CS, '5' };
	  uint8_t b_m05[] = { 0xC0, 0xff, 0x01 };
	  CHECK_BER_STRICT(-0.5, "-0.5", "-5.0E-1", b_m05_nr2, b_m05); }
	{ uint8_t b_m05_nr2[] = { 0x02, ' ', '-', CS, '5' };
	  uint8_t b_m05[] = { 0xC0, 0xff, 0x01 };
	  CHECK_BER_STRICT(-0.5, "-0.5", "-5.0E-1", b_m05_nr2, b_m05); }

	/* 8.5.6 b) => 8.5.8 Decimal encoding is used; NR3 form */
	{ uint8_t b_0_nr3[] = { 0x03, '0', CS, '0', 'e', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr3, b_0); }
	{ uint8_t b_0_nr3[] = { 0x03, '0', '0', CS, '0', 'E', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr3, b_0); }
	{ uint8_t b_0_nr3[] = { 0x03, ' ', '0', CS, '0', 'e', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_0_nr3, b_0); }
	{ uint8_t b_p0_nr3[] = { 0x03, '+', '0', CS, '0', 'E', '+', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_p0_nr3, b_0); }
	{ uint8_t b_p0_nr3[] = { 0x03, ' ', '+', '0', CS, '0', 'e', '+', '0' };
	  uint8_t b_0[] = { };
	  CHECK_BER_STRICT(0.0, "0", "0", b_p0_nr3, b_0); }
	{ uint8_t b_m0_nr3[] = { 0x03, '-', '0', CS, '0', 'E', '-', '0' };
	  uint8_t b_m0[] = { 0x43 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_nr3, b_m0); }
	{ uint8_t b_m0_nr3[] = { 0x03, ' ', '-', '0', CS, '0', 'e', '-', '0' };
	  uint8_t b_m0[] = { 0x43 };
	  CHECK_BER_STRICT(-0.0, "-0", "-0", b_m0_nr3, b_m0); }

	/* 8.5.6 b) => 8.5.8 NR3 "5.e-1" */
	{ uint8_t b_5_nr3[] = { 0x03, '5', CS, 'e', '-', '1' };
	  uint8_t b_5[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_5_nr3, b_5); }
	{ uint8_t b_5_nr3[] = { 0x03, '0', '5', CS, 'E', '-', '1' };
	  uint8_t b_5[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_5_nr3, b_5); }
	{ uint8_t b_5_nr3[] = { 0x03, ' ', '5', CS, 'e', '-', '1' };
	  uint8_t b_5[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_5_nr3, b_5); }
	{ uint8_t b_p5_nr3[] = { 0x03, '+', '5', CS, 'E', '-', '1' };
	  uint8_t b_5[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_p5_nr3, b_5); }
	{ uint8_t b_p5_nr3[] = { 0x03, ' ', '+', '5', CS, 'e', '-', '1' };
	  uint8_t b_5[] = { 0x80, 0xff, 0x01 };
	  CHECK_BER_STRICT(0.5, "0.5", "5.0E-1", b_p5_nr3, b_5); }
	{ uint8_t b_m5_nr3[] = { 0x03, '-', '5', CS, 'E', '-', '1' };
	  uint8_t b_m5[] = { 0xC0, 0xff, 0x01 };
	  CHECK_BER_STRICT(-0.5, "-0.5", "-5.0E-1", b_m5_nr3, b_m5); }
	{ uint8_t b_m5_nr3[] = { 0x03, ' ', '-', '5', CS, 'e', '-', '1' };
	  uint8_t b_m5[] = { 0xC0, 0xff, 0x01 };
	  CHECK_BER_STRICT(-0.5, "-0.5", "-5.0E-1", b_m5_nr3, b_m5); }

	/* 8.5.6 b) => 8.5.8 NR3 ".5e1" */
	{ uint8_t b_05_nr3[] = { 0x03, CS, '5', 'e', '+', '1' };
	  uint8_t b_05[] = { 0x80, 0x00, 0x05 };
	  CHECK_BER_STRICT(5.0, "5.0", "5.0E0", b_05_nr3, b_05); }
	{ uint8_t b_05_nr3[] = { 0x03, '0', CS, '5', 'E', '+', '1'};
	  uint8_t b_05[] = { 0x80, 0x00, 0x05 };
	  CHECK_BER_STRICT(5.0, "5.0", "5.0E0", b_05_nr3, b_05); }
	{ uint8_t b_05_nr3[] = { 0x03, ' ', CS, '5', 'e', '1'};
	  uint8_t b_05[] = { 0x80, 0x00, 0x05 };
	  CHECK_BER_STRICT(5.0, "5.0", "5.0E0", b_05_nr3, b_05); }
	{ uint8_t b_p1_nr3[] = { 0x03, '+', CS, '5', 'E', '1' };
	  uint8_t b_05[] = { 0x80, 0x00, 0x05 };
	  CHECK_BER_STRICT(5.0, "5.0", "5.0E0", b_p1_nr3, b_05); }
	{ uint8_t b_p1_nr3[] = { 0x03, ' ', '+', CS, '5', 'e', '+', '1' };
	  uint8_t b_05[] = { 0x80, 0x00, 0x05 };
	  CHECK_BER_STRICT(5.0, "5.0", "5.0E0", b_p1_nr3, b_05); }
	{ uint8_t b_m05_nr3[] = { 0x03, '-', CS, '5', 'E', '+', '1' };
	  uint8_t b_m05[] = { 0xC0, 0x00, 0x05 };
	  CHECK_BER_STRICT(-5.0, "-5.0", "-5.0E0", b_m05_nr3, b_m05); }
	{ uint8_t b_m05_nr3[] = { 0x03, ' ', '-', CS, '5', 'e', '1' };
	  uint8_t b_m05[] = { 0xC0, 0x00, 0x05 };
	  CHECK_BER_STRICT(-5.0, "-5.0", "-5.0E0", b_m05_nr3, b_m05); }
  } /* for(comma symbol) */
 }

  /* Scan through the range of bits, construct the valid base-2 numbers, and
   * try two-way conversion with them */
 {
  int base, sign, scaling_factor, exponent, mantissa;
  for(base = 0; base <= 2; base++) {
    for(sign = 0; sign <= 1; sign++) {
      for(scaling_factor = 0; scaling_factor <= 3; scaling_factor++) {
        for(exponent = -1000; exponent < 1000; exponent += (exponent > -990 && exponent < 990) ? 100 : 1) {
          for(mantissa = 0; mantissa < 66000; mantissa += (mantissa > 300 && mantissa < 65400) ? 100 : 1) {
            check_ber_857_encoding(base, sign, scaling_factor, exponent, mantissa);
          }
	}
      }
    }
  }
 }

	{
	uint8_t b_1_0[] =
		{ 0x80, 0xcc, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
	uint8_t b_1_1[] =
		{ 0x80, 0xcc, 0x11, 0x99, 0x99, 0x99, 0x99, 0x99, 0x9a };
	uint8_t b_3_14[] =
		{ 0x80, 0xcd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f };
	uint8_t b_3_14_mo1[] =
		{ 0xC0, 0xc5, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3};
	uint8_t b_3_14_mo2[] =
		{ 0x80, 0xbd, 0x19, 0x1e, 0xb8, 0x51, 0xeb, 0x85, 0x1f,3,2};

	CHECK_BER_NONSTRICT(1.0, "1.0", "1.0E0", b_1_0);
	CHECK_BER_NONSTRICT(1.1, "1.1", "1.1E0", b_1_1);
	CHECK_BER_NONSTRICT(3.14, "3.14", "3.14E0", b_3_14);
	/* These two are very interesting! They check mantissa overflow! */
	CHECK_BER_NONSTRICT(-3.14, "-3.14", "-3.14E0", b_3_14_mo1);
	CHECK_BER_NONSTRICT(3.14, "3.14", "3.14E0", b_3_14_mo2);
	}
}

int
main() {
	REAL_t rn;
	memset(&rn, 0, sizeof(rn));

	check_ber_encoding();

	check(&rn, 0.0, "0", "0");
	check(&rn, -0.0, "-0", "-0");	/* minus-zero */
	check(&rn, NAN, "<NOT-A-NUMBER/>", "<NOT-A-NUMBER/>");
	check(&rn, INFINITY, "<PLUS-INFINITY/>", "<PLUS-INFINITY/>");
	check(&rn, -INFINITY, "<MINUS-INFINITY/>", "<MINUS-INFINITY/>");
	check(&rn, 1.0, "1.0", "1.0E0");
	check(&rn, -1.0, "-1.0", "-1.0E0");
	check(&rn, 0.1, "0.1", "1.0E-1");
	check(&rn, 0.01, "0.01", "1.0E-2");
	check(&rn, 0.02, "0.02", "2.0E-2");
	check(&rn, 0.09, "0.09", "9.0E-2");
	check(&rn, 1.5, "1.5", "1.5E0");
	check(&rn, 0.33333, "0.33333", "3.3333E-1");
	check(&rn, 2, "2.0", "2.0E0");
	check(&rn, 2.1, "2.1", "2.1E0");
	check(&rn, 3, "3.0", "3.0E0");
	check(&rn, 3.1, "3.1", "3.1E0");
	check(&rn, 3.14, "3.14", "3.14E0");
	check(&rn, 3.1415, "3.1415", "3.1415E0");
	check(&rn, 3.141592, "3.141592", "3.141592E0");
	check(&rn, 3.14159265, "3.14159265", "3.14159265E0");
	check(&rn, -3.14159265, "-3.14159265", "-3.14159265E0");
	check(&rn, 14159265.0, "14159265.0", "1.4159265E7");
	check(&rn, -123456789123456789.0, "-123456789123456784.0", "-1.234567891234568E17");
	check(&rn, 0.00000000001, "0.00000000001", "9.999999999999999E-12");
	check(&rn, 0.00000000002, "0.00000000002", "2.0E-11");
	check(&rn, 0.00000000009, "0.00000000009", "9.0E-11");
	check(&rn, 0.000000000002, "0.000000000002", "2.0E-12");
	check(&rn, 0.0000000000002, "0.0000000000002", "2.0E-13");
	check(&rn, 0.00000000000002, "0.00000000000002", "2.0E-14");
	check(&rn, 0.000000000000002, "0.000000000000002", "2.0E-15");
	check(&rn, 0.0000000000000002, "0.0", "2.0E-16");
	check(&rn, 0.0000000000000000000001, "0.0", "1.0E-22");
	check(&rn, 0.000000000000000000000000000001, "0.0", "1.0E-30"); /* proved 2B a problem */
	check(&rn,-0.000000000000000000000000000001, "-0.0", "-1.0E-30"); /* proved 2B a problem */
	check(&rn, 0.0000000000010000000001000000000001, 0, 0);
	check(&rn, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001, 0, 0);
	check(&rn, 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001, 0, 0);
	check(&rn,-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001, 0, 0);
	check(&rn,-3.33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333, 0, 0);
	check(&rn, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333, 0, 0);
	check(&rn, 0.25, "0.25", "2.5E-1");
	check(&rn, -0.25, "-0.25", "-2.5E-1");
	check(&rn, 0.03, "0.03", "3.0E-2");
	check(&rn, -0.03, "-0.03", "-3.0E-2");

	check(&rn, 4.01E-50, "0.0", "4.01E-50");
	check(&rn, -4.01E-50, "-0.0", "-4.01E-50");
	check(&rn, -4.9406564584124654E-324, "-0.0", "-4.940656458412465E-324"); /* MIN */
	check(&rn, DBL_MIN, "0.0", "2.225073858507201E-308"); /* MIN */
	check(&rn, -DBL_MIN, "-0.0", "-2.225073858507201E-308"); /* -MIN */
	check(&rn, DBL_MAX, "179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0", "1.797693134862316E308"); /* MAX */
	check(&rn, -DBL_MAX, "-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0", "-1.797693134862316E308"); /* MAX */
	check(&rn, -DBL_TRUE_MIN, "-0.0", "-4.940656458412465E-324"); /* subnorm */
	check(&rn, DBL_TRUE_MIN, "0.0",    "4.940656458412465E-324"); /* subnorm */


#ifdef	NAN
	check_xer(0, NAN);	/* "<NOT-A-NUMBER/>" */
#else
	check_xer(0, zero/zero);	/* "<NOT-A-NUMBER/>" */
#endif
#ifdef	INFINITY
	check_xer(0, INFINITY);		/* "<PLUS-INFINITY/>" */
	check_xer(0, -INFINITY);	/* "<MINUS-INFINITY/>" */
#else
	check_xer(0, 1.0/zero);		/* "<PLUS-INFINITY/>" */
	check_xer(0, -1.0/zero);	/* "<MINUS-INFINITY/>" */
#endif
	check_xer(0, 1.0);
	check_xer(0, -1.0);
	check_xer(0, 1.5);
	check_xer(0, 123);
	check_xer(1, 0.0000000000000000000001);
	check_xer(1, -0.0000000000000000000001);

	return 0;
}
