CYAML Internals
Loading...
Searching...
No Matches
data.h
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: ISC
3 *
4 * Copyright (C) 2017-2021 Michael Drake <tlsa@netsurf-browser.org>
5 */
6
12#ifndef CYAML_DATA_H
13#define CYAML_DATA_H
14
15#include "cyaml/cyaml.h"
16#include "util.h"
17
27 uint64_t value,
28 uint64_t entry_size,
29 uint8_t *data_tgt)
30{
31 const uint8_t *value_bytes = (uint8_t *)&value;
32
33 if (entry_size == 0 || entry_size > sizeof(value)) {
35 }
36
38 value_bytes += sizeof(value) - entry_size;
39 }
40
41 memcpy(data_tgt, value_bytes, entry_size);
42
43 return CYAML_OK;
44}
45
55static inline void cyaml_data_write_pointer(
56 const void *ptr,
57 uint8_t *data_target)
58{
59 /* Refuse to build on platforms where sizeof pointer would
60 * lead to \ref CYAML_ERR_INVALID_DATA_SIZE. */
61 static_assert(sizeof(char *) > 0, "Incompatible pointer size.");
62 static_assert(sizeof(char *) <= sizeof(uint64_t),
63 "Incompatible pointer size.");
64
65 CYAML_UNUSED(cyaml_data_write((uint64_t)ptr, sizeof(ptr), data_target));
66
67 return;
68}
69
80static inline uint64_t cyaml_data_read(
81 uint64_t entry_size,
82 const uint8_t *data,
83 cyaml_err_t *error_out)
84{
85 uint64_t ret = 0;
86 uint8_t *ret_bytes = (uint8_t *)&ret;
87
88 if (entry_size == 0 || entry_size > sizeof(ret)) {
89 *error_out = CYAML_ERR_INVALID_DATA_SIZE;
90 return ret;
91 }
92
94 ret_bytes += sizeof(ret) - entry_size;
95 }
96
97 memcpy(ret_bytes, data, entry_size);
98
99 *error_out = CYAML_OK;
100 return ret;
101}
102
112static inline uint8_t * cyaml_data_read_pointer(
113 const uint8_t *data)
114{
115 cyaml_err_t err;
116
117 /* Refuse to build on platforms where sizeof pointer would
118 * lead to \ref CYAML_ERR_INVALID_DATA_SIZE. */
119 static_assert(sizeof(char *) > 0, "Incompatible pointer size.");
120 static_assert(sizeof(char *) <= sizeof(uint64_t),
121 "Incompatible pointer size.");
122
123 return (void *)cyaml_data_read(sizeof(char *), data, &err);
124}
125
126#endif
CYAML library public header.
enum cyaml_err cyaml_err_t
@ CYAML_ERR_INVALID_DATA_SIZE
Definition cyaml.h:597
@ CYAML_OK
Definition cyaml.h:586
static uint64_t cyaml_data_read(uint64_t entry_size, const uint8_t *data, cyaml_err_t *error_out)
Definition data.h:80
static void cyaml_data_write_pointer(const void *ptr, uint8_t *data_target)
Definition data.h:55
static uint8_t * cyaml_data_read_pointer(const uint8_t *data)
Definition data.h:112
static cyaml_err_t cyaml_data_write(uint64_t value, uint64_t entry_size, uint8_t *data_tgt)
Definition data.h:26
#define CYAML_UNUSED(_x)
Definition mem.c:19
CYAML common utility functions.
static bool cyaml__host_is_big_endian(void)
Definition util.h:40