1 /* JSON trees 2 Copyright (C) 2017-2019 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 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 110 void append (value *v); 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: 137 string (const char *utf8); 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 157 /* Construct literal for a boolean value. */ 158 literal (bool value): m_kind (value ? JSON_TRUE : JSON_FALSE) {} 159 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 */ 170