CYAML Internals
util.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_UTIL_H
13 #define CYAML_UTIL_H
14 
15 #include "cyaml/cyaml.h"
16 #include "utf8.h"
17 
19 #define CYAML_UNUSED(_x) ((void)(_x))
20 
28 static inline bool cyaml__host_is_little_endian(void)
29 {
30  static const uint16_t test = 1;
31 
32  return ((const uint8_t *) &test)[0] == 1;
33 }
34 
40 static inline bool cyaml__host_is_big_endian(void)
41 {
43 }
44 
46 typedef uint32_t cyaml_bitfield_t;
47 
49 #define CYAML_BITFIELD_BITS (sizeof(cyaml_bitfield_t) * CHAR_BIT)
50 
61 };
62 
69 static inline const char * cyaml__state_to_str(enum cyaml_state_e state)
70 {
71  static const char * const strings[CYAML_STATE__COUNT] = {
72  [CYAML_STATE_START] = "start",
73  [CYAML_STATE_IN_STREAM] = "in stream",
74  [CYAML_STATE_IN_DOC] = "in doc",
75  [CYAML_STATE_IN_MAP_KEY] = "in mapping (key)",
76  [CYAML_STATE_IN_MAP_VALUE] = "in mapping (value)",
77  [CYAML_STATE_IN_SEQUENCE] = "in sequence",
78  };
79  if ((unsigned)state >= CYAML_STATE__COUNT) {
80  return "<invalid>";
81  }
82  return strings[state];
83 }
84 
91 static inline const char * cyaml__type_to_str(cyaml_type_e type)
92 {
93  static const char * const strings[CYAML__TYPE_COUNT] = {
94  [CYAML_INT] = "INT",
95  [CYAML_UINT] = "UINT",
96  [CYAML_BOOL] = "BOOL",
97  [CYAML_ENUM] = "ENUM",
98  [CYAML_FLAGS] = "FLAGS",
99  [CYAML_FLOAT] = "FLOAT",
100  [CYAML_STRING] = "STRING",
101  [CYAML_MAPPING] = "MAPPING",
102  [CYAML_BITFIELD] = "BITFIELD",
103  [CYAML_SEQUENCE] = "SEQUENCE",
104  [CYAML_SEQUENCE_FIXED] = "SEQUENCE_FIXED",
105  [CYAML_IGNORE] = "IGNORE",
106  };
107  if ((unsigned)type >= CYAML__TYPE_COUNT) {
108  return "<invalid>";
109  }
110  return strings[type];
111 }
112 
121 static inline void cyaml__log(
122  const cyaml_config_t *cfg,
123  cyaml_log_t level,
124  const char *fmt, ...)
125 {
126  if (level >= cfg->log_level && cfg->log_fn != NULL) {
127  va_list args;
128  va_start(args, fmt);
129  cfg->log_fn(level, cfg->log_ctx, fmt, args);
130  va_end(args);
131  }
132 }
133 
143 static inline bool cyaml__is_case_sensitive(
144  const cyaml_config_t *config,
145  const cyaml_schema_value_t *schema)
146 {
147  if (schema->flags & CYAML_FLAG_CASE_INSENSITIVE) {
148  return false;
149 
150  } else if (schema->flags & CYAML_FLAG_CASE_SENSITIVE) {
151  return true;
152 
153  } else if (config->flags & CYAML_CFG_CASE_INSENSITIVE) {
154  return false;
155 
156  }
157 
158  return true;
159 }
160 
173 static inline int cyaml__strcmp(
174  const cyaml_config_t *config,
175  const cyaml_schema_value_t *schema,
176  const void * const str1,
177  const void * const str2)
178 {
179  if (cyaml__is_case_sensitive(config, schema)) {
180  return strcmp(str1, str2);
181  }
182 
183  return cyaml_utf8_casecmp(str1, str2);
184 }
185 
193 static inline bool cyaml__flag_check_all(
194  enum cyaml_flag flags,
195  enum cyaml_flag mask)
196 {
197  return ((flags & mask) == mask);
198 }
199 
200 #endif
CYAML library public header.
enum cyaml_log_e cyaml_log_t
@ CYAML_INT
Definition: cyaml.h:54
@ CYAML_UINT
Definition: cyaml.h:55
@ CYAML__TYPE_COUNT
Definition: cyaml.h:124
@ CYAML_SEQUENCE_FIXED
Definition: cyaml.h:113
@ CYAML_IGNORE
Definition: cyaml.h:119
@ CYAML_FLOAT
Definition: cyaml.h:73
@ CYAML_MAPPING
Definition: cyaml.h:79
@ CYAML_BITFIELD
Definition: cyaml.h:89
@ CYAML_ENUM
Definition: cyaml.h:62
@ CYAML_BOOL
Definition: cyaml.h:56
@ CYAML_SEQUENCE
Definition: cyaml.h:101
@ CYAML_STRING
Definition: cyaml.h:74
@ CYAML_FLAGS
Definition: cyaml.h:72
cyaml_flag
Definition: cyaml.h:132
@ CYAML_FLAG_CASE_SENSITIVE
Definition: cyaml.h:243
@ CYAML_FLAG_CASE_INSENSITIVE
Definition: cyaml.h:261
@ CYAML_CFG_CASE_INSENSITIVE
Definition: cyaml.h:554
enum cyaml_type cyaml_type_e
Definition: cyaml.h:1419
cyaml_log_fn_t log_fn
Definition: cyaml.h:1434
cyaml_cfg_flags_t flags
Definition: cyaml.h:1474
void * log_ctx
Definition: cyaml.h:1444
cyaml_log_t log_level
Definition: cyaml.h:1472
Definition: cyaml.h:362
enum cyaml_flag flags
Definition: cyaml.h:368
int cyaml_utf8_casecmp(const void *const str1, const void *const str2)
Definition: utf8.c:188
CYAML functions for handling utf8 text.
static bool cyaml__host_is_big_endian(void)
Definition: util.h:40
static void cyaml__log(const cyaml_config_t *cfg, cyaml_log_t level, const char *fmt,...)
Definition: util.h:121
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:173
static bool cyaml__is_case_sensitive(const cyaml_config_t *config, const cyaml_schema_value_t *schema)
Definition: util.h:143
static bool cyaml__flag_check_all(enum cyaml_flag flags, enum cyaml_flag mask)
Definition: util.h:193
static const char * cyaml__type_to_str(cyaml_type_e type)
Definition: util.h:91
static bool cyaml__host_is_little_endian(void)
Definition: util.h:28
cyaml_state_e
Definition: util.h:52
@ CYAML_STATE__COUNT
Definition: util.h:59
@ CYAML_STATE_IN_MAP_VALUE
Definition: util.h:57
@ CYAML_STATE_IN_SEQUENCE
Definition: util.h:58
@ CYAML_STATE_IN_STREAM
Definition: util.h:54
@ CYAML_STATE_IN_DOC
Definition: util.h:55
@ CYAML_STATE_IN_MAP_KEY
Definition: util.h:56
@ CYAML_STATE_START
Definition: util.h:53
static const char * cyaml__state_to_str(enum cyaml_state_e state)
Definition: util.h:69
uint32_t cyaml_bitfield_t
Definition: util.h:46