#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 = "\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 = "\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 = "\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 = "\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 = "\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;
}
