CYAML Internals
util.h
Go to the documentation of this file.
1 /*
2  * SPDX-License-Identifier: ISC
3  *
4  * Copyright (C) 2017-2019 Michael Drake <tlsa@netsurf-browser.org>
5  */
6 
12 #ifndef CYAML_UTIL_H
13 #define CYAML_UTIL_H
14 
15 #include "cyaml/cyaml.h"
16 #include "utf8.h"
17 
19 #define cyaml_static_assert(e) \
20 { \
21  enum { \
22  cyaml_static_assert_check = 1 / (!!(e)) \
23  }; \
24 }
25 
27 #define CYAML_UNUSED(_x) ((void)(_x))
28 
36 static inline bool cyaml__host_is_little_endian(void)
37 {
38  static const uint16_t test = 1;
39 
40  return ((uint8_t *) &test)[0] == 1;
41 }
42 
48 static inline bool cyaml__host_is_big_endian(void)
49 {
51 }
52 
54 typedef uint32_t cyaml_bitfield_t;
55 
57 #define CYAML_BITFIELD_BITS (sizeof(cyaml_bitfield_t) * CHAR_BIT)
58 
69 };
70 
77 static inline const char * cyaml__state_to_str(enum cyaml_state_e state)
78 {
79  static const char * const strings[CYAML_STATE__COUNT] = {
80  [CYAML_STATE_START] = "start",
81  [CYAML_STATE_IN_STREAM] = "in stream",
82  [CYAML_STATE_IN_DOC] = "in doc",
83  [CYAML_STATE_IN_MAP_KEY] = "in mapping (key)",
84  [CYAML_STATE_IN_MAP_VALUE] = "in mapping (value)",
85  [CYAML_STATE_IN_SEQUENCE] = "in sequence",
86  };
87  if ((unsigned)state >= CYAML_STATE__COUNT) {
88  return "<invalid>";
89  }
90  return strings[state];
91 }
92 
99 static inline const char * cyaml__type_to_str(cyaml_type_e type)
100 {
101  static const char * const strings[CYAML__TYPE_COUNT] = {
102  [CYAML_INT] = "INT",
103  [CYAML_UINT] = "UINT",
104  [CYAML_BOOL] = "BOOL",
105  [CYAML_ENUM] = "ENUM",
106  [CYAML_FLAGS] = "FLAGS",
107  [CYAML_FLOAT] = "FLOAT",
108  [CYAML_STRING] = "STRING",
109  [CYAML_MAPPING] = "MAPPING",
110  [CYAML_BITFIELD] = "BITFIELD",
111  [CYAML_SEQUENCE] = "SEQUENCE",
112  [CYAML_SEQUENCE_FIXED] = "SEQUENCE_FIXED",
113  [CYAML_IGNORE] = "IGNORE",
114  };
115  if ((unsigned)type >= CYAML__TYPE_COUNT) {
116  return "<invalid>";
117  }
118  return strings[type];
119 }
120 
129 static inline void cyaml__log(
130  const cyaml_config_t *cfg,
131  cyaml_log_t level,
132  char *fmt, ...)
133 {
134  if (level >= cfg->log_level && cfg->log_fn != NULL) {
135  va_list args;
136  va_start(args, fmt);
137  cfg->log_fn(level, cfg->log_ctx, fmt, args);
138  va_end(args);
139  }
140 }
141 
151 static inline bool cyaml__is_case_sensitive(
152  const cyaml_config_t *config,
153  const cyaml_schema_value_t *schema)
154 {
155  if (schema->flags & CYAML_FLAG_CASE_INSENSITIVE) {
156  return false;
157 
158  } else if (schema->flags & CYAML_FLAG_CASE_SENSITIVE) {
159  return true;
160 
161  } else if (config->flags & CYAML_CFG_CASE_INSENSITIVE) {
162  return false;
163 
164  }
165 
166  return true;
167 }
168 
181 static inline int cyaml__strcmp(
182  const cyaml_config_t *config,
183  const cyaml_schema_value_t *schema,
184  const void * const str1,
185  const void * const str2)
186 {
187  if (cyaml__is_case_sensitive(config, schema)) {
188  return strcmp(str1, str2);
189  }
190 
191  return cyaml_utf8_casecmp(str1, str2);
192 }
193 
201 static inline bool cyaml__flag_check_all(
202  enum cyaml_flag flags,
203  enum cyaml_flag mask)
204 {
205  return ((flags & mask) == mask);
206 }
207 
208 #endif
cyaml_bitfield_t
uint32_t cyaml_bitfield_t
Definition: util.h:54
cyaml_schema_value::flags
enum cyaml_flag flags
Definition: cyaml.h:308
CYAML_BOOL
@ CYAML_BOOL
Definition: cyaml.h:56
CYAML_FLAGS
@ CYAML_FLAGS
Definition: cyaml.h:72
cyaml_config
Definition: cyaml.h:1359
CYAML_STATE_IN_MAP_KEY
@ CYAML_STATE_IN_MAP_KEY
Definition: util.h:64
CYAML_IGNORE
@ CYAML_IGNORE
Definition: cyaml.h:119
CYAML_STRING
@ CYAML_STRING
Definition: cyaml.h:74
CYAML_STATE__COUNT
@ CYAML_STATE__COUNT
Definition: util.h:67
cyaml__host_is_little_endian
static bool cyaml__host_is_little_endian(void)
Definition: util.h:36
cyaml.h
CYAML library public header.
cyaml__type_to_str
static const char * cyaml__type_to_str(cyaml_type_e type)
Definition: util.h:99
CYAML_STATE_IN_STREAM
@ CYAML_STATE_IN_STREAM
Definition: util.h:62
cyaml_utf8_casecmp
int cyaml_utf8_casecmp(const void *const str1, const void *const str2)
Definition: utf8.c:188
CYAML_UINT
@ CYAML_UINT
Definition: cyaml.h:55
cyaml__state_to_str
static const char * cyaml__state_to_str(enum cyaml_state_e state)
Definition: util.h:77
CYAML_FLOAT
@ CYAML_FLOAT
Definition: cyaml.h:73
cyaml__is_case_sensitive
static bool cyaml__is_case_sensitive(const cyaml_config_t *config, const cyaml_schema_value_t *schema)
Definition: util.h:151
cyaml_config::log_ctx
void * log_ctx
Definition: cyaml.h:1384
cyaml_type_e
enum cyaml_type cyaml_type_e
cyaml__flag_check_all
static bool cyaml__flag_check_all(enum cyaml_flag flags, enum cyaml_flag mask)
Definition: util.h:201
cyaml__host_is_big_endian
static bool cyaml__host_is_big_endian(void)
Definition: util.h:48
CYAML_SEQUENCE_FIXED
@ CYAML_SEQUENCE_FIXED
Definition: cyaml.h:113
CYAML_MAPPING
@ CYAML_MAPPING
Definition: cyaml.h:79
cyaml__strcmp
static int cyaml__strcmp(const cyaml_config_t *config, const cyaml_schema_value_t *schema, const void *const str1, const void *const str2)
Definition: util.h:181
cyaml__log
static void cyaml__log(const cyaml_config_t *cfg, cyaml_log_t level, char *fmt,...)
Definition: util.h:129
cyaml_config::log_fn
cyaml_log_fn_t log_fn
Definition: cyaml.h:1374
cyaml_state_e
cyaml_state_e
Definition: util.h:60
utf8.h
CYAML functions for handling utf8 text.
cyaml_config::flags
cyaml_cfg_flags_t flags
Definition: cyaml.h:1414
cyaml_config::log_level
cyaml_log_t log_level
Definition: cyaml.h:1412
cyaml_log_t
enum cyaml_log_e cyaml_log_t
CYAML_STATE_IN_SEQUENCE
@ CYAML_STATE_IN_SEQUENCE
Definition: util.h:66
CYAML_STATE_IN_DOC
@ CYAML_STATE_IN_DOC
Definition: util.h:63
CYAML_FLAG_CASE_INSENSITIVE
@ CYAML_FLAG_CASE_INSENSITIVE
Definition: cyaml.h:258
CYAML_ENUM
@ CYAML_ENUM
Definition: cyaml.h:62
CYAML_CFG_CASE_INSENSITIVE
@ CYAML_CFG_CASE_INSENSITIVE
Definition: cyaml.h:494
cyaml_schema_value
Definition: cyaml.h:302
cyaml_flag
cyaml_flag
Definition: cyaml.h:132
CYAML_BITFIELD
@ CYAML_BITFIELD
Definition: cyaml.h:89
CYAML__TYPE_COUNT
@ CYAML__TYPE_COUNT
Definition: cyaml.h:124
CYAML_FLAG_CASE_SENSITIVE
@ CYAML_FLAG_CASE_SENSITIVE
Definition: cyaml.h:240
CYAML_STATE_IN_MAP_VALUE
@ CYAML_STATE_IN_MAP_VALUE
Definition: util.h:65
CYAML_STATE_START
@ CYAML_STATE_START
Definition: util.h:61
CYAML_INT
@ CYAML_INT
Definition: cyaml.h:54
CYAML_SEQUENCE
@ CYAML_SEQUENCE
Definition: cyaml.h:101