annotate gcc/json.h @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
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
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 Copyright (C) 2017-2018 Free Software Foundation, Inc.
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;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 class number;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 class string;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 class literal;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 /* An enum for discriminating the subclasses of json::value. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 enum kind
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 /* class json::object. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 JSON_OBJECT,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 /* class json::array. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 JSON_ARRAY,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 /* class json::number. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 JSON_NUMBER,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 /* class json::string. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 JSON_STRING,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 /* class json::literal uses these three values to identify the
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 particular literal. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 JSON_TRUE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 JSON_FALSE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 JSON_NULL
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 /* Base class of JSON value. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 class value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 virtual ~value () {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 virtual enum kind get_kind () const = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 virtual void print (pretty_printer *pp) const = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 void dump (FILE *) const;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 /* Subclass of value for objects: an unordered collection of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 key/value pairs. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 class object : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 ~object ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 enum kind get_kind () const FINAL OVERRIDE { return JSON_OBJECT; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 void set (const char *key, value *v);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 typedef hash_map <char *, value *,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 simple_hashmap_traits<nofree_string_hash, value *> > map_t;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 map_t m_map;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 /* Subclass of value for arrays. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 class array : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 ~array ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 enum kind get_kind () const FINAL OVERRIDE { return JSON_ARRAY; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 void append (value *v);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 auto_vec<value *> m_elements;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 /* Subclass of value for numbers. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 class number : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 number (double value) : m_value (value) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 enum kind get_kind () const FINAL OVERRIDE { return JSON_NUMBER; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 double get () const { return m_value; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 double m_value;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 /* Subclass of value for strings. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 class string : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 string (const char *utf8);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 ~string () { free (m_utf8); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 enum kind get_kind () const FINAL OVERRIDE { return JSON_STRING; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 const char *get_string () const { return m_utf8; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 char *m_utf8;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 /* Subclass of value for the three JSON literals "true", "false",
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 and "null". */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 class literal : public value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 literal (enum kind kind) : m_kind (kind) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 enum kind get_kind () const FINAL OVERRIDE { return m_kind; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 void print (pretty_printer *pp) const FINAL OVERRIDE;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 enum kind m_kind;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 } // namespace json
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 #endif /* GCC_JSON_H */