xref: /haiku/src/kits/debugger/model/TeamMemory.cpp (revision e81a954787e50e56a7f06f72705b7859b6ab06d1)
1 /*
2  * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "TeamMemory.h"
8 
9 #include <algorithm>
10 
11 #include <OS.h>
12 #include <String.h>
13 
14 
15 TeamMemory::~TeamMemory()
16 {
17 }
18 
19 
20 status_t
21 TeamMemory::ReadMemoryString(target_addr_t address, size_t maxLength,
22 	BString& _string)
23 {
24 	char buffer[B_PAGE_SIZE];
25 
26 	_string.Truncate(0);
27 	while (maxLength > 0) {
28 		// read at max maxLength bytes, but don't read across page bounds
29 		size_t toRead = std::min(maxLength,
30 			B_PAGE_SIZE - size_t(address % B_PAGE_SIZE));
31 		ssize_t bytesRead = ReadMemory(address, buffer, toRead);
32 		if (bytesRead < 0)
33 			return _string.Length() == 0 ? bytesRead : B_OK;
34 
35 		if (bytesRead == 0)
36 			return _string.Length() == 0 ? B_BAD_ADDRESS : B_OK;
37 
38 		// append the bytes read
39 		size_t length = strnlen(buffer, bytesRead);
40 		_string.Append(buffer, length);
41 
42 		// stop at end of string
43 		if (length < (size_t)bytesRead)
44 			return B_OK;
45 
46 		address += bytesRead;
47 		maxLength -= bytesRead;
48 	}
49 
50 	return B_OK;
51 }
52 
53