Files
sdk/runtime/vm/json.h
T
hausner@google.com 84d10e0561 Basic support for reading and writing JSON objects.
This is a minimal implementation that we can grow as needed
for debugger protocols and isolate communication.
Review URL: https://chromiumcodereview.appspot.com//9949054

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@6362 260f80e4-7a28-3924-810f-c04153c831b5
2012-04-10 15:28:07 +00:00

120 lines
2.6 KiB
C++

// Copyright (c) 2012, 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 VM_JSON_H_
#define VM_JSON_H_
#include "vm/allocation.h"
#include "vm/globals.h"
namespace dart {
// A low level interface to tokenize JSON strings.
class JSONScanner : ValueObject {
public:
enum Token {
TokenIllegal = 0,
TokenLBrace,
TokenRBrace,
TokenLBrack,
TokenRBrack,
TokenColon,
TokenComma,
TokenString,
TokenInteger,
TokenTrue,
TokenFalse,
TokenNull,
TokenEOM
};
explicit JSONScanner(const char* json_text);
void SetText(const char* json_text);
void Scan();
Token CurrentToken() const { return token_; }
bool EOM() const { return token_ == TokenEOM; }
const char* TokenChars() const { return token_start_; }
int TokenLen() const { return token_length_; }
bool IsStringLiteral(const char* literal) const;
void Skip(Token matching_token);
private:
bool IsLetter(char ch) const;
bool IsDigit(char ch) const;
bool IsLiteral(const char* literal);
void ScanNumber();
void ScanString();
void Recognize(Token t);
const char* current_pos_;
const char* token_start_;
int token_length_;
Token token_;
};
// JSONReader is a higher level interface that allows for lookup of
// name-value pairs in JSON objects.
class JSONReader : ValueObject {
public:
enum JSONType {
kString,
kInteger,
kObject,
kArray,
kLiteral,
kNone
};
explicit JSONReader(const char* json_object);
void Set(const char* json_object);
// Returns true if a pair with the given name was found.
bool Seek(const char* name);
// Returns true if a syntax error was found.
bool Error() const { return error_; }
JSONType Type() const;
const char* ValueChars() const {
return (Type() != kNone) ? scanner_.TokenChars() : NULL;
}
int ValueLen() const {
return (Type() != kNone) ? scanner_.TokenLen() : 0;
}
bool IsStringLiteral(const char* literal) const {
return scanner_.IsStringLiteral(literal);
}
private:
JSONScanner scanner_;
const char* json_object_;
bool error_;
};
// TextBuffer maintains a dynamic character buffer with a printf-style way to
// append text.
class TextBuffer : ValueObject {
public:
explicit TextBuffer(intptr_t buf_size);
~TextBuffer();
intptr_t Printf(const char* format, ...);
void Clear();
char* buf() { return buf_; }
private:
void GrowBuffer(intptr_t len);
char* buf_;
intptr_t buf_size_;
intptr_t msg_len_;
};
} // namespace dart
#endif // VM_JSON_H_