Coverage Report

Created: 2025-11-02 06:51

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