Coverage Report

Created: 2026-08-13 06:53

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
472k
{
36
472k
  switch (value_type)
37
472k
    {
38
0
    case JSON_VALUE_INVALID:
39
0
      return "Unset";
40
41
2.19k
    case JSON_VALUE_INT:
42
2.19k
      return "Integer";
43
44
518
    case JSON_VALUE_DOUBLE:
45
518
      return "Floating Point";
46
47
7
    case JSON_VALUE_BOOLEAN:
48
7
      return "Boolean";
49
50
470k
    case JSON_VALUE_STRING:
51
470k
      return "String";
52
53
0
    case JSON_VALUE_NULL:
54
0
      return "Null";
55
472k
    }
56
57
0
  return "Undefined";
58
472k
}
59
60
GType
61
json_value_type (const JsonValue *value)
62
1.18M
{
63
1.18M
  switch (value->type)
64
1.18M
    {
65
0
    case JSON_VALUE_INVALID:
66
0
      return G_TYPE_INVALID;
67
68
3.69k
    case JSON_VALUE_INT:
69
3.69k
      return G_TYPE_INT64;
70
71
801
    case JSON_VALUE_DOUBLE:
72
801
      return G_TYPE_DOUBLE;
73
74
890
    case JSON_VALUE_BOOLEAN:
75
890
      return G_TYPE_BOOLEAN;
76
77
1.18M
    case JSON_VALUE_STRING:
78
1.18M
      return G_TYPE_STRING;
79
80
0
    case JSON_VALUE_NULL:
81
0
      return G_TYPE_INVALID;
82
1.18M
    }
83
84
0
  return G_TYPE_INVALID;
85
1.18M
}
86
87
JsonValue *
88
json_value_alloc (void)
89
759k
{
90
759k
  JsonValue *res = g_new0 (JsonValue, 1);
91
92
759k
  g_ref_count_init (&res->ref_count);
93
94
759k
  return res;
95
759k
}
96
97
JsonValue *
98
json_value_init (JsonValue     *value,
99
                 JsonValueType  value_type)
100
759k
{
101
759k
  g_return_val_if_fail (value != NULL, NULL);
102
103
759k
  if (value->type != JSON_VALUE_INVALID)
104
0
    json_value_unset (value);
105
106
759k
  value->type = value_type;
107
108
759k
  return value;
109
759k
}
110
111
JsonValue *
112
json_value_ref (JsonValue *value)
113
109
{
114
109
  g_return_val_if_fail (value != NULL, NULL);
115
116
109
  g_ref_count_inc (&value->ref_count);
117
118
109
  return value;
119
109
}
120
121
void
122
json_value_unref (JsonValue *value)
123
759k
{
124
759k
  g_return_if_fail (value != NULL);
125
126
759k
  if (g_ref_count_dec (&value->ref_count))
127
759k
    json_value_free (value);
128
759k
}
129
130
void
131
json_value_unset (JsonValue *value)
132
759k
{
133
759k
  g_return_if_fail (value != NULL);
134
135
759k
  switch (value->type)
136
759k
    {
137
0
    case JSON_VALUE_INVALID:
138
0
      break;
139
140
137k
    case JSON_VALUE_INT:
141
137k
      value->data.v_int = 0;
142
137k
      break;
143
144
1.38k
    case JSON_VALUE_DOUBLE:
145
1.38k
      value->data.v_double = 0.0;
146
1.38k
      break;
147
148
622
    case JSON_VALUE_BOOLEAN:
149
622
      value->data.v_bool = FALSE;
150
622
      break;
151
152
620k
    case JSON_VALUE_STRING:
153
620k
      g_free (value->data.v_str);
154
620k
      value->data.v_str = NULL;
155
620k
      break;
156
157
0
    case JSON_VALUE_NULL:
158
0
      break;
159
759k
    }
160
759k
}
161
162
void
163
json_value_free (JsonValue *value)
164
759k
{
165
759k
  if (G_LIKELY (value != NULL))
166
759k
    {
167
759k
      json_value_unset (value);
168
759k
      g_free (value);
169
759k
    }
170
759k
}
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
139k
json_value_set_##Type (JsonValue *value, CType VField) \
236
139k
{ \
237
139k
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
139k
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
139k
  g_return_if_fail (!value->immutable); \
240
139k
\
241
139k
  value->data.VField = VField; \
242
139k
\
243
139k
}
json_value_set_int
Line
Count
Source
235
137k
json_value_set_##Type (JsonValue *value, CType VField) \
236
137k
{ \
237
137k
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
137k
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
137k
  g_return_if_fail (!value->immutable); \
240
137k
\
241
137k
  value->data.VField = VField; \
242
137k
\
243
137k
}
json_value_set_double
Line
Count
Source
235
1.38k
json_value_set_##Type (JsonValue *value, CType VField) \
236
1.38k
{ \
237
1.38k
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
1.38k
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
1.38k
  g_return_if_fail (!value->immutable); \
240
1.38k
\
241
1.38k
  value->data.VField = VField; \
242
1.38k
\
243
1.38k
}
json_value_set_boolean
Line
Count
Source
235
622
json_value_set_##Type (JsonValue *value, CType VField) \
236
622
{ \
237
622
  g_return_if_fail (JSON_VALUE_IS_VALID (value)); \
238
622
  g_return_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType)); \
239
622
  g_return_if_fail (!value->immutable); \
240
622
\
241
622
  value->data.VField = VField; \
242
622
\
243
622
}
244
245
#define _JSON_VALUE_DEFINE_GET(Type,EType,CType,VField) \
246
CType \
247
494k
json_value_get_##Type (const JsonValue *value) \
248
494k
{ \
249
494k
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
494k
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
494k
\
252
494k
  return value->data.VField; \
253
494k
}
json_value_get_int
Line
Count
Source
247
1.23k
json_value_get_##Type (const JsonValue *value) \
248
1.23k
{ \
249
1.23k
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
1.23k
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
1.23k
\
252
1.23k
  return value->data.VField; \
253
1.23k
}
json_value_get_double
Line
Count
Source
247
267
json_value_get_##Type (const JsonValue *value) \
248
267
{ \
249
267
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
267
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
267
\
252
267
  return value->data.VField; \
253
267
}
json_value_get_boolean
Line
Count
Source
247
296
json_value_get_##Type (const JsonValue *value) \
248
296
{ \
249
296
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
296
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
296
\
252
296
  return value->data.VField; \
253
296
}
json_value_get_string
Line
Count
Source
247
493k
json_value_get_##Type (const JsonValue *value) \
248
493k
{ \
249
493k
  g_return_val_if_fail (JSON_VALUE_IS_VALID (value), 0); \
250
493k
  g_return_val_if_fail (JSON_VALUE_HOLDS (value, JSON_VALUE_##EType), 0); \
251
493k
\
252
493k
  return value->data.VField; \
253
493k
}
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
620k
{
269
620k
  g_return_if_fail (JSON_VALUE_IS_VALID (value));
270
620k
  g_return_if_fail (JSON_VALUE_HOLDS_STRING (value));
271
620k
  g_return_if_fail (!value->immutable);
272
273
620k
  g_free (value->data.v_str);
274
620k
  value->data.v_str = g_strdup (v_str);
275
620k
}
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