jvm/c/bytes.h
2024-12-23 14:41:20 -06:00

81 lines
1.3 KiB
C

#include <stdint.h>
#include "malloc.h"
static inline uint32_t parse_u4(const uint8_t ** buf)
{
uint32_t n =
(*buf)[0] << 24
| (*buf)[1] << 16
| (*buf)[2] << 8
| (*buf)[3] << 0
;
(*buf) += 4;
return n;
}
static inline uint32_t parse_u2(const uint8_t ** buf)
{
uint32_t n =
(*buf)[0] << 8
| (*buf)[1] << 0
;
(*buf) += 2;
return n;
}
static inline uint32_t parse_u1(const uint8_t ** buf)
{
uint32_t n = (*buf)[0];
(*buf) += 1;
return n;
}
static inline int32_t parse_s4(const uint8_t ** buf)
{
int32_t n =
(*buf)[0] << 24
| (*buf)[1] << 16
| (*buf)[2] << 8
| (*buf)[3] << 0
;
(*buf) += 4;
return n;
}
static inline int32_t parse_s2(const uint8_t ** buf)
{
int16_t n =
(*buf)[0] << 8
| (*buf)[1] << 0
;
(*buf) += 2;
return n;
}
static inline int32_t parse_s1(const uint8_t ** buf)
{
int8_t n = (*buf)[0];
(*buf) += 1;
return n;
}
static inline void * parse_bytes(const uint8_t ** buf, int length)
{
uint8_t * dest = malloc_class_arena(length);
for (int i = 0; i < length; i++)
dest[i] = (*buf)[i];
(*buf) += length;
return dest;
}
static inline bool bytes_equal(int length, const uint8_t * a, const char * b)
{
int i;
for (i = 0; i < length; i++) {
if (((char)a[i]) != ((char)b[i]))
return false;
}
return b[i] == 0;
}