annotate gcc/json.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* JSON trees
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2017-2020 Free Software Foundation, Inc.
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 This file is part of GCC.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 version.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 for more details.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 #ifndef GCC_JSON_H
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 #define GCC_JSON_H
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 /* Implementation of JSON, a lightweight data-interchange format.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 See http://www.json.org/
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 and http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 and https://tools.ietf.org/html/rfc7159
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 Supports creating a DOM-like tree of json::value *, and then dumping
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 json::value * to text. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 namespace json
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 /* Forward decls of json::value and its subclasses (using indentation
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 to denote inheritance. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 class value;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 class object;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 class array;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
42 class float_number;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
43 class integer_number;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 class string;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 class literal;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 /* An enum for discriminating the subclasses of json::value. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 enum kind
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 /* class json::object. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 JSON_OBJECT,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 /* class json::array. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 JSON_ARRAY,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
57 /* class json::integer_number. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 JSON_INTEGER,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 /* class json::float_number. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61 JSON_FLOAT,
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 /* class json::string. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 JSON_STRING,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 /* class json::literal uses these three values to identify the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 particular literal. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 JSON_TRUE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 JSON_FALSE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 JSON_NULL
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 /* Base class of JSON value. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 class value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 virtual ~value () {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 virtual enum kind get_kind () const = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 virtual void print (pretty_printer *pp) const = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 void dump (FILE *) const;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 /* Subclass of value for objects: an unordered collection of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 key/value pairs. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 class object : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 ~object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 enum kind get_kind () const FINAL OVERRIDE { return JSON_OBJECT; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 void set (const char *key, value *v);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
97 value *get (const char *key) const;
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 typedef hash_map <char *, value *,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 simple_hashmap_traits<nofree_string_hash, value *> > map_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 map_t m_map;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 /* Subclass of value for arrays. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 class array : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 ~array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 enum kind get_kind () const FINAL OVERRIDE { return JSON_ARRAY; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 void append (value *v);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 auto_vec<value *> m_elements;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
121 /* Subclass of value for floating-point numbers. */
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
123 class float_number : public value
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 public:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126 float_number (double value) : m_value (value) {}
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
128 enum kind get_kind () const FINAL OVERRIDE { return JSON_FLOAT; }
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 double get () const { return m_value; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 double m_value;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
137 /* Subclass of value for integer-valued numbers. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
139 class integer_number : public value
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
141 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
142 integer_number (long value) : m_value (value) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
143
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
144 enum kind get_kind () const FINAL OVERRIDE { return JSON_INTEGER; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
145 void print (pretty_printer *pp) const FINAL OVERRIDE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
146
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
147 long get () const { return m_value; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
148
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
149 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
150 long m_value;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
151 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
152
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
153
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 /* Subclass of value for strings. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 class string : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 string (const char *utf8);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 ~string () { free (m_utf8); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 enum kind get_kind () const FINAL OVERRIDE { return JSON_STRING; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 const char *get_string () const { return m_utf8; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168 char *m_utf8;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 /* Subclass of value for the three JSON literals "true", "false",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 and "null". */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 class literal : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 literal (enum kind kind) : m_kind (kind) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
179 /* Construct literal for a boolean value. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
180 literal (bool value): m_kind (value ? JSON_TRUE : JSON_FALSE) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 enum kind get_kind () const FINAL OVERRIDE { return m_kind; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 enum kind m_kind;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189 } // namespace json
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 #endif /* GCC_JSON_H */