1/*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_VM_UTILITIES_JSON_HPP
26#define SHARE_VM_UTILITIES_JSON_HPP
27
28#include "memory/allocation.hpp"
29#include "utilities/globalDefinitions.hpp"
30#include "utilities/ostream.hpp"
31
32class JSON : public ResourceObj {
33 protected:
34  JSON(const char* text, bool silent, outputStream* st);
35  void parse();
36  bool valid();
37
38  typedef enum {
39    JSON_NONE,
40    JSON_OBJECT_BEGIN,
41    JSON_OBJECT_END,
42    JSON_ARRAY_BEGIN,
43    JSON_ARRAY_END,
44    JSON_KEY,
45    JSON_STRING,
46    JSON_NUMBER_INT,
47    JSON_NUMBER_FLOAT,
48    JSON_TRUE,
49    JSON_FALSE,
50    JSON_NULL
51  } JSON_TYPE;
52
53  typedef union {
54    int64_t int_value;
55    uint64_t uint_value;
56    double double_value;
57
58    struct {
59      const char* start;
60      size_t length;
61    } str;
62  } JSON_VAL;
63
64  typedef enum {
65    INTERNAL_ERROR,
66    SYNTAX_ERROR,
67    KEY_ERROR,
68    VALUE_ERROR
69  } JSON_ERROR;
70
71  void error(JSON_ERROR e, const char* format, ...) ATTRIBUTE_PRINTF(3, 4);
72  outputStream* _st;
73
74 private:
75  const char* start;
76  const char* pos;
77
78  // For error printing
79  const char* mark; // Error marker
80  uint level;
81  uint line;
82  uint column;
83
84  bool silent;
85  bool _valid;
86
87  bool parse_json_value();
88  bool parse_json_object();
89  bool parse_json_array();
90  bool parse_json_string(bool key = false);
91  bool parse_json_key();
92  bool parse_json_number();
93  bool parse_json_symbol(const char* name, JSON_TYPE symbol);
94
95  virtual bool callback(JSON_TYPE t, JSON_VAL* v, uint level) = 0;
96
97  void mark_pos();
98  u_char next();
99  u_char peek();
100  u_char peek(size_t i);
101  int expect_any(const char* valid_chars, const char* error_msg, JSON_ERROR e = SYNTAX_ERROR);
102  bool expect_string(const char* expected_string, const char* error_msg = "", JSON_ERROR e = SYNTAX_ERROR);
103  size_t skip(size_t i);
104  int skip_to_token();
105  u_char skip_to(u_char want);
106  u_char skip_line_comment();
107  int skip_block_comment();
108
109  const char* strerror(JSON_ERROR e);
110};
111
112#endif // SHARE_VM_UTILITIES_JSON_HPP
113