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 
30 typedef uint32_t cyaml_bitfield_t;
31 
33 #define CYAML_BITFIELD_BITS (sizeof(cyaml_bitfield_t) * CHAR_BIT)
34 
45 };
46 
53 static inline const char * cyaml__state_to_str(enum cyaml_state_e state)
54 {
55  static const char * const strings[CYAML_STATE__COUNT] = {
56  [CYAML_STATE_START] = "start",
57  [CYAML_STATE_IN_STREAM] = "in stream",
58  [CYAML_STATE_IN_DOC] = "in doc",
59  [CYAML_STATE_IN_MAP_KEY] = "in mapping (key)",
60  [CYAML_STATE_IN_MAP_VALUE] = "in mapping (value)",
61  [CYAML_STATE_IN_SEQUENCE] = "in sequence",
62  };
63  if ((unsigned)state >= CYAML_STATE__COUNT) {
64  return "<invalid>";
65  }
66  return strings[state];
67 }
68 
75 static inline const char * cyaml__type_to_str(cyaml_type_e type)
76 {
77  static const char * const strings[CYAML__TYPE_COUNT] = {
78  [CYAML_INT] = "INT",
79  [CYAML_UINT] = "UINT",
80  [CYAML_BOOL] = "BOOL",
81  [CYAML_ENUM] = "ENUM",
82  [CYAML_FLAGS] = "FLAGS",
83  [CYAML_FLOAT] = "FLOAT",
84  [CYAML_STRING] = "STRING",
85  [CYAML_MAPPING] = "MAPPING",
86  [CYAML_BITFIELD] = "BITFIELD",
87  [CYAML_SEQUENCE] = "SEQUENCE",
88  [CYAML_SEQUENCE_FIXED] = "SEQUENCE_FIXED",
89  [CYAML_IGNORE] = "IGNORE",
90  };
91  if ((unsigned)type >= CYAML__TYPE_COUNT) {
92  return "<invalid>";
93  }
94  return strings[type];
95 }
96 
105 static inline void cyaml__log(
106  const cyaml_config_t *cfg,
107  cyaml_log_t level,
108  char *fmt, ...)
109 {
110  if (level >= cfg->log_level && cfg->log_fn != NULL) {
111  va_list args;
112  va_start(args, fmt);
113  cfg->log_fn(level, cfg->log_ctx, fmt, args);
114  va_end(args);
115  }
116 }
117 
127 static inline bool cyaml__is_case_sensitive(
128  const cyaml_config_t *config,
129  const cyaml_schema_value_t *schema)
130 {
131  if (schema->flags & CYAML_FLAG_CASE_INSENSITIVE) {
132  return false;
133 
134  } else if (schema->flags & CYAML_FLAG_CASE_SENSITIVE) {
135  return true;
136 
137  } else if (config->flags & CYAML_CFG_CASE_INSENSITIVE) {
138  return false;
139 
140  }
141 
142  return true;
143 }
144 
157 static inline int cyaml__strcmp(
158  const cyaml_config_t *config,
159  const cyaml_schema_value_t *schema,
160  const void * const str1,
161  const void * const str2)
162 {
163  if (cyaml__is_case_sensitive(config, schema)) {
164  return strcmp(str1, str2);
165  }
166 
167  return cyaml_utf8_casecmp(str1, str2);
168 }
169 
177 static inline bool cyaml__flag_check_all(
178  enum cyaml_flag flags,
179  enum cyaml_flag mask)
180 {
181  return ((flags & mask) == mask);
182 }
183 
184 #endif
cyaml_bitfield_t
uint32_t cyaml_bitfield_t
Definition: util.h:30
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:40
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:43
cyaml.h
CYAML library public header.
cyaml__type_to_str
static const char * cyaml__type_to_str(cyaml_type_e type)
Definition: util.h:75
CYAML_STATE_IN_STREAM
@ CYAML_STATE_IN_STREAM
Definition: util.h:38
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:53
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:127
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:177
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:157
cyaml__log
static void cyaml__log(const cyaml_config_t *cfg, cyaml_log_t level, char *fmt,...)
Definition: util.h:105
cyaml_config::log_fn
cyaml_log_fn_t log_fn
Definition: cyaml.h:1374
cyaml_state_e
cyaml_state_e
Definition: util.h:36
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:42
CYAML_STATE_IN_DOC
@ CYAML_STATE_IN_DOC
Definition: util.h:39
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:41
CYAML_STATE_START
@ CYAML_STATE_START
Definition: util.h:37
CYAML_INT
@ CYAML_INT
Definition: cyaml.h:54
CYAML_SEQUENCE
@ CYAML_SEQUENCE
Definition: cyaml.h:101