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

#define	EMIT_ASN_DEBUG	1
#include <per_support.c>
#include <per_support.h>

static void
check_per_decoding() {
	uint8_t buf[] = { 0xB7, 0x19, 0x2F, 0xEE, 0xAD };
	uint8_t tmpbuf[10];
	int32_t z;
	asn_per_data_t pos;
	memset(&pos, 0, sizeof(pos));

	pos.buffer = buf;
	pos.nboff = 0;
	pos.nbits = sizeof(buf) * 8;

	z = per_get_few_bits(&pos, 32);
	assert(z == -1);
	assert(pos.nbits == sizeof(buf) * 8);

	z = per_get_few_bits(&pos, 0);
	assert(z == 0);
	assert(pos.nboff == 0);
	assert(pos.nbits == sizeof(buf) * 8);

	z = per_get_few_bits(&pos, 1);
	assert(z == 1);
	assert(pos.nboff == 1);
	assert(pos.nbits == sizeof(buf) * 8);

	z = per_get_few_bits(&pos, 2);
	assert(z == 1);
	assert(pos.nboff == 3);
	assert(pos.nbits == sizeof(buf) * 8);

	z = per_get_few_bits(&pos, 2);
	assert(z == 2);
	assert(pos.nboff == 5);
	assert(pos.nbits == sizeof(buf) * 8);

	z = per_get_few_bits(&pos, 3);
	assert(z == 7);
	assert(pos.nboff == 8);
	assert(pos.nbits == sizeof(buf) * 8);

	z = per_get_few_bits(&pos, 8);
	assert(z == 0x19);
	assert(pos.nboff == 8);
	assert(pos.nbits == (sizeof(buf) - 1) * 8);

	z = per_get_few_bits(&pos, 1);
	assert(z == 0);
	assert(pos.nboff == 1);
	assert(pos.nbits == (sizeof(buf) - 2) * 8);

	z = per_get_few_bits(&pos, 3);
	assert(z == 2);
	assert(pos.nboff == 4);
	assert(pos.nbits == (sizeof(buf) - 2) * 8);

	z = per_get_few_bits(&pos, 8);
	assert(z == 254);
	assert(pos.nboff == 12);

	pos.buffer = buf;
	pos.nboff = 2;
	pos.nbits = sizeof(buf) * 8;
	z = per_get_few_bits(&pos, 24);
	assert(z == 14443711);

	pos.buffer = (unsigned char *)"\001";
	pos.nboff = 7;
	pos.nbits = 7;
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 7);
	assert(pos.nbits == 7);
	assert(z == -1);

	pos.buffer = (unsigned char *)"\001";
	pos.nboff = 7;
	pos.nbits = 8;
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 8);
	assert(pos.nbits == 8);
	assert(z == 1);

	pos.buffer = (unsigned char *)"\000";
	pos.nboff = 7;
	pos.nbits = 8;
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 8);
	assert(pos.nbits == 8);
	assert(z == 0);
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 8);
	assert(pos.nbits == 8);
	assert(z == -1);

	pos.buffer = (unsigned char *)"\000";
	pos.nboff = 7;
	pos.nbits = 9;
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 8);
	assert(pos.nbits == 9);
	assert(z == 0);
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 1);
	assert(pos.nbits == 1);
	assert(z == 0);

	pos.buffer = (unsigned char *)"\001";
	pos.nboff = 7;
	pos.nbits = 9;
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 8);
	assert(pos.nbits == 9);
	assert(z == 1);
	z = per_get_few_bits(&pos, 1);
	assert(pos.nboff == 1);
	assert(pos.nbits == 1);
	assert(z == 0);

	/* Get full 31-bit range */
	pos.buffer = buf;
	pos.nboff = 7;
	pos.nbits = sizeof(buf) * 8;
	z = per_get_few_bits(&pos, 31);
	assert(z == 1179384747);

	/* Get a bit shifted range */
	pos.buffer = buf;
	pos.nboff = 6;
	pos.nbits = sizeof(buf) * 8;
	z = per_get_few_bits(&pos, 31);
	assert(z == 1663434197);

	pos.buffer = buf;
	pos.nboff = 0;
	pos.nbits = sizeof(buf) * 8;
	z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
	assert(z == 0);
	assert(buf[0] == tmpbuf[0]);
	assert(buf[1] == tmpbuf[1]);
	assert(buf[2] == tmpbuf[2]);
	assert(buf[3] == tmpbuf[3]);
	assert(buf[4] == tmpbuf[4]);

	pos.buffer = buf;
	pos.nboff = 1;
	pos.nbits = sizeof(buf) * 8;
	z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
	assert(z == -1);

	pos.buffer = buf;
	pos.nboff = 1;
	pos.nbits = sizeof(buf) * 8;
	z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8 - 1);
	assert(z == 0);
	assert(tmpbuf[0] == 110);
	assert(tmpbuf[1] == 50);
	assert(tmpbuf[2] == 95);
	assert(tmpbuf[3] == 221);
	assert(tmpbuf[4] == 90);

	pos.buffer = buf;
	pos.nboff = 1;
	pos.nbits = sizeof(buf) * 8;
	z = per_get_many_bits(&pos, tmpbuf, 1, sizeof(buf) * 8 - 1);
	assert(z == 0);
	assert(tmpbuf[0] == 55);
	assert(tmpbuf[0] != buf[0]);
	assert(tmpbuf[1] == buf[1]);
	assert(tmpbuf[2] == buf[2]);
	assert(tmpbuf[3] == buf[3]);
	assert(tmpbuf[4] == buf[4]);
}

static int Ignore(const void *data, size_t size, void *op_key) {
	return 0;
}

static void
check_per_encoding() {
	asn_per_outp_t po;
	int ret;

	po.buffer = po.tmpspace;
	po.nboff = 0;
	po.nbits = 0;
	po.outper = Ignore;
	po.op_key = 0;
	po.tmpspace[0] = 0xff;

	ret = per_put_few_bits(&po, 0, 0);
	assert(ret == 0);
	assert(po.nboff == 0);
	assert(po.buffer == po.tmpspace);
	assert(po.tmpspace[0] == 0xff);

	ret = per_put_few_bits(&po, 0, 1);
	assert(ret == 0);
	assert(po.nboff == 1);
	assert(po.nbits == 8 * sizeof(po.tmpspace));
	assert(po.buffer == po.tmpspace);
	assert(po.tmpspace[0] == 0x00);

	ret = per_put_few_bits(&po, 1, 1);
	assert(ret == 0);
	assert(po.nboff == 2);
	assert(po.nbits == 8 * sizeof(po.tmpspace));
	assert(po.buffer == po.tmpspace);
	assert(po.tmpspace[0] == 0x40);

	ret = per_put_few_bits(&po, 1, 1);
	assert(ret == 0);
	assert(po.nboff == 3);
	assert(po.nbits == 8 * sizeof(po.tmpspace));
	assert(po.buffer == po.tmpspace);
	assert(po.tmpspace[0] == 0x60);

	ret = per_put_few_bits(&po, 15, 5);
	assert(ret == 0);
	assert(po.nboff == 8);
	assert(po.nbits == 8 * sizeof(po.tmpspace));
	assert(po.buffer == po.tmpspace);
	assert(po.tmpspace[0] == 0x6F);

	ret = per_put_few_bits(&po, 0xf0ff, 16);
	assert(ret == 0);
	assert(po.nboff == 16);
	assert(po.nbits == 8 * sizeof(po.tmpspace) - 8);
	assert(po.buffer == po.tmpspace + 1);
	assert(po.tmpspace[0] == 0x6F);
	assert(po.tmpspace[1] == 0xf0);
	assert(po.tmpspace[2] == 0xff);

	po.nboff--;

	ret = per_put_few_bits(&po, 2, 1);
	assert(ret == 0);
	assert(po.nboff == 8);
	assert(po.nbits == 8 * sizeof(po.tmpspace) - 16);
	assert(po.buffer == po.tmpspace + 2);
	assert(po.tmpspace[0] == 0x6F);
	assert(po.tmpspace[1] == 0xf0);
	assert(po.tmpspace[2] == 0xfe);

	ret = per_put_few_bits(&po, 2, 32);
	assert(ret == -1);

	ret = per_put_few_bits(&po, 2, -1);
	assert(ret == -1);

	ret = per_put_few_bits(&po, -1, 31);
	assert(ret == 0);
	assert(po.nboff == 31);
	assert(po.nbits == 8 * sizeof(po.tmpspace) - 24);
	assert(po.buffer == po.tmpspace + 3);
	assert(po.tmpspace[0] == 0x6F);
	assert(po.tmpspace[1] == 0xf0);
	assert(po.tmpspace[2] == 0xfe);
	assert(po.tmpspace[3] == 0xff);
	assert(po.tmpspace[4] == 0xff);
	assert(po.tmpspace[5] == 0xff);
	assert(po.tmpspace[6] == 0xfe);

}

/*
 * Add N bits after P bits. Should result in N+P bits added.
 */
static void
check_per_encoding_auto() {
    int prior, next;
    int ret, i;

    for(prior = 0; prior <= 31; prior++) {
      for(next = 0; next <= 31; next++) {
        asn_per_outp_t po;
        po.buffer = po.tmpspace;
        po.nboff = 0;
        po.nbits = 0;
        po.outper = Ignore;
        po.op_key = 0;
        po.tmpspace[0] = 0xff;

        ret = per_put_few_bits(&po, -1, prior);
        assert(ret == 0);

		fprintf(stderr, " (out{nboff=%d,nbits=%d,buf_offset=%d})\n", (int)po.nboff, (int)po.nbits, (int)(po.buffer - po.tmpspace));

        ret = per_put_few_bits(&po, -1, next);
        assert(ret == 0);

		fprintf(stderr, " (out{nboff=%d,nbits=%d,buf_offset=%d})\n", (int)po.nboff, (int)po.nbits, (int)(po.buffer - po.tmpspace));

		fprintf(stderr, "Putting %d + %d bits (%d/%d), got %d bytes and %d bits\n",
            prior, next, (prior + next) / 8, (prior + next) % 8,
            (int)(po.buffer - po.tmpspace), (int)po.nboff);
        assert((po.buffer - po.tmpspace) * 8 + po.nboff == prior + next);
        for(i = 0; i < (po.buffer - po.tmpspace); i++)
            assert(po.tmpspace[0] == (unsigned char)-1);
      }
    }
}

static void
check_per_encoding_sweep_with(uint8_t buf[], int already_bits, int add_bits) {
	size_t buf_size = 8;
	asn_per_data_t pos;
	asn_per_outp_t out;
	int32_t d_already;
	int32_t d_add;
	int32_t d_left;
	int left_bits;
	int i;

	memset(&pos, 0, sizeof(pos));
	pos.buffer = buf;
	pos.nboff = 0;
	pos.nbits = buf_size * 8;

	memset(&out, 0, sizeof(out));
	out.buffer = out.tmpspace;
	out.nbits = 8 * sizeof(out.tmpspace);
	assert(sizeof(out.tmpspace) >= buf_size);
	memcpy(out.buffer, buf, buf_size);

	d_already = per_get_few_bits(&pos, already_bits);
	d_add = per_get_few_bits(&pos, add_bits);

	per_put_few_bits(&out, d_already, already_bits);
	per_put_few_bits(&out, d_add, add_bits);
	if(out.nboff % 8) {
		left_bits = 8 - (out.nboff % 8);
		d_left = per_get_few_bits(&pos, left_bits);
	} else {
		left_bits = 0;
		d_left = 0;
	}
	per_put_few_bits(&out, d_left, left_bits);
	assert(0 == (out.nboff % 8));

	if(0 != memcmp(out.tmpspace, buf, buf_size)) {
		printf("IN: ");
		for(i = 0; i < buf_size; i++)
			printf(" %02x", buf[i]);
		printf("\nOUT:");
		for(i = 0; i < buf_size; i++)
			printf(" %02x", out.tmpspace[i]);
		printf(" (out{nboff=%d,left=%d,%02x})\n", (int)out.nboff, left_bits, (int)d_left);
		assert(0 == memcmp(out.tmpspace, buf, buf_size));
	}
}

static void
check_per_encoding_sweep() {
	uint8_t buf[3][8] = {
		{ 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA },
		{ 0xB7, 0x19, 0x2F, 0xEE, 0xAD, 0x11, 0xAA, 0x55 },
		{ 0xEE, 0xAD, 0x11, 0xAA, 0x55, 0xB7, 0x19, 0x2F }
	};
	int already_bits;
	int add_bits;
	int buf_idx;

	for(buf_idx = 0; buf_idx < 3; buf_idx++) {
	 for(already_bits = 0; already_bits < 24; already_bits++) {
	  for(add_bits = 0; add_bits <= 31; add_bits++) {
	   /*fprintf(stderr, "PER %d += %d\n", already_bits, add_bits);*/
	   check_per_encoding_sweep_with(buf[buf_idx], already_bits, add_bits);
	  }
	 }
	}
}

int
main() {
	check_per_decoding();
	check_per_encoding();
	check_per_encoding_auto();
	check_per_encoding_sweep();
	return 0;
}
