Reduct  v1.0.4-3-gdaf0d70
A functional and immutable language.
Loading...
Searching...
No Matches
stringify_impl.h
Go to the documentation of this file.
1#include "item.h"
2#ifndef REDUCT_STRINGIFY_IMPL_H
3#define REDUCT_STRINGIFY_IMPL_H 1
4
5#include "stringify.h"
6
7static inline reduct_size_t reduct_stringify_internal(reduct_t* reduct, reduct_handle_t* handle, char* buffer,
8 reduct_size_t size)
9{
10 REDUCT_ASSERT(reduct != REDUCT_NULL);
11 REDUCT_ASSERT(buffer != REDUCT_NULL || size == 0);
12
13 if (handle == REDUCT_NULL)
14 {
15 return REDUCT_SNPRINTF(buffer, size, "<null>");
16 }
17
18 if (*handle == REDUCT_HANDLE_NONE)
19 {
20 return REDUCT_SNPRINTF(buffer, size, "<none>");
21 }
22
23 if (!REDUCT_HANDLE_IS_ITEM(handle))
24 {
25 if (REDUCT_HANDLE_IS_INT(handle))
26 {
27 return REDUCT_SNPRINTF(buffer, size, "%lld", (long long)REDUCT_HANDLE_TO_INT(handle));
28 }
29 else if (REDUCT_HANDLE_IS_FLOAT(handle))
30 {
31 return REDUCT_SNPRINTF(buffer, size, "%g", (double)REDUCT_HANDLE_TO_FLOAT(handle));
32 }
33
34 return REDUCT_SNPRINTF(buffer, size, "<unknown>");
35 }
36
38 switch (item->type)
39 {
41 {
43 {
44 return REDUCT_SNPRINTF(buffer, size, "%lld", (long long)item->atom.integerValue);
45 }
46 else if (item->flags & REDUCT_ITEM_FLAG_FLOAT_SHAPED)
47 {
48 return REDUCT_SNPRINTF(buffer, size, "%g", (double)item->atom.floatValue);
49 }
50
51 return REDUCT_SNPRINTF(buffer, size, "\"%.*s\"", (int)item->atom.length, item->atom.string);
52 }
54 {
55 reduct_size_t written = 0;
56 reduct_size_t res = REDUCT_SNPRINTF(buffer, size, "(");
57 written += res;
58
59 reduct_handle_t child;
60 REDUCT_LIST_FOR_EACH(&child, &item->list)
61 {
62 res = reduct_stringify(reduct, &child, size > written ? buffer + written : REDUCT_NULL,
63 size > written ? size - written : 0);
64 written += res;
65
66 if (_iter.index < item->length)
67 {
68 res = REDUCT_SNPRINTF(size > written ? buffer + written : REDUCT_NULL,
69 size > written ? size - written : 0, " ");
70 written += res;
71 }
72 }
73
74 res =
75 REDUCT_SNPRINTF(size > written ? buffer + written : REDUCT_NULL, size > written ? size - written : 0, ")");
76 written += res;
77
78 return written;
79 }
81 return REDUCT_SNPRINTF(buffer, size, "<function at %p>", (void*)item);
83 return REDUCT_SNPRINTF(buffer, size, "<closure at %p>", (void*)item);
84 default:
85 return REDUCT_SNPRINTF(buffer, size, "<unknown>");
86 }
87 return 0;
88}
89
91{
92 if (REDUCT_HANDLE_IS_ATOM(handle))
93 {
94 char* str;
95 reduct_size_t len;
96 reduct_handle_get_string_params(reduct, handle, &str, &len);
97 if (buffer != REDUCT_NULL && size > 0)
98 {
99 reduct_size_t copyLen = (len < size) ? len : size - 1;
100 REDUCT_MEMCPY(buffer, str, copyLen);
101 buffer[copyLen] = '\0';
102 }
103 return len;
104 }
105
106 return reduct_stringify_internal(reduct, handle, buffer, size);
107}
108
109#endif
#define REDUCT_SNPRINTF
Definition defs.h:51
size_t reduct_size_t
Definition defs.h:100
#define REDUCT_MEMCPY(_dest, _src, _size)
Definition defs.h:33
reduct_uint64_t reduct_handle_t
Handle type.
Definition defs.h:189
#define REDUCT_ASSERT(_cond)
Definition defs.h:25
#define REDUCT_API
Definition defs.h:7
#define REDUCT_NULL
Definition defs.h:23
#define REDUCT_HANDLE_IS_ITEM(_handle)
Check if a handle is an item.
Definition handle.h:171
#define REDUCT_HANDLE_IS_INT(_handle)
Check if a handle is an integer.
Definition handle.h:118
#define REDUCT_HANDLE_TO_INT(_handle)
Get the integer value of a handle.
Definition handle.h:236
#define REDUCT_HANDLE_TO_ITEM(_handle)
Get the item pointer of a handle.
Definition handle.h:257
#define REDUCT_HANDLE_TO_FLOAT(_handle)
Get the float value of a handle.
Definition handle.h:244
#define REDUCT_HANDLE_NONE
Invalid handle constant.
Definition handle.h:36
REDUCT_API void reduct_handle_get_string_params(struct reduct *reduct, reduct_handle_t *handle, char **outStr, reduct_size_t *outLen)
Get the string pointer and length from an atom handle.
#define REDUCT_HANDLE_IS_FLOAT(_handle)
Check if a handle is a float.
Definition handle.h:126
#define REDUCT_HANDLE_IS_ATOM(_handle)
Check if a handle is an atom.
Definition handle.h:179
#define REDUCT_ITEM_TYPE_LIST
A list.
Definition item.h:28
#define REDUCT_ITEM_TYPE_ATOM
An atom.
Definition item.h:27
#define REDUCT_ITEM_TYPE_FUNCTION
A function.
Definition item.h:29
#define REDUCT_ITEM_FLAG_INT_SHAPED
Item is an integer shaped atom.
Definition item.h:39
#define REDUCT_ITEM_FLAG_FLOAT_SHAPED
Item is a float shaped atom.
Definition item.h:40
#define REDUCT_ITEM_TYPE_CLOSURE
A closure.
Definition item.h:30
REDUCT_API reduct_size_t reduct_stringify(reduct_t *reduct, reduct_handle_t *handle, char *buffer, reduct_size_t size)
Converts a Reduct handle to its string representation.
Item management.
#define REDUCT_LIST_FOR_EACH(_handle, _list)
Macro for iterating over all elements in a list.
Definition list.h:181
Stringification.
static reduct_size_t reduct_stringify_internal(reduct_t *reduct, reduct_handle_t *handle, char *buffer, reduct_size_t size)
reduct_int64_t integerValue
Pre-computed integer value, item must have REDUCT_ITEM_FLAG_INT_SHAPED.
Definition atom.h:55
reduct_uint32_t length
The length of the string (must be first, check the reduct_item_t structure).
Definition atom.h:49
char * string
Pointer to the string.
Definition atom.h:53
reduct_float_t floatValue
Pre-computed float value, item must have REDUCT_ITEM_FLAG_FLOAT_SHAPED.
Definition atom.h:56
Item structure.
Definition item.h:57
reduct_list_t list
A list.
Definition item.h:67
reduct_uint32_t length
Common length for the item. (Stored in the union to save space due to padding rules....
Definition item.h:65
reduct_item_flags_t flags
Flags for the item.
Definition item.h:60
reduct_atom_t atom
An atom.
Definition item.h:66
reduct_item_type_t type
The type of the item.
Definition item.h:61
State structure.
Definition core.h:61