1/* 2 * Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2002-2010, Axel D��rfler, axeld@pinc-software.de. 4 * Copyright 2012-2016, Rene Gollent, rene@gollent.com. 5 * Distributed under the terms of the MIT License. 6 * 7 * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. 8 * Distributed under the terms of the NewOS License. 9 */ 10 11 12#include "CliDumpStringCommand.h" 13 14#include <ctype.h> 15#include <stdio.h> 16 17#include <AutoLocker.h> 18 19#include "CliContext.h" 20#include "CppLanguage.h" 21#include "Team.h" 22#include "TeamMemoryBlock.h" 23#include "UiUtils.h" 24#include "UserInterface.h" 25#include "Value.h" 26#include "Variable.h" 27 28 29CliDumpStringCommand::CliDumpStringCommand() 30 : 31 CliCommand("dump contents of a string in the debugged team's memory", 32 "%s [\"]address|expression[\"]\n" 33 "Reads and displays the contents of a null-terminated string at the target address.") 34{ 35 // TODO: this should be retrieved via some indirect helper rather 36 // than instantiating the specific language directly. 37 fLanguage = new(std::nothrow) CppLanguage(); 38} 39 40 41CliDumpStringCommand::~CliDumpStringCommand() 42{ 43 if (fLanguage != NULL) 44 fLanguage->ReleaseReference(); 45} 46 47 48void 49CliDumpStringCommand::Execute(int argc, const char* const* argv, 50 CliContext& context) 51{ 52 if (argc < 2) { 53 PrintUsage(argv[0]); 54 return; 55 } 56 57 if (fLanguage == NULL) { 58 printf("Unable to evaluate expression: %s\n", strerror(B_NO_MEMORY)); 59 return; 60 } 61 62 target_addr_t address; 63 if (context.EvaluateExpression(argv[1], fLanguage, address) != B_OK) 64 return; 65 66 TeamMemoryBlock* block = NULL; 67 if (context.GetMemoryBlock(address, block) != B_OK) 68 return; 69 70 printf("%p \"", (char*)address); 71 72 target_addr_t offset = address; 73 char c; 74 while (block->Contains(offset)) { 75 c = *(block->Data() + offset - block->BaseAddress()); 76 77 if (c == '\0') 78 break; 79 if (c == '\n') 80 printf("\\n"); 81 else if (c == '\t') 82 printf("\\t"); 83 else { 84 if (!isprint(c)) 85 c = '.'; 86 87 printf("%c", c); 88 } 89 ++offset; 90 } 91 92 printf("\"\n"); 93} 94