mirror of
https://gitea.tendokyu.moe/TeamTofuShop/capnhook.git
synced 2026-09-30 19:08:00 +03:00
hook/iobuf.c: Add readers and writers for 64-bit uints
This commit is contained in:
@@ -124,6 +124,31 @@ HRESULT iobuf_read_be32(struct const_iobuf *src, uint32_t *out)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT iobuf_read_be64(struct const_iobuf *src, uint64_t *out)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
assert(src != NULL);
|
||||
assert(out != NULL);
|
||||
|
||||
if (src->pos + sizeof(uint64_t) > src->nbytes) {
|
||||
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||
}
|
||||
|
||||
value = ((uint64_t) src->bytes[src->pos++]) << 56;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 48;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 40;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 32;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 24;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 16;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 8;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]);
|
||||
|
||||
*out = value;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT iobuf_read_le16(struct const_iobuf *src, uint16_t *out)
|
||||
{
|
||||
uint16_t value;
|
||||
@@ -164,6 +189,31 @@ HRESULT iobuf_read_le32(struct const_iobuf *src, uint32_t *out)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT iobuf_read_le64(struct const_iobuf *src, uint64_t *out)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
assert(src != NULL);
|
||||
assert(out != NULL);
|
||||
|
||||
if (src->pos + sizeof(uint64_t) > src->nbytes) {
|
||||
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||
}
|
||||
|
||||
value = ((uint64_t) src->bytes[src->pos++]);
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 8;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 16;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 24;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 32;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 40;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 48;
|
||||
value |= ((uint64_t) src->bytes[src->pos++]) << 56;
|
||||
|
||||
*out = value;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT iobuf_write(struct iobuf *dest, const void *bytes, size_t nbytes)
|
||||
{
|
||||
assert(dest != NULL);
|
||||
@@ -222,6 +272,26 @@ HRESULT iobuf_write_be32(struct iobuf *dest, uint32_t value)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT iobuf_write_be64(struct iobuf *dest, uint64_t value)
|
||||
{
|
||||
assert(dest != NULL);
|
||||
|
||||
if (dest->pos + sizeof(uint64_t) > dest->nbytes) {
|
||||
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||
}
|
||||
|
||||
dest->bytes[dest->pos++] = value >> 56;
|
||||
dest->bytes[dest->pos++] = value >> 48;
|
||||
dest->bytes[dest->pos++] = value >> 40;
|
||||
dest->bytes[dest->pos++] = value >> 32;
|
||||
dest->bytes[dest->pos++] = value >> 24;
|
||||
dest->bytes[dest->pos++] = value >> 16;
|
||||
dest->bytes[dest->pos++] = value >> 8;
|
||||
dest->bytes[dest->pos++] = value;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT iobuf_write_le16(struct iobuf *dest, uint16_t value)
|
||||
{
|
||||
assert(dest != NULL);
|
||||
@@ -251,3 +321,23 @@ HRESULT iobuf_write_le32(struct iobuf *dest, uint32_t value)
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT iobuf_write_le64(struct iobuf *dest, uint64_t value)
|
||||
{
|
||||
assert(dest != NULL);
|
||||
|
||||
if (dest->pos + sizeof(uint64_t) > dest->nbytes) {
|
||||
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
||||
}
|
||||
|
||||
dest->bytes[dest->pos++] = value;
|
||||
dest->bytes[dest->pos++] = value >> 8;
|
||||
dest->bytes[dest->pos++] = value >> 16;
|
||||
dest->bytes[dest->pos++] = value >> 24;
|
||||
dest->bytes[dest->pos++] = value >> 32;
|
||||
dest->bytes[dest->pos++] = value >> 40;
|
||||
dest->bytes[dest->pos++] = value >> 48;
|
||||
dest->bytes[dest->pos++] = value >> 56;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -25,12 +25,16 @@ HRESULT iobuf_read(struct const_iobuf *src, void *bytes, size_t nbytes);
|
||||
HRESULT iobuf_read_8(struct const_iobuf *src, uint8_t *value);
|
||||
HRESULT iobuf_read_be16(struct const_iobuf *src, uint16_t *value);
|
||||
HRESULT iobuf_read_be32(struct const_iobuf *src, uint32_t *value);
|
||||
HRESULT iobuf_read_be64(struct const_iobuf *src, uint64_t *value);
|
||||
HRESULT iobuf_read_le16(struct const_iobuf *src, uint16_t *value);
|
||||
HRESULT iobuf_read_le32(struct const_iobuf *src, uint32_t *value);
|
||||
HRESULT iobuf_read_le64(struct const_iobuf *src, uint64_t *value);
|
||||
|
||||
HRESULT iobuf_write(struct iobuf *dest, const void *bytes, size_t nbytes);
|
||||
HRESULT iobuf_write_8(struct iobuf *dest, uint8_t value);
|
||||
HRESULT iobuf_write_be16(struct iobuf *dest, uint16_t value);
|
||||
HRESULT iobuf_write_be32(struct iobuf *dest, uint32_t value);
|
||||
HRESULT iobuf_write_be64(struct iobuf *dest, uint64_t value);
|
||||
HRESULT iobuf_write_le16(struct iobuf *dest, uint16_t value);
|
||||
HRESULT iobuf_write_le32(struct iobuf *dest, uint32_t value);
|
||||
HRESULT iobuf_write_le64(struct iobuf *dest, uint64_t value);
|
||||
|
||||
Reference in New Issue
Block a user