Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 8a33b14

Browse files
committed
Add fl_value_to_string
1 parent 52a11ee commit 8a33b14

File tree

3 files changed

+346
-5
lines changed

3 files changed

+346
-5
lines changed

shell/platform/linux/fl_value.cc

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,122 @@ static ssize_t fl_value_lookup_index(FlValue* self, FlValue* key) {
9292
return -1;
9393
}
9494

95+
// Converts an integer to a string and adds it to the buffer
96+
static void int_to_string(int64_t value, GString* buffer) {
97+
g_string_append_printf(buffer, "%" G_GINT64_FORMAT, value);
98+
}
99+
100+
// Converts a floating point number to a string and adds it to the buffer
101+
static void float_to_string(double value, GString* buffer) {
102+
g_string_append_printf(buffer, "%.16f", value);
103+
104+
// Strip trailing zeros
105+
int zero_count = 0;
106+
for (int i = buffer->len - 1; i >= 0; i--) {
107+
// Leave one zero after a decimal point
108+
if (buffer->str[i] == '.') {
109+
zero_count = zero_count == 0 ? 0 : zero_count - 1;
110+
break;
111+
}
112+
if (buffer->str[i] != '0')
113+
break;
114+
zero_count++;
115+
}
116+
g_string_truncate(buffer, buffer->len - zero_count);
117+
}
118+
119+
static void value_to_string(FlValue* value, GString* buffer) {
120+
switch (value->type) {
121+
case FL_VALUE_TYPE_NULL:
122+
g_string_append(buffer, "null");
123+
return;
124+
case FL_VALUE_TYPE_BOOL:
125+
if (fl_value_get_bool(value))
126+
g_string_append(buffer, "true");
127+
else
128+
g_string_append(buffer, "false");
129+
return;
130+
case FL_VALUE_TYPE_INT:
131+
int_to_string(fl_value_get_int(value), buffer);
132+
return;
133+
case FL_VALUE_TYPE_FLOAT:
134+
float_to_string(fl_value_get_float(value), buffer);
135+
return;
136+
case FL_VALUE_TYPE_STRING: {
137+
g_string_append(buffer, fl_value_get_string(value));
138+
return;
139+
}
140+
case FL_VALUE_TYPE_UINT8_LIST: {
141+
g_string_append(buffer, "[");
142+
const uint8_t* values = fl_value_get_uint8_list(value);
143+
for (size_t i = 0; i < fl_value_get_length(value); i++) {
144+
if (i != 0)
145+
g_string_append(buffer, ", ");
146+
int_to_string(values[i], buffer);
147+
}
148+
g_string_append(buffer, "]");
149+
return;
150+
}
151+
case FL_VALUE_TYPE_INT32_LIST: {
152+
g_string_append(buffer, "[");
153+
const int32_t* values = fl_value_get_int32_list(value);
154+
for (size_t i = 0; i < fl_value_get_length(value); i++) {
155+
if (i != 0)
156+
g_string_append(buffer, ", ");
157+
int_to_string(values[i], buffer);
158+
}
159+
g_string_append(buffer, "]");
160+
return;
161+
}
162+
case FL_VALUE_TYPE_INT64_LIST: {
163+
g_string_append(buffer, "[");
164+
const int64_t* values = fl_value_get_int64_list(value);
165+
for (size_t i = 0; i < fl_value_get_length(value); i++) {
166+
if (i != 0)
167+
g_string_append(buffer, ", ");
168+
int_to_string(values[i], buffer);
169+
}
170+
g_string_append(buffer, "]");
171+
return;
172+
}
173+
case FL_VALUE_TYPE_FLOAT_LIST: {
174+
g_string_append(buffer, "[");
175+
const double* values = fl_value_get_float_list(value);
176+
for (size_t i = 0; i < fl_value_get_length(value); i++) {
177+
if (i != 0)
178+
g_string_append(buffer, ", ");
179+
float_to_string(values[i], buffer);
180+
}
181+
g_string_append(buffer, "]");
182+
return;
183+
}
184+
case FL_VALUE_TYPE_LIST: {
185+
g_string_append(buffer, "[");
186+
for (size_t i = 0; i < fl_value_get_length(value); i++) {
187+
if (i != 0)
188+
g_string_append(buffer, ", ");
189+
value_to_string(fl_value_get_list_value(value, i), buffer);
190+
}
191+
g_string_append(buffer, "]");
192+
return;
193+
}
194+
case FL_VALUE_TYPE_MAP: {
195+
g_string_append(buffer, "{");
196+
for (size_t i = 0; i < fl_value_get_length(value); i++) {
197+
if (i != 0)
198+
g_string_append(buffer, ", ");
199+
value_to_string(fl_value_get_map_key(value, i), buffer);
200+
g_string_append(buffer, ": ");
201+
value_to_string(fl_value_get_map_value(value, i), buffer);
202+
}
203+
g_string_append(buffer, "}");
204+
return;
205+
}
206+
default:
207+
g_string_append_printf(buffer, "<unknown type %d>", value->type);
208+
}
209+
}
210+
95211
G_MODULE_EXPORT FlValue* fl_value_new_null() {
96212
return fl_value_new(FL_VALUE_TYPE_NULL, sizeof(FlValue));
97213
}
@@ -570,3 +686,9 @@ FlValue* fl_value_lookup_string(FlValue* self, const gchar* key) {
570686
g_autoptr(FlValue) string_key = fl_value_new_string(key);
571687
return fl_value_lookup(self, string_key);
572688
}
689+
690+
gchar* fl_value_to_string(FlValue* value) {
691+
GString* buffer = g_string_new("");
692+
value_to_string(value, buffer);
693+
return g_string_free(buffer, FALSE);
694+
}

0 commit comments

Comments
 (0)