per support


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@1127 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/tests/check-PER.c b/skeletons/tests/check-PER.c
index 5fcb1ae..6d355e8 100644
--- a/skeletons/tests/check-PER.c
+++ b/skeletons/tests/check-PER.c
@@ -1,8 +1,8 @@
 #include <per_support.c>
 #include <assert.h>
 
-int
-main() {
+static void
+check_per_decoding() {
 	uint8_t buf[] = { 0xB7, 0x19, 0x2F, 0xEE, 0xAD };
 	uint8_t tmpbuf[10];
 	int32_t z;
@@ -119,6 +119,102 @@
 	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;
+	po.buffer = po.tmpspace;
+	po.nboff = 0;
+	po.nbits = 0;
+	po.outper = Ignore;
+	po.op_key = 0;
+	po.tmpspace[0] = 0xff;
+	int ret;
+
+	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);
+
+
+}
+
+int
+main() {
+	check_per_decoding();
+	check_per_encoding();
 	return 0;
 }