#ifndef K5_INPUT_H
#define K5_INPUT_H
#include "k5-platform.h"
struct k5input {
const unsigned char *ptr;
size_t len;
int32_t status;
};
static inline void
k5_input_init(struct k5input *in, const void *ptr, size_t len)
{
in->ptr = ptr;
in->len = len;
in->status = 0;
}
static inline void
k5_input_set_status(struct k5input *in, int32_t status)
{
if (!in->status)
in->status = status;
}
static inline const unsigned char *
k5_input_get_bytes(struct k5input *in, size_t len)
{
if (in->len < len)
k5_input_set_status(in, EINVAL);
if (in->status)
return NULL;
in->len -= len;
in->ptr += len;
return in->ptr - len;
}
static inline unsigned char
k5_input_get_byte(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 1);
return (ptr == NULL) ? '\0' : *ptr;
}
static inline uint16_t
k5_input_get_uint16_be(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 2);
return (ptr == NULL) ? 0 : load_16_be(ptr);
}
static inline uint16_t
k5_input_get_uint16_le(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 2);
return (ptr == NULL) ? 0 : load_16_le(ptr);
}
static inline uint16_t
k5_input_get_uint16_n(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 2);
return (ptr == NULL) ? 0 : load_16_n(ptr);
}
static inline uint32_t
k5_input_get_uint32_be(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 4);
return (ptr == NULL) ? 0 : load_32_be(ptr);
}
static inline uint32_t
k5_input_get_uint32_le(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 4);
return (ptr == NULL) ? 0 : load_32_le(ptr);
}
static inline uint32_t
k5_input_get_uint32_n(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 4);
return (ptr == NULL) ? 0 : load_32_n(ptr);
}
static inline uint64_t
k5_input_get_uint64_be(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 8);
return (ptr == NULL) ? 0 : load_64_be(ptr);
}
static inline uint64_t
k5_input_get_uint64_le(struct k5input *in)
{
const unsigned char *ptr = k5_input_get_bytes(in, 8);
return (ptr == NULL) ? 0 : load_64_le(ptr);
}
#endif