analyzer: fix feasibility false +ve on jumps through function ptrs [PR107582]
[platform/upstream/gcc.git] / gcc / json.h
1 /* JSON trees
2    Copyright (C) 2017-2022 Free Software Foundation, Inc.
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 float_number;
43   class integer_number;
44   class string;
45   class literal;
46
47 /* An enum for discriminating the subclasses of json::value.  */
48
49 enum kind
50 {
51   /* class json::object.  */
52   JSON_OBJECT,
53
54   /* class json::array.  */
55   JSON_ARRAY,
56
57   /* class json::integer_number.  */
58   JSON_INTEGER,
59
60   /* class json::float_number.  */
61   JSON_FLOAT,
62
63   /* class json::string.  */
64   JSON_STRING,
65
66   /* class json::literal uses these three values to identify the
67      particular literal.  */
68   JSON_TRUE,
69   JSON_FALSE,
70   JSON_NULL
71 };
72
73 /* Base class of JSON value.  */
74
75 class value
76 {
77  public:
78   virtual ~value () {}
79   virtual enum kind get_kind () const = 0;
80   virtual void print (pretty_printer *pp) const = 0;
81
82   void dump (FILE *) const;
83 };
84
85 /* Subclass of value for objects: an unordered collection of
86    key/value pairs.  */
87
88 class object : public value
89 {
90  public:
91   ~object ();
92
93   enum kind get_kind () const final override { return JSON_OBJECT; }
94   void print (pretty_printer *pp) const final override;
95
96   void set (const char *key, value *v);
97   value *get (const char *key) const;
98
99  private:
100   typedef hash_map <char *, value *,
101     simple_hashmap_traits<nofree_string_hash, value *> > map_t;
102   map_t m_map;
103 };
104
105 /* Subclass of value for arrays.  */
106
107 class array : public value
108 {
109  public:
110   ~array ();
111
112   enum kind get_kind () const final override { return JSON_ARRAY; }
113   void print (pretty_printer *pp) const final override;
114
115   void append (value *v);
116
117  private:
118   auto_vec<value *> m_elements;
119 };
120
121 /* Subclass of value for floating-point numbers.  */
122
123 class float_number : public value
124 {
125  public:
126   float_number (double value) : m_value (value) {}
127
128   enum kind get_kind () const final override { return JSON_FLOAT; }
129   void print (pretty_printer *pp) const final override;
130
131   double get () const { return m_value; }
132
133  private:
134   double m_value;
135 };
136
137 /* Subclass of value for integer-valued numbers.  */
138
139 class integer_number : public value
140 {
141  public:
142   integer_number (long value) : m_value (value) {}
143
144   enum kind get_kind () const final override { return JSON_INTEGER; }
145   void print (pretty_printer *pp) const final override;
146
147   long get () const { return m_value; }
148
149  private:
150   long m_value;
151 };
152
153
154 /* Subclass of value for strings.  */
155
156 class string : public value
157 {
158  public:
159   explicit string (const char *utf8);
160   string (const char *utf8, size_t len);
161   ~string () { free (m_utf8); }
162
163   enum kind get_kind () const final override { return JSON_STRING; }
164   void print (pretty_printer *pp) const final override;
165
166   const char *get_string () const { return m_utf8; }
167   size_t get_length () const { return m_len; }
168
169  private:
170   char *m_utf8;
171   size_t m_len;
172 };
173
174 /* Subclass of value for the three JSON literals "true", "false",
175    and "null".  */
176
177 class literal : public value
178 {
179  public:
180   literal (enum kind kind) : m_kind (kind) {}
181
182   /* Construct literal for a boolean value.  */
183   literal (bool value): m_kind (value ? JSON_TRUE : JSON_FALSE) {}
184
185   enum kind get_kind () const final override { return m_kind; }
186   void print (pretty_printer *pp) const final override;
187
188  private:
189   enum kind m_kind;
190 };
191
192 } // namespace json
193
194 #endif  /* GCC_JSON_H  */