Nyx Node
Loading...
Searching...
No Matches
json_string.c
1/* NyxNode
2 * Author: Jérôme ODIER <jerome.odier@lpsc.in2p3.fr>
3 * SPDX-License-Identifier: GPL-2.0-only (Mongoose backend) or GPL-3.0+
4 */
5
6/*--------------------------------------------------------------------------------------------------------------------*/
7
8#include <string.h>
9
10#include "../nyx_node_internal.h"
11
12/*--------------------------------------------------------------------------------------------------------------------*/
13
14nyx_string_t *nyx_string_new(void)
15{
16 /*----------------------------------------------------------------------------------------------------------------*/
17
19
20 /*----------------------------------------------------------------------------------------------------------------*/
21
22 object->base = NYX_OBJECT(NYX_TYPE_STRING);
23
24 /*----------------------------------------------------------------------------------------------------------------*/
25
26 object->managed = false;
27 object->length = 0x000000000000;
28 object->value = (str_t) /* NOSONAR */ "";
29
30
31 /*----------------------------------------------------------------------------------------------------------------*/
32
33 return object;
34}
35
36/*--------------------------------------------------------------------------------------------------------------------*/
37
38void nyx_string_free(nyx_string_t *object)
39{
40 if(object->managed)
41 {
42 nyx_memory_free(object->value);
43 }
44
45 nyx_memory_free(object);
46}
47
48/*--------------------------------------------------------------------------------------------------------------------*/
49
50STR_t nyx_string_get(const nyx_string_t *object)
51{
52 return object->value;
53}
54
55/*--------------------------------------------------------------------------------------------------------------------*/
56
57void nyx_string_get_buff(const nyx_string_t *object, size_t *result_size, buff_t *result_buff)
58{
59 if(result_size != NULL) {
60 *result_size = object->length;
61 }
62
63 if(result_buff != NULL) {
64 *result_buff = object->value;
65 }
66}
67
68/*--------------------------------------------------------------------------------------------------------------------*/
69
70bool nyx_string_set(nyx_string_t *object, STR_t value, bool managed)
71{
72 if(value == NULL)
73 {
74 NYX_LOG_ERROR("Null string not allowed");
75
76 return false;
77 }
78
79 bool modified = strcmp(object->value, value) != 0;
80
81 if(modified || object->managed == false)
82 {
83 /*------------------------------------------------------------------------------------------------------------*/
84
85 if(object->managed)
86 {
87 nyx_memory_free(object->value);
88 }
89
90 /*------------------------------------------------------------------------------------------------------------*/
91
92 object->managed = managed;
93 object->length = strlen(value);
94 object->value = (str_t) /* NOSONAR */ value;
95
96 /*------------------------------------------------------------------------------------------------------------*/
97
98 return modified;
99 }
100
101 return false;
102}
103
104/*--------------------------------------------------------------------------------------------------------------------*/
105
106bool nyx_string_set_buff(nyx_string_t *object, size_t size, BUFF_t buff, bool managed)
107{
108 if(buff == NULL)
109 {
110 NYX_LOG_ERROR("Null buffer not allowed");
111
112 return false;
113 }
114
115 bool modified = object->length != size || memcmp(object->value, buff, size) != 0;
116
117 if(modified || object->managed == false)
118 {
119 /*------------------------------------------------------------------------------------------------------------*/
120
121 if(object->managed)
122 {
123 nyx_memory_free(object->value);
124 }
125
126 /*------------------------------------------------------------------------------------------------------------*/
127
128 object->managed = managed;
129 object->length = /*--*/(size);
130 object->value = (str_t) /* NOSONAR */ buff;
131
132 /*------------------------------------------------------------------------------------------------------------*/
133
134 return modified;
135 }
136
137 return true;
138}
139
140/*--------------------------------------------------------------------------------------------------------------------*/
141
142size_t nyx_string_length(const nyx_string_t *object)
143{
144 return object->length;
145}
146
147/*--------------------------------------------------------------------------------------------------------------------*/
148
149str_t nyx_string_to_string(const nyx_string_t *object)
150{
151 nyx_string_builder_t *sb = nyx_string_builder_new();
152
153 nyx_string_builder_append(sb, NYX_SB_NO_ESCAPE, "\"");
154 nyx_string_builder_append(sb, NYX_SB_ESCAPE_JSON, object->value);
155 nyx_string_builder_append(sb, NYX_SB_NO_ESCAPE, "\"");
156
157 str_t result = nyx_string_builder_to_string(sb);
158
159 nyx_string_builder_free(sb);
160
161 return result;
162}
163
164/*--------------------------------------------------------------------------------------------------------------------*/
165
167{
168 nyx_string_builder_t *sb = nyx_string_builder_new();
169
171 nyx_string_builder_append(sb, NYX_SB_NO_ESCAPE, object->value);
173
174 str_t result = nyx_string_builder_to_string(sb);
175
176 nyx_string_builder_free(sb);
177
178 return result;
179}
180
181/*--------------------------------------------------------------------------------------------------------------------*/
#define NYX_LOG_ERROR(fmt,...)
Logs an error message.
Definition nyx_node.h:218
#define STR_t
Alias for const char *.
Definition nyx_node.h:71
__NYX_NULLABLE__ buff_t nyx_memory_alloc(__NYX_ZEROABLE__ size_t size)
Similar to libc malloc except that a memory overflow causes the node to stop.
__NYX_ZEROABLE__ size_t nyx_memory_free(__NYX_NULLABLE__ buff_t buff)
Similar to libc free except that it returns the amount of memory freed.
#define buff_t
Alias for void *.
Definition nyx_node.h:67
#define BUFF_t
Alias for const void *.
Definition nyx_node.h:68
#define str_t
Alias for char *.
Definition nyx_node.h:70
@ NYX_TYPE_STRING
String object.
Definition nyx_node.h:425
str_t nyx_string_to_cstring(const nyx_string_t *object)
Struct describing a JSON string object.
Definition nyx_node.h:900
str_t value
C string payload.
Definition nyx_node.h:905
bool managed
true if the value is freed with this object.
Definition nyx_node.h:903