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