CYAML Internals
data.h
Go to the documentation of this file.
1 /*
2  * SPDX-License-Identifier: ISC
3  *
4  * Copyright (C) 2017-2020 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 
55 static 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 
79 static 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 
111 static 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_UNUSED
#define CYAML_UNUSED(_x)
Definition: mem.c:19
CYAML_OK
@ CYAML_OK
Definition: cyaml.h:516
cyaml_data_write
static cyaml_err_t cyaml_data_write(uint64_t value, uint64_t entry_size, uint8_t *data_tgt)
Definition: data.h:26
cyaml.h
CYAML library public header.
cyaml_data_write_pointer
static void cyaml_data_write_pointer(const void *ptr, uint8_t *data_target)
Definition: data.h:55
cyaml_data_read
static uint64_t cyaml_data_read(uint64_t entry_size, const uint8_t *data, cyaml_err_t *error_out)
Definition: data.h:79
CYAML_ERR_INVALID_DATA_SIZE
@ CYAML_ERR_INVALID_DATA_SIZE
Definition: cyaml.h:527
cyaml_static_assert
#define cyaml_static_assert(e)
Definition: util.h:19
cyaml__host_is_big_endian
static bool cyaml__host_is_big_endian(void)
Definition: util.h:48
cyaml_data_read_pointer
static uint8_t * cyaml_data_read_pointer(const uint8_t *data)
Definition: data.h:111
util.h
CYAML common utility functions.
cyaml_err_t
enum cyaml_err cyaml_err_t