even better
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@137 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/ber_tlv_tag.c b/skeletons/ber_tlv_tag.c
index f7df191..d7630c4 100644
--- a/skeletons/ber_tlv_tag.c
+++ b/skeletons/ber_tlv_tag.c
@@ -17,7 +17,7 @@
val = *(uint8_t *)ptr;
tclass = (val >> 6);
- if((val &= 31) != 31) {
+ if((val &= 0x1F) != 0x1F) {
/*
* Simple form: everything encoded in a single octet.
* Tag Class is encoded using two least significant bits.
@@ -31,8 +31,8 @@
* The MSB is 0 if it is the last octet of the tag.
*/
for(val = 0, ((char *)ptr)++, skipped = 2;
- skipped < size; ((char *)ptr)++, skipped++) {
- unsigned oct = *(uint8_t *)ptr;
+ skipped <= size; ((char *)ptr)++, skipped++) {
+ unsigned int oct = *(uint8_t *)ptr;
if(oct & 0x80) {
val = (val << 7) | (oct & 0x7F);
/*
@@ -47,7 +47,8 @@
return -1;
}
} else {
- *tag_r = (val << 9) | (oct << 2) | tclass;
+ val = (val << 7) | oct;
+ *tag_r = (val << 2) | tclass;
return skipped;
}
}
@@ -105,7 +106,7 @@
uint8_t *buf = (uint8_t *)bufp;
uint8_t *end;
size_t required_size;
- int i;
+ size_t i;
if(tval <= 30) {
/* Encoded in 1 octet */
@@ -119,8 +120,8 @@
/*
* Compute the size of the subsequent bytes.
*/
- for(required_size = 1, i = 7; i < 8 * sizeof(tag); i += 7) {
- if(tag >> i)
+ for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) {
+ if(tval >> i)
required_size++;
else
break;
@@ -133,10 +134,9 @@
* Fill in the buffer, space permitting.
*/
end = buf + required_size - 1;
- for(i -= 7; buf <= end; i -= 7, buf++) {
+ for(i -= 7; buf < end; i -= 7, buf++)
*buf = 0x80 | ((tval >> i) & 0x7F);
- }
- *end &= 0x7F; /* Clear the last high bit */
+ *buf = (tval & 0x7F); /* Last octet without high bit */
return required_size + 1;
}