10#include "nyx_node_internal.h"
14typedef struct nyx_string_builder_node_s
20 struct nyx_string_builder_node_s *next;
26nyx_string_builder_t *nyx_string_builder_new()
44void nyx_string_builder_free(nyx_string_builder_t *sb)
46 nyx_string_builder_clear(sb);
53void nyx_string_builder_clear(nyx_string_builder_t *sb)
57 for(node_t *node = sb->head; node != NULL;)
82void nyx_string_builder_append_buff(nyx_string_builder_t *sb, uint32_t flags,
size_t len,
STR_t str)
88 memcpy((
str_t) (node + 1), str, len);
105 sb->tail->next = node;
114void nyx_string_builder_append_n(nyx_string_builder_t *sb, uint32_t flags,
STR_t args[],
size_t n)
116 for(
size_t i = 0; i < n; i++)
122 nyx_string_builder_append_buff(sb, NYX_SB_NO_ESCAPE, 6,
"(null)");
126 nyx_string_builder_append_buff(sb, flags, strlen(str), str);
133size_t nyx_string_builder_length(
const nyx_string_builder_t *sb)
139 for(node_t *node = sb->head; node != NULL; node = node->next)
143 size_t len = node->len;
145 if((node->flags & NYX_SB_ESCAPE_JSON) != 0)
147 if((node->flags & NYX_SB_ESCAPE_XML) != 0)
151 for(; len > 0; len--)
190 for(; len > 0; len--)
215 if((node->flags & NYX_SB_ESCAPE_XML) != 0)
219 for(; len > 0; len--)
261str_t nyx_string_builder_to_string(
const nyx_string_builder_t *sb)
271 for(node_t *node = sb->head; node != NULL; node = node->next)
275 size_t len = node->len;
277 if((node->flags & NYX_SB_ESCAPE_JSON) != 0)
279 if((node->flags & NYX_SB_ESCAPE_XML) != 0)
283 for(; len > 0; len--)
288 *p++ =
'&'; *p++ =
'l'; *p++ =
't'; *p++ =
';';
break;
291 *p++ =
'&'; *p++ =
'g'; *p++ =
't'; *p++ =
';';
break;
294 *p++ =
'&'; *p++ =
'a'; *p++ =
'm'; *p++ =
'p'; *p++ =
';';
break;
297 *p++ =
'&'; *p++ =
'q'; *p++ =
'u'; *p++ =
'o'; *p++ =
't'; *p++ =
';';
break;
300 *p++ =
'&'; *p++ =
'a'; *p++ =
'p'; *p++ =
'o'; *p++ =
's'; *p++ =
';';
break;
302 case '\\': *p++ =
'\\'; *p++ =
'\\';
break;
303 case '\b': *p++ =
'\\'; *p++ =
'b';
break;
304 case '\f': *p++ =
'\\'; *p++ =
'f';
break;
305 case '\n': *p++ =
'\\'; *p++ =
'n';
break;
306 case '\r': *p++ =
'\\'; *p++ =
'r';
break;
307 case '\t': *p++ =
'\\'; *p++ =
't';
break;
321 for(; len > 0; len--)
325 case '\"': *p++ =
'\\'; *p++ =
'\"';
break;
326 case '\\': *p++ =
'\\'; *p++ =
'\\';
break;
327 case '\b': *p++ =
'\\'; *p++ =
'b';
break;
328 case '\f': *p++ =
'\\'; *p++ =
'f';
break;
329 case '\n': *p++ =
'\\'; *p++ =
'n';
break;
330 case '\r': *p++ =
'\\'; *p++ =
'r';
break;
331 case '\t': *p++ =
'\\'; *p++ =
't';
break;
344 if((node->flags & NYX_SB_ESCAPE_XML) != 0)
348 for(; len > 0; len--)
353 *p++ =
'&'; *p++ =
'l'; *p++ =
't'; *p++ =
';';
break;
356 *p++ =
'&'; *p++ =
'g'; *p++ =
't'; *p++ =
';';
break;
359 *p++ =
'&'; *p++ =
'a'; *p++ =
'm'; *p++ =
'p'; *p++ =
';';
break;
362 *p++ =
'&'; *p++ =
'q'; *p++ =
'u'; *p++ =
'o'; *p++ =
't'; *p++ =
';';
break;
365 *p++ =
'&'; *p++ =
'a'; *p++ =
'p'; *p++ =
'o'; *p++ =
's'; *p++ =
';';
break;
379 p = (
str_t) memcpy(p, q, len) + len;
#define STR_t
Alias for const char *.
__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 str_t
Alias for char *.