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 cyaml_static_assert(sizeof(char *) > 0);
62 cyaml_static_assert(sizeof(char *) <= sizeof(uint64_t));
63
64 CYAML_UNUSED(cyaml_data_write((uint64_t)ptr, sizeof(ptr), data_target));
65
66 return;
67}
68
79static inline uint64_t cyaml_data_read(
80 uint64_t entry_size,
81 const uint8_t *data,
82 cyaml_err_t *error_out)
83{
84 uint64_t ret = 0;
85 uint8_t *ret_bytes = (uint8_t *)&ret;
86
87 if (entry_size == 0 || entry_size > sizeof(ret)) {
88 *error_out = CYAML_ERR_INVALID_DATA_SIZE;
89 return ret;
90 }
91
93 ret_bytes += sizeof(ret) - entry_size;
94 }
95
96 memcpy(ret_bytes, data, entry_size);
97
98 *error_out = CYAML_OK;
99 return ret;
100}
101
111static inline uint8_t * cyaml_data_read_pointer(
112 const uint8_t *data)
113{
114 cyaml_err_t err;
115
116 /* Refuse to build on platforms where sizeof pointer would
117 * lead to \ref CYAML_ERR_INVALID_DATA_SIZE. */
118 cyaml_static_assert(sizeof(char *) > 0);
119 cyaml_static_assert(sizeof(char *) <= sizeof(uint64_t));
120
121 return (void *)cyaml_data_read(sizeof(char *), data, &err);
122}
123
124#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:79
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:111
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:48
#define cyaml_static_assert(e)
Definition util.h:19