From c4a5ca932271febad63aad542e67f49ee0829a3c Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 15 Oct 2009 04:34:59 +0000 Subject: [PATCH] Added ReadMemoryString(), reading a string from the team's memory. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33589 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/debugger/model/TeamMemory.cpp | 43 ++++++++++++++++++++++++++ src/apps/debugger/model/TeamMemory.h | 6 ++++ 2 files changed, 49 insertions(+) diff --git a/src/apps/debugger/model/TeamMemory.cpp b/src/apps/debugger/model/TeamMemory.cpp index e46e31e115..fca7143898 100644 --- a/src/apps/debugger/model/TeamMemory.cpp +++ b/src/apps/debugger/model/TeamMemory.cpp @@ -3,9 +3,52 @@ * Distributed under the terms of the MIT License. */ + #include "TeamMemory.h" +#include + +#include +#include + TeamMemory::~TeamMemory() { } + + +status_t +TeamMemory::ReadMemoryString(target_addr_t address, size_t maxLength, + BString& _string) +{ + char buffer[B_PAGE_SIZE]; + + BString string; + + while (maxLength > 0) { + // read at max maxLength bytes, but don't read across page bounds + size_t toRead = std::min(maxLength, + B_PAGE_SIZE - size_t(address % B_PAGE_SIZE)); + + ssize_t bytesRead = ReadMemory(address, buffer, toRead); + if (bytesRead < 0) + return string.Length() == 0 ? bytesRead : B_OK; + + if (bytesRead == 0) + return string.Length() == 0 ? B_BAD_ADDRESS : B_OK; + + // append the bytes read + size_t length = strnlen(buffer, bytesRead); + string.Append(buffer, length); + + // stop at end of string + if (length < (size_t)bytesRead) + return B_OK; + + address += bytesRead; + maxLength -= bytesRead; + } + + return B_OK; +} + diff --git a/src/apps/debugger/model/TeamMemory.h b/src/apps/debugger/model/TeamMemory.h index 75d5e05707..a945a54577 100644 --- a/src/apps/debugger/model/TeamMemory.h +++ b/src/apps/debugger/model/TeamMemory.h @@ -5,9 +5,13 @@ #ifndef TEAM_MEMORY_H #define TEAM_MEMORY_H + #include "TargetAddressRange.h" +class BString; + + class TeamMemory { public: virtual ~TeamMemory(); @@ -15,6 +19,8 @@ public: virtual ssize_t ReadMemory(target_addr_t address, void* buffer, size_t size) = 0; + virtual status_t ReadMemoryString(target_addr_t address, + size_t maxLength, BString& _string); };