File: json_object_private.h

package info (click to toggle)
libfastjson 0.99.9-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, sid
  • size: 2,144 kB
  • sloc: sh: 4,486; ansic: 4,453; makefile: 116
file content (97 lines) | stat: -rw-r--r-- 2,042 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
 * Michael Clark <michael@metaparadigm.com>
 * Copyright (c) 2015 Rainer Gerhards
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the MIT license. See COPYING for details.
 *
 */

#ifndef _fj_json_object_private_h_
#define _fj_json_object_private_h_

#include "atomic.h"

#ifdef __cplusplus
extern "C" {
#endif

/* define a couple of attributes to improve cross-platform builds */
#if __GNUC__ > 6
	#define ATTR_FALLTHROUGH __attribute__((fallthrough));
#else
	#define ATTR_FALLTHROUGH
#endif

#define LEN_DIRECT_STRING_DATA 32 /**< how many bytes are directly stored in fjson_object for strings? */

/**
 *  Type of the delete and serialization functions.
 */
typedef void (fjson_object_private_delete_fn)(struct fjson_object *o);
typedef int (fjson_object_to_json_string_fn)(struct fjson_object *jso,
						struct printbuf *pb,
						int level,
						int flags);

struct _fjson_child {
	/**
	 * The key.
	 */
	const char *k;
	int k_is_constant;
	struct {
		unsigned k_is_constant : 1;
	} flags;
	/**
	 * The value.
	 */
	struct fjson_object *v;
};

struct _fjson_child_pg {
	struct _fjson_child children[FJSON_OBJECT_CHLD_PG_SIZE];
	struct _fjson_child_pg *next;
};

struct fjson_object
{
	enum fjson_type o_type;
	fjson_object_private_delete_fn *_delete;
	fjson_object_to_json_string_fn *_to_json_string;
	int _ref_count;
	struct printbuf *_pb;
	union data {
		fjson_bool c_boolean;
		struct {
			double value;
			char *source;
		} c_double;
		int64_t c_int64;
		struct {
			int nelem;
			int ndeleted;
			struct _fjson_child_pg pg;
			struct _fjson_child_pg *lastpg;
		} c_obj;
		struct array_list *c_array;
		struct {
			union {
			/* optimize: if we have small strings, we can store them
			 * directly. This saves considerable CPU cycles AND memory.
			 */
			char *ptr;
			char data[LEN_DIRECT_STRING_DATA];
			} str;
		int len;
		} c_string;
	} o;
	DEF_ATOMIC_HELPER_MUT(_mut_ref_count)
};

#ifdef __cplusplus
}
#endif

#endif