Return to pack.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / libelwix / src |
1.1.2.1 misho 1: #include "global.h"
2:
3:
1.1.2.2 misho 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;
1.1.2.1 misho 8:
1.1.2.2 misho 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: {
1.1.2.3 misho 91: uint8_t u;
92:
1.1.2.2 misho 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:
1.1.2.3 misho 99: u = *rp->r_next;
1.1.2.2 misho 100: if (n)
101: *rp->r_next = *n;
1.1.2.3 misho 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)
1.1.2.4 ! misho 128: RPACK_SET_16(next, n);
1.1.2.3 misho 129:
130: rp->r_next = next + sizeof(uint16_t);
131: return u;
1.1.2.2 misho 132: }