--- libelwix/src/pack.c 2013/06/28 11:06:31 1.1.2.2 +++ libelwix/src/pack.c 2013/06/30 22:06:25 1.1.2.5 @@ -88,13 +88,126 @@ rpack_align_and_reserve(rpack_t * __restrict rp, size_ uint8_t rpack_uint8(rpack_t * __restrict rp, uint8_t * __restrict n) { + uint8_t u; + if (!RPACK_SANITY(rp)) return (uint8_t) -1; /* No space left */ if ((size_t) (rp->r_next - rp->r_buf) >= rp->r_len) return (uint8_t) -1; + u = *rp->r_next; if (n) *rp->r_next = *n; - return *rp->r_next++; + + rp->r_next++; + return u; +} + +/* + * rpack_uint16() - Pack/Unpack 16bit value + * + * @rp = raw buffer + * @n = set value if !=NULL + * return: -1 error or get value + */ +uint16_t +rpack_uint16(rpack_t * __restrict rp, uint16_t * __restrict n) +{ + uint16_t u; + uint8_t *next; + + if (!RPACK_SANITY(rp)) + return (uint16_t) -1; + /* No space left */ + if (!(next = rpack_align_and_reserve(rp, sizeof(uint16_t)))) + return (uint16_t) -1; + + u = EXTRACT_LE_16(next); + if (n) + RPACK_SET_16(next, n); + + rp->r_next = next + sizeof(uint16_t); + return u; +} + +/* + * rpack_uint24() - Pack/Unpack 24bit value + * + * @rp = raw buffer + * @n = set value if !=NULL + * return: -1 error or get value + */ +uint32_t +rpack_uint24(rpack_t * __restrict rp, uint32_t * __restrict n) +{ + uint32_t u; + uint8_t *next; + + if (!RPACK_SANITY(rp)) + return (uint32_t) -1; + /* No space left */ + if (!(next = rpack_align_and_reserve(rp, sizeof(uint32_t)))) + return (uint32_t) -1; + + u = EXTRACT_LE_24(next); + if (n) + RPACK_SET_24(next, n); + + rp->r_next = next + sizeof(uint32_t); + return u; +} + +/* + * rpack_uint32() - Pack/Unpack 32bit value + * + * @rp = raw buffer + * @n = set value if !=NULL + * return: -1 error or get value + */ +uint32_t +rpack_uint32(rpack_t * __restrict rp, uint32_t * __restrict n) +{ + uint32_t u; + uint8_t *next; + + if (!RPACK_SANITY(rp)) + return (uint32_t) -1; + /* No space left */ + if (!(next = rpack_align_and_reserve(rp, sizeof(uint32_t)))) + return (uint32_t) -1; + + u = EXTRACT_LE_32(next); + if (n) + RPACK_SET_32(next, n); + + rp->r_next = next + sizeof(uint32_t); + return u; +} + +/* + * rpack_uint64() - Pack/Unpack 64bit value + * + * @rp = raw buffer + * @n = set value if !=NULL + * return: -1 error or get value + */ +uint64_t +rpack_uint64(rpack_t * __restrict rp, uint64_t * __restrict n) +{ + uint64_t u; + uint8_t *next; + + if (!RPACK_SANITY(rp)) + return (uint64_t) -1; + /* No space left */ + if (!(next = rpack_align_and_reserve(rp, sizeof(uint64_t)))) + return (uint64_t) -1; + + u = EXTRACT_LE_64(next); + if (n) + RPACK_SET_64(next, n); + + rp->r_next = next + sizeof(uint64_t); + return u; }