Index: runtime/vm/json_stream.cc |
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1749cff98c68412a0e161ab3f72f7674ff6dc3a6 |
--- /dev/null |
+++ b/runtime/vm/json_stream.cc |
@@ -0,0 +1,135 @@ |
+// Copyright (c) 2013, 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. |
+ |
+#include "platform/assert.h" |
+#include "vm/json_stream.h" |
+ |
+ |
+namespace dart { |
+ |
+JSONStream::JSONStream(TextBuffer* buffer) { |
+ ASSERT(buffer != NULL); |
+ buffer_ = buffer; |
+ open_objects_ = 0; |
+} |
+ |
+ |
+JSONStream::~JSONStream() { |
+} |
+ |
+ |
+void JSONStream::Clear() { |
+ buffer_->Clear(); |
+ open_objects_ = 0; |
+} |
+ |
+ |
+void JSONStream::OpenObject(const char* property_name) { |
+ PrintCommaIfNeeded(); |
+ open_objects_++; |
+ if (property_name != NULL) { |
+ PrintPropertyName(property_name); |
+ } |
+ buffer_->AddChar('{'); |
+} |
+ |
+ |
+void JSONStream::CloseObject() { |
+ ASSERT(open_objects_ > 0); |
+ open_objects_--; |
+ buffer_->AddChar('}'); |
+} |
+ |
+ |
+void JSONStream::OpenArray(const char* property_name) { |
+ PrintCommaIfNeeded(); |
+ if (property_name != NULL) { |
+ PrintPropertyName(property_name); |
+ } |
+ open_objects_++; |
+ buffer_->AddChar('['); |
+} |
+ |
+ |
+void JSONStream::CloseArray() { |
+ ASSERT(open_objects_ > 0); |
+ open_objects_--; |
+ buffer_->AddChar(']'); |
+} |
+ |
+ |
+void JSONStream::PrintValueBool(bool b) { |
+ PrintCommaIfNeeded(); |
+ buffer_->Printf("%s", b ? "true" : "false"); |
+} |
+ |
+ |
+void JSONStream::PrintValue(intptr_t i) { |
+ PrintCommaIfNeeded(); |
+ buffer_->Printf("%"Pd"", i); |
+} |
+ |
+ |
+void JSONStream::PrintValue(double d) { |
+ PrintCommaIfNeeded(); |
+ buffer_->Printf("%f", d); |
+} |
+ |
+ |
+void JSONStream::PrintValue(const char* s) { |
+ PrintCommaIfNeeded(); |
+ buffer_->Printf("\"%s\"", s); |
+} |
+ |
+ |
+void JSONStream::PrintPropertyBool(const char* name, bool b) { |
+ PrintPropertyName(name); |
+ PrintValueBool(b); |
+} |
+ |
+ |
+void JSONStream::PrintProperty(const char* name, intptr_t i) { |
+ PrintPropertyName(name); |
+ PrintValue(i); |
+} |
+ |
+ |
+void JSONStream::PrintProperty(const char* name, double d) { |
+ PrintPropertyName(name); |
+ PrintValue(d); |
+} |
+ |
+ |
+void JSONStream::PrintProperty(const char* name, const char* s) { |
+ PrintPropertyName(name); |
+ PrintValue(s); |
+} |
+ |
+ |
+void JSONStream::PrintPropertyName(const char* name) { |
+ ASSERT(name != NULL); |
+ PrintCommaIfNeeded(); |
+ buffer_->Printf("\"%s\":", name); |
+} |
+ |
+ |
+void JSONStream::PrintCommaIfNeeded() { |
+ if (NeedComma()) { |
+ buffer_->AddChar(','); |
+ } |
+} |
+ |
+ |
+bool JSONStream::NeedComma() { |
+ const char* buffer = buffer_->buf(); |
+ intptr_t length = buffer_->length(); |
+ if (length == 0) { |
+ return false; |
+ } |
+ char ch = buffer[length-1]; |
+ return ch != '[' && ch != '{' && ch != ':' && ch != ','; |
+} |
+ |
+} // namespace dart |
+ |