1f678e45dSDimitry Andric //===-- StreamGDBRemote.cpp -------------------------------------*- C++ -*-===//
2f678e45dSDimitry Andric //
3f678e45dSDimitry Andric //                     The LLVM Compiler Infrastructure
4f678e45dSDimitry Andric //
5f678e45dSDimitry Andric // This file is distributed under the University of Illinois Open Source
6f678e45dSDimitry Andric // License. See LICENSE.TXT for details.
7f678e45dSDimitry Andric //
8f678e45dSDimitry Andric //===----------------------------------------------------------------------===//
9f678e45dSDimitry Andric 
10f678e45dSDimitry Andric #include "lldb/Utility/StreamGDBRemote.h"
11f678e45dSDimitry Andric 
12*b5893f02SDimitry Andric #include "lldb/Utility/Flags.h"
13*b5893f02SDimitry Andric #include "lldb/Utility/Stream.h"
14f678e45dSDimitry Andric 
15f678e45dSDimitry Andric #include <stdio.h>
16f678e45dSDimitry Andric 
17f678e45dSDimitry Andric using namespace lldb;
18f678e45dSDimitry Andric using namespace lldb_private;
19f678e45dSDimitry Andric 
StreamGDBRemote()20f678e45dSDimitry Andric StreamGDBRemote::StreamGDBRemote() : StreamString() {}
21f678e45dSDimitry Andric 
StreamGDBRemote(uint32_t flags,uint32_t addr_size,ByteOrder byte_order)22f678e45dSDimitry Andric StreamGDBRemote::StreamGDBRemote(uint32_t flags, uint32_t addr_size,
23f678e45dSDimitry Andric                                  ByteOrder byte_order)
24f678e45dSDimitry Andric     : StreamString(flags, addr_size, byte_order) {}
25f678e45dSDimitry Andric 
~StreamGDBRemote()26f678e45dSDimitry Andric StreamGDBRemote::~StreamGDBRemote() {}
27f678e45dSDimitry Andric 
PutEscapedBytes(const void * s,size_t src_len)28f678e45dSDimitry Andric int StreamGDBRemote::PutEscapedBytes(const void *s, size_t src_len) {
29f678e45dSDimitry Andric   int bytes_written = 0;
30f678e45dSDimitry Andric   const uint8_t *src = (const uint8_t *)s;
31f678e45dSDimitry Andric   bool binary_is_set = m_flags.Test(eBinary);
32f678e45dSDimitry Andric   m_flags.Clear(eBinary);
33f678e45dSDimitry Andric   while (src_len) {
34f678e45dSDimitry Andric     uint8_t byte = *src;
35f678e45dSDimitry Andric     src++;
36f678e45dSDimitry Andric     src_len--;
37f678e45dSDimitry Andric     if (byte == 0x23 || byte == 0x24 || byte == 0x7d || byte == 0x2a) {
38f678e45dSDimitry Andric       bytes_written += PutChar(0x7d);
39f678e45dSDimitry Andric       byte ^= 0x20;
40f678e45dSDimitry Andric     }
41f678e45dSDimitry Andric     bytes_written += PutChar(byte);
42f678e45dSDimitry Andric   };
43f678e45dSDimitry Andric   if (binary_is_set)
44f678e45dSDimitry Andric     m_flags.Set(eBinary);
45f678e45dSDimitry Andric   return bytes_written;
46f678e45dSDimitry Andric }
47