| Index: experimental/windows_debugger/debugger/rsp/rsp_packetizer.cc
|
| diff --git a/experimental/windows_debugger/debugger/rsp/rsp_packetizer.cc b/experimental/windows_debugger/debugger/rsp/rsp_packetizer.cc
|
| deleted file mode 100644
|
| index cd7ad7f308347b4426680c65a273ca0944a84b56..0000000000000000000000000000000000000000
|
| --- a/experimental/windows_debugger/debugger/rsp/rsp_packetizer.cc
|
| +++ /dev/null
|
| @@ -1,160 +0,0 @@
|
| -// Copyright 2011 The Native Client SDK Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can
|
| -// be found in the LICENSE file.
|
| -
|
| -#include "debugger/rsp/rsp_packetizer.h"
|
| -
|
| -// Description of GDB RSP protocol:
|
| -// http://sources.redhat.com/gdb/current/onlinedocs/gdb.html#Remote-Protocol
|
| -
|
| -namespace {
|
| -const int kMaxCharValue = 126;
|
| -const int kEscapeXor = 0x20;
|
| -} // namespace
|
| -
|
| -namespace rsp {
|
| -
|
| -Packetizer::Packetizer()
|
| - : state_(IDLE),
|
| - consumer_(NULL),
|
| - calculated_checksum_(0),
|
| - recv_checksum_(0) {
|
| - Reset();
|
| -}
|
| -
|
| -Packetizer::~Packetizer() {
|
| -}
|
| -
|
| -void Packetizer::SetPacketConsumer(PacketConsumer* consumer) {
|
| - consumer_ = consumer;
|
| -}
|
| -
|
| -void Packetizer::Reset() {
|
| - state_ = IDLE;
|
| - body_.Clear();
|
| - calculated_checksum_ = 0;
|
| - recv_checksum_ = 0;
|
| -}
|
| -
|
| -bool Packetizer::IsIdle() const {
|
| - return (state_ == IDLE);
|
| -}
|
| -
|
| -void Packetizer::OnData(const debug::Blob& data) {
|
| - for (size_t i = 0; i < data.size(); i++)
|
| - OnChar(data[i]);
|
| -}
|
| -
|
| -void Packetizer::OnData(const char* data_str) {
|
| - OnData(data_str, strlen(data_str));
|
| -}
|
| -
|
| -void Packetizer::OnData(const void* data, size_t data_length) {
|
| - const unsigned char* cdata = static_cast<const unsigned char*>(data);
|
| - if (NULL == data)
|
| - return;
|
| - for (size_t i = 0; i < data_length; i++) {
|
| - unsigned char c = *cdata++;
|
| - OnChar(c);
|
| - }
|
| -}
|
| -
|
| -void Packetizer::OnChar(unsigned char c) {
|
| - if (NULL == consumer_)
|
| - return;
|
| -
|
| - if (((BODY == state_) && ('#' != c)) ||
|
| - (ESCAPE == state_) || (RUNLEN == state_))
|
| - AddToChecksum(c);
|
| -
|
| - switch (state_) {
|
| - case IDLE: {
|
| - if (('+' == c) || ('-' == c))
|
| - return;
|
| - if ('$' == c)
|
| - state_ = BODY;
|
| - else if (3 == c) // RSP is using Ctrl-C as a break message.
|
| - consumer_->OnBreak();
|
| - else
|
| - consumer_->OnUnexpectedChar(c);
|
| - break;
|
| - }
|
| - case BODY: {
|
| - if ('}' == c)
|
| - state_ = ESCAPE;
|
| - else if ('#' == c)
|
| - state_ = END;
|
| - else if ('*' == c)
|
| - state_ = RUNLEN;
|
| - else if (c > kMaxCharValue)
|
| - consumer_->OnUnexpectedChar(c);
|
| - else
|
| - AddCharToBody(c);
|
| - break;
|
| - }
|
| - case ESCAPE: {
|
| - c = c ^ kEscapeXor;
|
| - AddCharToBody(c);
|
| - state_ = BODY;
|
| - break;
|
| - }
|
| - case RUNLEN: {
|
| - int n = c - 29;
|
| - AddRepeatedChars(n);
|
| - state_ = BODY;
|
| - break;
|
| - }
|
| - case END: {
|
| - if (HexCharToint(c, &recv_checksum_)) {
|
| - recv_checksum_ <<= 4;
|
| - state_ = CHECKSUM;
|
| - }
|
| - break;
|
| - }
|
| - case CHECKSUM: {
|
| - unsigned int digit = 0;
|
| - if (HexCharToint(c, &digit)) {
|
| - recv_checksum_ += digit;
|
| - bool checksum_valid = (recv_checksum_ == calculated_checksum_);
|
| - consumer_->OnPacket(body_, checksum_valid);
|
| - Reset();
|
| - }
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void Packetizer::AddToChecksum(unsigned char c) {
|
| - calculated_checksum_ += c;
|
| - calculated_checksum_ %= 256;
|
| -}
|
| -
|
| -void Packetizer::AddCharToBody(unsigned char c) {
|
| - body_.PushBack(c);
|
| -}
|
| -
|
| -void Packetizer::AddRepeatedChars(size_t n) {
|
| - size_t len = body_.size();
|
| - if (0 != len) {
|
| - char c = body_[len - 1];
|
| - for (size_t i = 0; i < n; i++)
|
| - AddCharToBody(c);
|
| - }
|
| -}
|
| -
|
| -bool Packetizer::HexCharToint(unsigned char c, unsigned int* result) {
|
| - if (('0' <= c) && ('9' >= c)) {
|
| - *result = c - '0';
|
| - } else if (('A' <= c) && ('F' >= c)) {
|
| - *result = c - 'A' + 10;
|
| - } else if (('a' <= c) && ('f' >= c)) {
|
| - *result = c - 'a' + 10;
|
| - } else {
|
| - consumer_->OnUnexpectedChar(c);
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -} // namespace rsp
|
| -
|
|
|