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
28static inline bool cyaml__host_is_little_endian(void)
29{
30 const uint16_t test = 1;
31
32 return ((const uint8_t *) &test)[0];
33}
34
40static inline bool cyaml__host_is_big_endian(void)
41{
43}
44
46typedef uint32_t cyaml_bitfield_t;
47
49#define CYAML_BITFIELD_BITS (sizeof(cyaml_bitfield_t) * CHAR_BIT)
50
61};
62
69static 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
91static 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
121static 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
143static 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
173static 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
193static 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: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:40
static void cyaml__log(const cyaml_config_t *cfg, cyaml_log_t level, const char *fmt,...)
Definition: util.h:121
static const char * cyaml__state_to_str(enum cyaml_state_e state)
Definition: util.h:69
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
uint32_t cyaml_bitfield_t
Definition: util.h:46