1 /* JSON trees 2 Copyright (C) 2017-2020 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: ~value()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 get_kind()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 get_kind()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: float_number(double value)126 float_number (double value) : m_value (value) {} 127 get_kind()128 enum kind get_kind () const FINAL OVERRIDE { return JSON_FLOAT; } 129 void print (pretty_printer *pp) const FINAL OVERRIDE; 130 get()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: integer_number(long value)142 integer_number (long value) : m_value (value) {} 143 get_kind()144 enum kind get_kind () const FINAL OVERRIDE { return JSON_INTEGER; } 145 void print (pretty_printer *pp) const FINAL OVERRIDE; 146 get()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 string (const char *utf8); ~string()160 ~string () { free (m_utf8); } 161 get_kind()162 enum kind get_kind () const FINAL OVERRIDE { return JSON_STRING; } 163 void print (pretty_printer *pp) const FINAL OVERRIDE; 164 get_string()165 const char *get_string () const { return m_utf8; } 166 167 private: 168 char *m_utf8; 169 }; 170 171 /* Subclass of value for the three JSON literals "true", "false", 172 and "null". */ 173 174 class literal : public value 175 { 176 public: literal(enum kind kind)177 literal (enum kind kind) : m_kind (kind) {} 178 179 /* Construct literal for a boolean value. */ literal(bool value)180 literal (bool value): m_kind (value ? JSON_TRUE : JSON_FALSE) {} 181 get_kind()182 enum kind get_kind () const FINAL OVERRIDE { return m_kind; } 183 void print (pretty_printer *pp) const FINAL OVERRIDE; 184 185 private: 186 enum kind m_kind; 187 }; 188 189 } // namespace json 190 191 #endif /* GCC_JSON_H */ 192