Coverage Report

Created: 2026-05-23 06:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tinysparql/subprojects/json-glib-1.10.6/json-glib/json-value.c
Line
Count
Source
1
/* json-value.c - JSON value container
2
 * 
3
 * This file is part of JSON-GLib
4
 *
5
 * SPDX-FileCopyrightText: 2012  Emmanuele Bassi
6
 * SPDX-FileCopyrightText: 2015 Collabora Ltd.
7
 * SPDX-License-Identifier: LGPL-2.1-or-later
8
 *
9
 * This library is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public
11
 * License as published by the Free Software Foundation; either
12
 * version 2.1 of the License, or (at your option) any later version.
13
 *
14
 * This library is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
 * Lesser General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public
20
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21
 *
22
 * Author:
23
 *   Emmanuele Bassi  <ebassi@linux.intel.com>
24
 *   Philip Withnall  <philip.withnall@collabora.co.uk>
25
 */
26
27
#include "config.h"
28
29
#include <glib.h>
30
31
#include "json-types-private.h"
32
33
const gchar *
34
json_value_type_get_name (JsonValueType value_type)
35
474k
{
36
474k
  switch (value_type)
37
474k
    {
38
0
    case JSON_VALUE_INVALID:
39
0
      return "Unset";
40
41
1.39k
    case JSON_VALUE_INT:
42
1.39k
      return "Integer";
43
44
600
    case JSON_VALUE_DOUBLE:
45
600
      return "Floating Point";
46
47
11
    case JSON_VALUE_BOOLEAN:
48
11
      return "Boolean";
49
50
472k
    case JSON_VALUE_STRING:
51
472k
      return "String";
52
53
0
    case JSON_VALUE_NULL:
54
0
      return "Null";
55
474k
    }
56
57
0
  return "Undefined";
58
474k
}
59
60
GType
61
json_value_type (const JsonValue *value)
62
1.16M
{
63
1.16M
  switch (value->type)
64
1.16M
    {
65
0
    case JSON_VALUE_INVALID:
66
0
      return G_TYPE_INVALID;
67
68
2.81k
    case JSON_VALUE_INT:
69
2.81k
      return G_TYPE_INT64;
70
71
927
    case JSON_VALUE_DOUBLE:
72
927
      return G_TYPE_DOUBLE;
73
74
1.50k
    case JSON_VALUE_BOOLEAN:
75
1.50k
      return G_TYPE_BOOLEAN;
76
77
1.16M
    case JSON_VALUE_STRING:
78
1.16M
      return G_TYPE_STRING;
79
80
0
    case JSON_VALUE_NULL:
81
0
      return G_TYPE_INVALID;
82
1.16M
    }
83
84
0
  return G_TYPE_INVALID;
85
1.16M
}
86
87
JsonValue *
88
json_value_alloc (void)
89
874k
{
90
874k
  JsonValue *res = g_new0 (JsonValue, 1);
91
92
874k
  g_ref_count_init (&res->ref_count);
93
94
874k
  return res;
95
874k
}
96
97
JsonValue *
98
json_value_init (JsonValue     *value,
99
                 JsonValueType  value_type)
100
874k
{
101
874k
  g_return_val_if_fail (value != NULL, NULL);
102
103
874k
  if (value->type != JSON_VALUE_INVALID)
104
0
    json_value_unset (value);
105
106
874k
  value->type = value_type;
107
108
874k
  return value;
109
874k
}
110
111
JsonValue *
112
json_value_ref (JsonValue *value)
113
98
{
114
98
  g_return_val_if_fail (value != NULL, NULL);
115
116
98
  g_ref_count_inc (&value->ref_count);
117
118
98
  return value;
119
98
}
120
121
void
122
json_value_unref (JsonValue *value)
123
874k
{
124
874k
  g_return_if_fail (value != NULL);
125
126
874k
  if (g_ref_count_dec (&value->ref_count))
127
874k
    json_value_free (value);
128
874k
}
129
130
void
131
json_value_unset (JsonValue *value)
132
874k
{
133
874k
  g_return_if_fail (value != NULL);
134
135
874k
  switch (value->type)
136
874k
    {
137
0
    case JSON_VALUE_INVALID:
138
0
      break;
139
140
256k
    case JSON_VALUE_INT:
141
256k
      value->data.v_int = 0;
142
256k
      break;
143
144
1.89k
    case JSON_VALUE_DOUBLE:
145
1.89k
      value->data.v_double = 0.0;
146
1.89k
      break;
147
148
1.05k
    case JSON_VALUE_BOOLEAN:
149
1.05k
      value->data.v_bool = FALSE;
150
1.05k
      break;
151
152
614k
    case JSON_VALUE_STRING:
153
614k
      g_free (value->data.v_str);
154
614k
      value->data.v_str = NULL;
155
614k
      break;
156
157
0
    case JSON_VALUE_NULL:
158
0
      break;
159
874k
    }
160
874k
}
161
162
void
163
json_value_free (JsonValue *value)
164
874k
{
165
874k
  if (G_LIKELY (value != NULL))
166
874k
    {
167
874k
      json_value_unset (value);
168
874k
      g_free (value);
169
874k
    }
170
874k
}
171
172
/*< private >
173
 * json_value_seal:
174
 * @value: a JSON scalar value
175
 *
176
 * Seals the value, making it immutable to further changes.
177
 *
178
 * If the value is already immutable, this is a no-op.
179
 */
180
void
181
json_value_seal (JsonValue *value)
182
0
{
183
0
  g_return_if_fail (JSON_VALUE_IS_VALID (value));
184
185
0
  value->immutable = TRUE;
186
0
}
187
188
guint
189
json_value_hash (gconstpointer key)
190
0
{
191
0
  JsonValue *value;
192
0
  guint value_hash;
193
0
  guint type_hash;
194
195
0
  value = (JsonValue *) key;
196
197
  /* Hash the type and value separately.
198
   * Use the top 3 bits to store the type. */
199
0
  type_hash = value->type << (sizeof (guint) * 8 - 3);
200
201
0
  switch (value->type)
202
0
    {
203
0
    case JSON_VALUE_NULL:
204
0
      value_hash = 0;
205
0
      break;
206
0
    case JSON_VALUE_BOOLEAN:
207
0
      value_hash = json_value_get_boolean (value) ? 1 : 0;
208
0
      break;
209
0
    case JSON_VALUE_STRING:
210
0
      value_hash = json_string_hash (json_value_get_string (value));
211
0
      break;
212
0
    case JSON_VALUE_INT: {
213
0
      gint64 v = json_value_get_int (value);
214
0
      value_hash = g_int64_hash (&v);
215
0
      break;
216
0
    }
217
0
    case JSON_VALUE_DOUBLE: {
218
0
      gdouble v = json_value_get_double (value);
219
0
      value_hash = g_double_hash (&v);
220
0
      break;
221
0
    }
222
0
    case JSON_VALUE_INVALID:
223
0
    default:
224
0
      g_assert_not_reached ();
225
0
    }
226
227
  /* Mask out the top 3 bits of the @value_hash. */
228
0
  value_hash &= ~(7u << (sizeof (guint) * 8 - 3));
229
230
0
  return (type_hash | value_hash);
231
0
}
232
233
#define _JSON_VALUE_DEFINE_SET(Type,EType,CType,VField) \
234
void \
235
259k
json_value_set_##Type (JsonValue *value, CType VField) \
236
259k
{ \
237
259k
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
259k
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
259k
  g_return_if_fail (!value->immutable); \
240
259k
\
241
259k
  value->data.VField = VField; \
242
259k
\
243
259k
}
json_value_set_int
Line
Count
Source
235
256k
json_value_set_##Type (JsonValue *value, CType VField) \
236
256k
{ \
237
256k
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
256k
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
256k
  g_return_if_fail (!value->immutable); \
240
256k
\
241
256k
  value->data.VField = VField; \
242
256k
\
243
256k
}
json_value_set_double
Line
Count
Source
235
1.89k
json_value_set_##Type (JsonValue *value, CType VField) \
236
1.89k
{ \
237
1.89k
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
1.89k
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
1.89k
  g_return_if_fail (!value->immutable); \
240
1.89k
\
241
1.89k
  value->data.VField = VField; \
242
1.89k
\
243
1.89k
}
json_value_set_boolean
Line
Count
Source
235
1.05k
json_value_set_##Type (JsonValue *value, CType VField) \
236
1.05k
{ \
237
1.05k
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
1.05k
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
1.05k
  g_return_if_fail (!value->immutable); \
240
1.05k
\
241
1.05k
  value->data.VField = VField; \
242
1.05k
\
243
1.05k
}
244
245
#define _JSON_VALUE_DEFINE_GET(Type,EType,CType,VField) \
246
CType \
247
481k
json_value_get_##Type (const JsonValue *value) \
248
481k
{ \
249
481k
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
481k
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
481k
\
252
481k
  return value->data.VField; \
253
481k
}
json_value_get_int
Line
Count
Source
247
937
json_value_get_##Type (const JsonValue *value) \
248
937
{ \
249
937
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
937
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
937
\
252
937
  return value->data.VField; \
253
937
}
json_value_get_double
Line
Count
Source
247
309
json_value_get_##Type (const JsonValue *value) \
248
309
{ \
249
309
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
309
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
309
\
252
309
  return value->data.VField; \
253
309
}
json_value_get_boolean
Line
Count
Source
247
500
json_value_get_##Type (const JsonValue *value) \
248
500
{ \
249
500
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
500
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
500
\
252
500
  return value->data.VField; \
253
500
}
json_value_get_string
Line
Count
Source
247
479k
json_value_get_##Type (const JsonValue *value) \
248
479k
{ \
249
479k
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
479k
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
479k
\
252
479k
  return value->data.VField; \
253
479k
}
254
255
#define _JSON_VALUE_DEFINE_SET_GET(Type,EType,CType,VField) \
256
_JSON_VALUE_DEFINE_SET(Type,EType,CType,VField) \
257
_JSON_VALUE_DEFINE_GET(Type,EType,CType,VField)
258
259
_JSON_VALUE_DEFINE_SET_GET(int, INT, gint64, v_int)
260
261
_JSON_VALUE_DEFINE_SET_GET(double, DOUBLE, gdouble, v_double)
262
263
_JSON_VALUE_DEFINE_SET_GET(boolean, BOOLEAN, gboolean, v_bool)
264
265
void
266
json_value_set_string (JsonValue *value,
267
                       const gchar *v_str)
268
614k
{
269
614k
  g_return_if_fail (JSON_VALUE_IS_VALID (value));
270
614k
  g_return_if_fail (JSON_VALUE_HOLDS_STRING (value));
271
614k
  g_return_if_fail (!value->immutable);
272
273
614k
  g_free (value->data.v_str);
274
614k
  value->data.v_str = g_strdup (v_str);
275
614k
}
276
277
_JSON_VALUE_DEFINE_GET(string, STRING, const gchar *, v_str)
278
279
#undef _JSON_VALUE_DEFINE_SET_GET
280
#undef _JSON_VALUE_DEFINE_GET
281
#undef _JSON_VALUE_DEFINE_SET