#include "pp/payload_parser.h" #define pp_check_capacity(pp, needed) \ if ((pp)->current + (needed) > (pp)->end) { \ if ((pp)->empty_handler == NULL || !(pp)->empty_handler((pp), (needed))) { \ (pp)->ok = 0; \ } \ } uint8_t pp_u8(PayloadParser *pp) { pp_check_capacity(pp, 1); if (!pp->ok) { return 0; } return *pp->current++; } uint16_t pp_u16(PayloadParser *pp) { pp_check_capacity(pp, 2); if (!pp->ok) { return 0; } uint16_t x = 0; if (pp->bigendian) { x |= *pp->current++ << 8; x |= *pp->current++; } else { x |= *pp->current++; x |= *pp->current++ << 8; } return x; } uint32_t pp_u32(PayloadParser *pp) { pp_check_capacity(pp, 4); if (!pp->ok) { return 0; } uint32_t x = 0; if (pp->bigendian) { x |= (uint32_t) (*pp->current++ << 24); x |= (uint32_t) (*pp->current++ << 16); x |= (uint32_t) (*pp->current++ << 8); x |= *pp->current++; } else { x |= *pp->current++; x |= (uint32_t) (*pp->current++ << 8); x |= (uint32_t) (*pp->current++ << 16); x |= (uint32_t) (*pp->current++ << 24); } return x; } const uint8_t *pp_tail(PayloadParser *pp, uint32_t *length) { int32_t len = (int) (pp->end - pp->current); if (!pp->ok || len <= 0) { if (length != NULL) { *length = 0; } return NULL; } if (length != NULL) { *length = (uint32_t) len; } return pp->current; } /** Read a zstring */ uint32_t pp_string(PayloadParser *pp, char *buffer, uint32_t maxlen) { pp_check_capacity(pp, 1); uint32_t len = 0; while (len < maxlen - 1 && pp->current != pp->end) { char c = *buffer++ = (char) *pp->current++; if (c == 0) { break; } len++; } *buffer = 0; return len; } /** Read a buffer */ uint32_t pp_buf(PayloadParser *pp, uint8_t *buffer, uint32_t maxlen) { uint32_t len = 0; while (len < maxlen && pp->current != pp->end) { *buffer++ = *pp->current++; len++; } return len; }