File:  [ELWIX - Embedded LightWeight unIX -] / libelwix / src / pack.c
Revision 1.1.2.4: download - view: text, annotated - select for diffs - revision graph
Sun Jun 30 21:46:59 2013 UTC (10 years, 11 months ago) by misho
Branches: elwix1_9
add new macro

    1: #include "global.h"
    2: 
    3: 
    4: static inline uint8_t *
    5: rpack_next_boundary(uint8_t * __restrict buf, uint8_t * __restrict p, size_t align)
    6: {
    7: 	size_t misa = (size_t) (p - buf) % align;
    8: 
    9: 	if (!misa)
   10: 		return p;
   11: 
   12: 	return p + (align - misa);
   13: }
   14: 
   15: 
   16: /*
   17:  * rpack_create() - Allocate & init raw packet structure
   18:  *
   19:  * @buf = buffer
   20:  * @buflen = length of buffer
   21:  * return: NULL error or !=NULL raw packet, should be freed by rpack_destroy()
   22:  */
   23: rpack_t *
   24: rpack_create(void * __restrict buf, size_t buflen)
   25: {
   26: 	rpack_t *rp = NULL;
   27: 
   28: 	rp = e_malloc(sizeof(rpack_t));
   29: 	if (!rp) {
   30: 		LOGERR;
   31: 		return NULL;
   32: 	}
   33: 
   34: 	RPACK_INIT(rp, buf, buflen);
   35: 	return rp;
   36: }
   37: 
   38: /*
   39:  * rpack_destroy() - Release & free raw packet structure
   40:  *
   41:  * @rp = raw packet
   42:  * return: none
   43:  */
   44: void
   45: rpack_destroy(rpack_t ** __restrict rp)
   46: {
   47: 	if (!rp)
   48: 		return;
   49: 
   50: 	if (*rp) {
   51: 		RPACK_FREE(*rp);
   52: 		e_free(*rp);
   53: 		*rp = NULL;
   54: 	}
   55: }
   56: 
   57: /*
   58:  * rpack_align_and_reserve() - Align & reserve space
   59:  *
   60:  * @rp = raw buffer
   61:  * @siz = need size
   62:  * return: NULL error or not enough space, !=NULL next position
   63:  */
   64: uint8_t *
   65: rpack_align_and_reserve(rpack_t * __restrict rp, size_t siz)
   66: {
   67: 	uint8_t *n;
   68: 
   69: 	if (!RPACK_SANITY(rp))
   70: 		return NULL;
   71: 
   72: 	n = rpack_next_boundary(rp->r_buf, rp->r_next, siz);
   73: 	/* too little space for siz */
   74: 	if (n - rp->r_buf + siz > rp->r_len)
   75: 		return NULL;
   76: 
   77: 	return n;
   78: }
   79: 
   80: 
   81: /*
   82:  * rpack_uint8() - Pack/Unpack 8bit value
   83:  *
   84:  * @rp = raw buffer
   85:  * @n = set value if !=NULL
   86:  * return: -1 error or get value
   87:  */
   88: uint8_t
   89: rpack_uint8(rpack_t * __restrict rp, uint8_t * __restrict n)
   90: {
   91: 	uint8_t u;
   92: 
   93: 	if (!RPACK_SANITY(rp))
   94: 		return (uint8_t) -1;
   95: 	/* No space left */
   96: 	if ((size_t) (rp->r_next - rp->r_buf) >= rp->r_len)
   97: 		return (uint8_t) -1;
   98: 
   99: 	u = *rp->r_next;
  100: 	if (n)
  101: 		*rp->r_next = *n;
  102: 
  103: 	rp->r_next++;
  104: 	return u;
  105: }
  106: 
  107: /*
  108:  * rpack_uint16() - Pack/Unpack 16bit value
  109:  *
  110:  * @rp = raw buffer
  111:  * @n = set value if !=NULL
  112:  * return: -1 error or get value
  113:  */
  114: uint16_t
  115: rpack_uint16(rpack_t * __restrict rp, uint16_t * __restrict n)
  116: {
  117: 	uint16_t u;
  118: 	uint8_t *next;
  119: 
  120: 	if (!RPACK_SANITY(rp))
  121: 		return (uint16_t) -1;
  122: 	/* No space left */
  123: 	if (!(next = rpack_align_and_reserve(rp, sizeof(uint16_t))))
  124: 		return (uint16_t) -1;
  125: 
  126: 	u = EXTRACT_LE_16(next);
  127: 	if (n)
  128: 		RPACK_SET_16(next, n);
  129: 
  130: 	rp->r_next = next + sizeof(uint16_t);
  131: 	return u;
  132: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>