Index: runtime/vm/json_parser.h |
diff --git a/runtime/vm/json_parser.h b/runtime/vm/json_parser.h |
deleted file mode 100644 |
index 83b9d6b171d68c96087b7b8d59aa5502daa73e3e..0000000000000000000000000000000000000000 |
--- a/runtime/vm/json_parser.h |
+++ /dev/null |
@@ -1,331 +0,0 @@ |
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-#ifndef RUNTIME_VM_JSON_PARSER_H_ |
-#define RUNTIME_VM_JSON_PARSER_H_ |
- |
-#include "vm/allocation.h" |
-#include "vm/zone.h" |
-#include "vm/growable_array.h" |
- |
-namespace dart { |
- |
-class ParsedJSONArray; |
- |
-class ParsedJSONValue : public ZoneAllocated { |
- public: |
- virtual ~ParsedJSONValue() {} |
- |
- virtual bool IsObject() const { return false; } |
- virtual bool IsArray() const { return false; } |
- virtual bool IsString() const { return false; } |
- virtual bool IsNumber() const { return false; } |
- virtual bool IsBoolean() const { return false; } |
- virtual bool IsError() const { return false; } |
-}; |
- |
-class ParsedJSONString : public ParsedJSONValue { |
- public: |
- explicit ParsedJSONString(const char* value) : value_(value) {} |
- bool Equals(const char* other) { return strcmp(value_, other) == 0; } |
- const char* value() { return value_; } |
- virtual bool IsString() const { return true; } |
- |
- private: |
- const char* value_; |
-}; |
- |
-class ParsedJSONNumber : public ParsedJSONValue { |
- public: |
- explicit ParsedJSONNumber(int64_t value) : value_(value) {} |
- |
- int64_t value() { return value_; } |
- virtual bool IsNumber() const { return true; } |
- |
- private: |
- int64_t value_; |
-}; |
- |
-class ParsedJSONBoolean : public ParsedJSONValue { |
- public: |
- explicit ParsedJSONBoolean(bool value) : value_(value) {} |
- |
- bool value() { return value_; } |
- virtual bool IsBoolean() const { return true; } |
- |
- private: |
- bool value_; |
-}; |
- |
-class ParsedJSONNull : public ParsedJSONValue { |
- public: |
- virtual bool IsNull() const { return true; } |
-}; |
- |
-class ParsedJSONObject : public ParsedJSONValue { |
- public: |
- ParsedJSONObject(intptr_t length, ParsedJSONValue** keys_and_values) |
- : length_(length), keys_and_values_(keys_and_values) {} |
- |
- ParsedJSONValue* At(const char* key) const { |
- for (intptr_t i = 0; i < length_; i += 2) { |
- ASSERT(keys_and_values_[i]->IsString()); |
- ParsedJSONString* jskey = |
- static_cast<ParsedJSONString*>(keys_and_values_[i]); |
- if (jskey->Equals(key)) { |
- return keys_and_values_[i + 1]; |
- } |
- } |
- return NULL; |
- } |
- |
- virtual bool IsObject() const { return true; } |
- |
- ParsedJSONNumber* NumberAt(const char* key) { |
- ParsedJSONValue* member = At(key); |
- if ((member == NULL) || !member->IsNumber()) { |
- return NULL; |
- } |
- return static_cast<ParsedJSONNumber*>(member); |
- } |
- |
- ParsedJSONString* StringAt(const char* key) { |
- ParsedJSONValue* member = At(key); |
- if ((member == NULL) || !member->IsString()) { |
- return NULL; |
- } |
- return static_cast<ParsedJSONString*>(member); |
- } |
- |
- ParsedJSONBoolean* BooleanAt(const char* key) { |
- ParsedJSONValue* member = At(key); |
- if ((member == NULL) || !member->IsBoolean()) { |
- return NULL; |
- } |
- return static_cast<ParsedJSONBoolean*>(member); |
- } |
- |
- inline ParsedJSONArray* ArrayAt(const char* key); |
- |
- private: |
- intptr_t length_; |
- ParsedJSONValue** keys_and_values_; |
-}; |
- |
-class ParsedJSONArray : public ParsedJSONValue { |
- public: |
- ParsedJSONArray(intptr_t length, ParsedJSONValue** elements) |
- : length_(length), elements_(elements) {} |
- |
- ParsedJSONValue* At(intptr_t index) const { |
- ASSERT(index < length_); |
- return elements_[index]; |
- } |
- |
- intptr_t Length() const { return length_; } |
- |
- virtual bool IsArray() const { return true; } |
- |
- ParsedJSONObject* ObjectAt(intptr_t index) { |
- ParsedJSONValue* element = At(index); |
- if ((element == NULL) || !element->IsObject()) { |
- return NULL; |
- } |
- return static_cast<ParsedJSONObject*>(element); |
- } |
- |
- ParsedJSONNumber* NumberAt(intptr_t index) { |
- ParsedJSONValue* element = At(index); |
- if ((element == NULL) || !element->IsNumber()) { |
- return NULL; |
- } |
- return static_cast<ParsedJSONNumber*>(element); |
- } |
- |
- private: |
- intptr_t length_; |
- ParsedJSONValue** elements_; |
-}; |
- |
-class ParsedJSONError : public ParsedJSONValue { |
- public: |
- explicit ParsedJSONError(const char* message, intptr_t position) |
- : message_(message), position_(position) {} |
- |
- virtual bool IsError() const { return true; } |
- |
- const char* message() const { return message_; } |
- intptr_t position() const { return position_; } |
- |
- private: |
- const char* message_; |
- intptr_t position_; |
-}; |
- |
-class JSONParser { |
- public: |
- JSONParser(const char* buffer, intptr_t length, Zone* zone) |
- : buffer_(buffer), position_(0), length_(length), zone_(zone) {} |
- |
- ParsedJSONValue* ParseValue() { |
- ConsumeWhitespace(); |
- if (Peek() == '\"') return ParseString(); |
- if (IsDigitOrMinus(Peek())) return ParseNumber(); |
- if (Peek() == '{') return ParseObject(); |
- if (Peek() == '[') return ParseArray(); |
- if (PeekAndConsume("true")) return new (zone_) ParsedJSONBoolean(true); |
- if (PeekAndConsume("false")) return new (zone_) ParsedJSONBoolean(false); |
- if (PeekAndConsume("null")) return new (zone_) ParsedJSONNull(); |
- return Error("value expected"); |
- } |
- |
- private: |
- intptr_t Available() const { return length_ - position_; } |
- char Peek() const { |
- if (position_ < length_) return buffer_[position_]; |
- return 0; |
- } |
- char Consume() { |
- ASSERT(position_ < length_); |
- return buffer_[position_++]; |
- } |
- bool PeekAndConsume(const char* expected) { |
- intptr_t n = strlen(expected); |
- if (Available() < n) return false; |
- if (strncmp(&buffer_[position_], expected, n) != 0) return false; |
- position_ += n; |
- return true; |
- } |
- void ConsumeWhitespace() { |
- while ((Available() > 0) && (buffer_[position_] < ' ')) |
- position_++; |
- } |
- bool IsDigit(char c) { return c >= '0' && c <= '9'; } |
- bool IsDigitOrMinus(char c) { return (c == '-') || (c >= '0' && c <= '9'); } |
- |
- ParsedJSONValue* ParseString() { |
- ConsumeWhitespace(); |
- if (Peek() != '\"') return Error("string expected"); |
- Consume(); |
- intptr_t start = position_; |
- for (;;) { |
- if (Available() == 0) return Error("unterminated string"); |
- if (Consume() == '\"') break; |
- } |
- intptr_t end = position_ - 1; |
- |
- char* cstr = zone_->Alloc<char>(end - start + 1); |
- intptr_t dst_pos = 0; |
- for (intptr_t src_pos = start; src_pos < end; src_pos++) { |
- if (buffer_[src_pos] == '\\') { |
- src_pos++; |
- } |
- cstr[dst_pos++] = buffer_[src_pos]; |
- } |
- cstr[dst_pos] = '\0'; |
- |
- return new (zone_) ParsedJSONString(cstr); |
- } |
- |
- ParsedJSONValue* ParseNumber() { |
- ConsumeWhitespace(); |
- bool negate = false; |
- if (Peek() == '-') { |
- Consume(); |
- negate = true; |
- } |
- if (!IsDigit(Peek())) return Error("number expected"); |
- int64_t value = 0; |
- for (;;) { |
- if (!IsDigit(Peek())) break; |
- char c = Consume(); |
- value *= 10; |
- value += (c - '0'); |
- } |
- if (negate) { |
- value = -value; |
- } |
- return new (zone_) ParsedJSONNumber(value); |
- } |
- |
- ParsedJSONValue* ParseObject() { |
- ConsumeWhitespace(); |
- if (Peek() != '{') return Error("object expected"); |
- Consume(); |
- ConsumeWhitespace(); |
- if (Peek() == '}') return new (zone_) ParsedJSONObject(0, NULL); |
- ZoneGrowableArray<ParsedJSONValue*>* keys_and_values = |
- new (zone_) ZoneGrowableArray<ParsedJSONValue*>(zone_, 6); |
- for (;;) { |
- ParsedJSONValue* key = ParseString(); |
- if (key->IsError()) return key; |
- ConsumeWhitespace(); |
- if (Consume() != ':') return Error(": expected"); |
- ConsumeWhitespace(); |
- ParsedJSONValue* value = ParseValue(); |
- if (value->IsError()) return value; |
- ConsumeWhitespace(); |
- |
- keys_and_values->Add(key); |
- keys_and_values->Add(value); |
- |
- char c = Consume(); |
- if (c == '}') break; |
- if (c != ',') return Error(", expected (object)"); |
- ConsumeWhitespace(); |
- } |
- |
- return new (zone_) |
- ParsedJSONObject(keys_and_values->length(), keys_and_values->data()); |
- } |
- |
- ParsedJSONValue* ParseArray() { |
- ConsumeWhitespace(); |
- if (Peek() != '[') return Error("array expected"); |
- Consume(); |
- ConsumeWhitespace(); |
- if (Peek() == ']') { |
- Consume(); |
- return new (zone_) ParsedJSONArray(0, NULL); |
- } |
- ZoneGrowableArray<ParsedJSONValue*>* elements = |
- new (zone_) ZoneGrowableArray<ParsedJSONValue*>(zone_, 6); |
- for (;;) { |
- ParsedJSONValue* element = ParseValue(); |
- if (element->IsError()) return element; |
- ConsumeWhitespace(); |
- |
- elements->Add(element); |
- |
- char c = Consume(); |
- if (c == ']') break; |
- if (c != ',') return Error(", expected (array)"); |
- ConsumeWhitespace(); |
- } |
- |
- return new (zone_) ParsedJSONArray(elements->length(), elements->data()); |
- } |
- |
- private: |
- ParsedJSONError* Error(const char* message) { |
- return new (zone_) ParsedJSONError(message, position_); |
- } |
- |
- const char* const buffer_; |
- intptr_t position_; |
- intptr_t length_; |
- Zone* zone_; |
-}; |
- |
-ParsedJSONArray* ParsedJSONObject::ArrayAt(const char* key) { |
- ParsedJSONValue* member = At(key); |
- if ((member == NULL) || !member->IsArray()) { |
- return NULL; |
- } |
- return static_cast<ParsedJSONArray*>(member); |
-} |
- |
-} // namespace dart |
- |
-#endif // RUNTIME_VM_JSON_PARSER_H_ |