@@ -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+
95211G_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