2 #include <aura/private.h>
13 int aura_fmt_len(
struct aura_node *node,
const char *fmt)
43 BUG(node,
"Internal serilizer bug processing: %s", fmt);
45 while (*fmt && (*fmt++ !=
'.'));
48 BUG(node,
"Serializer failed at token: %s", fmt);
67 char* aura_fmt_pretty_print(
const char* fmt,
int *valid,
int *num_args)
73 asprintf(&str,
"(null)");
76 char *str = malloc(strlen(fmt) * 10 + 64);
89 shift = sprintf(tmp,
" uint8_t");
92 shift = sprintf(tmp,
" uint16_t");
95 shift = sprintf(tmp,
" uint32_t");
98 shift = sprintf(tmp,
" uint64_t");
102 shift = sprintf(tmp,
" int8_t");
105 shift = sprintf(tmp,
" int16_t");
108 shift = sprintf(tmp,
" int32_t");
111 shift = sprintf(tmp,
" int64_t");
114 shift = sprintf(tmp,
" buf");
119 BUG(NULL,
"Internal serilizer bug processing: %s", fmt);
120 shift = sprintf(tmp,
" bin(%d)", len);
121 while (*fmt && (*fmt++ !=
'.'));
124 shift = sprintf(tmp,
" (null)");
128 shift = sprintf(tmp,
" ?[%c]?", *fmt);
141 #define AURA_SERDES_PARANOID
143 #ifdef AURA_SERDES_PARANOID
144 #define CHECK_BOUNDS(buf,src) if (buf->pos + sizeof(src) > buf->size) \
145 BUG(NULL, "SERDES: Out of buffer bounds");
147 #define CHECK_BOUNDS()
151 #define CHECK_AND_PUT(buf, src) \
152 CHECK_BOUNDS(buf,src); \
153 memcpy(&buf->data[buf->pos], &src, sizeof(src)); \
154 buf->pos+=sizeof(src); \
157 #define va_put_U8(buf, ap, swap) \
159 uint8_t v = (uint8_t) va_arg(ap, unsigned int); \
160 CHECK_AND_PUT(buf, v); \
163 #define va_put_S8(buf, ap, swap) \
165 int8_t v = (int8_t) va_arg(ap, int); \
166 CHECK_AND_PUT(buf, v); \
169 #define va_put_U16(buf, ap, swap) \
171 uint16_t v = (uint16_t) va_arg(ap, unsigned int); \
174 CHECK_AND_PUT(buf, v); \
177 #define va_put_S16(buf, ap, swap) \
179 int16_t v = (int16_t) va_arg(ap, int); \
182 CHECK_AND_PUT(buf, v); \
186 #define va_put_U32(buf, ap, swap) \
188 uint32_t v = (uint32_t) va_arg(ap, uint32_t); \
191 CHECK_AND_PUT(buf, v); \
194 #define va_put_S32(buf, ap, swap) \
196 int32_t v = (int32_t) va_arg(ap, int32_t); \
199 CHECK_AND_PUT(buf, v); \
202 #define va_put_U64(buf, ap, swap) \
204 uint64_t v = (uint64_t) va_arg(ap, uint64_t); \
207 CHECK_AND_PUT(buf, v); \
210 #define va_put_S64(buf, ap, swap) \
212 int64_t v = (int64_t) va_arg(ap, uint64_t); \
215 CHECK_AND_PUT(buf, v); \
218 #define va_put_BIN(buf, len, ap) \
220 void *ptr = va_arg(ap, void *); \
221 memcpy(&buf->data[buf->pos], ptr, len); \
225 #define va_put_BUF(buf, ap, swap) \
227 struct aura_buffer *out = va_arg(ap, void *); \
228 struct aura_node *_node = buf->owner; \
229 if (!_node->tr->buffer_put) \
230 BUG(_node, "This node doesn't support aura_buffer as argument"); \
231 _node->tr->buffer_put(buf, out); \
244 struct aura_buffer *aura_serialize(
struct aura_node *node,
const char *fmt,
int size, va_list ap)
252 va_put_ ## n(buf, ap, node->need_endian_swap); \
270 BUG(NULL,
"Internal serilizer bug processing: %s", fmt);
271 va_put_BIN(buf, len, ap);
272 while (*fmt && (*fmt++ !=
'.'));
struct aura_buffer * aura_buffer_request(struct aura_node *nd, int size)