CYAML Internals
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 
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  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 
80 static 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 
112 static 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:587
@ CYAML_OK
Definition: cyaml.h:576
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