CYAML Internals
Loading...
Searching...
No Matches
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_static_assert(e) \
20{ \
21 enum { \
22 cyaml_static_assert_check = 1 / (!!(e)) \
23 }; \
24}
25
27#define CYAML_UNUSED(_x) ((void)(_x))
28
36static inline bool cyaml__host_is_little_endian(void)
37{
38 const uint16_t test = 1;
39
40 return ((const uint8_t *) &test)[0];
41}
42
48static inline bool cyaml__host_is_big_endian(void)
49{
51}
52
54typedef uint32_t cyaml_bitfield_t;
55
57#define CYAML_BITFIELD_BITS (sizeof(cyaml_bitfield_t) * CHAR_BIT)
58
70
77static 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
99static 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
129static inline void cyaml__log(
130 const cyaml_config_t *cfg,
131 cyaml_log_t level,
132 const 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
151static 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
181static 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
201static 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 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:130
@ CYAML_SEQUENCE_FIXED
Definition cyaml.h:119
@ CYAML_IGNORE
Definition cyaml.h:125
@ 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:138
@ CYAML_FLAG_CASE_SENSITIVE
Definition cyaml.h:249
@ CYAML_FLAG_CASE_INSENSITIVE
Definition cyaml.h:267
@ CYAML_CFG_CASE_INSENSITIVE
Definition cyaml.h:560
enum cyaml_type cyaml_type_e
Definition cyaml.h:1439
cyaml_log_fn_t log_fn
Definition cyaml.h:1454
cyaml_cfg_flags_t flags
Definition cyaml.h:1494
void * log_ctx
Definition cyaml.h:1464
cyaml_log_t log_level
Definition cyaml.h:1492
Definition cyaml.h:368
enum cyaml_flag flags
Definition cyaml.h:374
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:48
static void cyaml__log(const cyaml_config_t *cfg, cyaml_log_t level, const char *fmt,...)
Definition util.h:129
static const char * cyaml__state_to_str(enum cyaml_state_e state)
Definition util.h:77
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
static bool cyaml__is_case_sensitive(const cyaml_config_t *config, const cyaml_schema_value_t *schema)
Definition util.h:151
static bool cyaml__flag_check_all(enum cyaml_flag flags, enum cyaml_flag mask)
Definition util.h:201
static const char * cyaml__type_to_str(cyaml_type_e type)
Definition util.h:99
static bool cyaml__host_is_little_endian(void)
Definition util.h:36
cyaml_state_e
Definition util.h:60
@ CYAML_STATE__COUNT
Definition util.h:67
@ CYAML_STATE_IN_MAP_VALUE
Definition util.h:65
@ CYAML_STATE_IN_SEQUENCE
Definition util.h:66
@ CYAML_STATE_IN_STREAM
Definition util.h:62
@ CYAML_STATE_IN_DOC
Definition util.h:63
@ CYAML_STATE_IN_MAP_KEY
Definition util.h:64
@ CYAML_STATE_START
Definition util.h:61
uint32_t cyaml_bitfield_t
Definition util.h:54