/*******************************************************************************
* Copyright (c) 2010 CodeSourcery and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Vladimir Prus (CodeSourcery) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.command.output;
import org.eclipse.debug.core.model.MemoryByte;
/**
* Example output is:
*
* (gdb)
* -data-read-memory-bytes &a 10
* ^done,memory=[{begin="0xbffff154",offset="0x00000000",
* end="0xbffff15e",
* contents="01000000020000000300"}]
* @since 4.0
*/
public class MIDataReadMemoryBytesInfo extends MIInfo {
/* The cached memory block. */
private MemoryByte[] fBlock = null;
public MIDataReadMemoryBytesInfo(MIOutput output, int size) {
super(output);
parse(size);
}
/**
* Return the memory block
*/
public MemoryByte[] getMIMemoryBlock() {
return fBlock;
}
private void parse(int size)
{
fBlock = new MemoryByte[size];
// Fill the block with invalid bytes, initially.
for (int i = 0; i < size; i++)
fBlock[i] = new MemoryByte((byte) 0, (byte) 0);
MIResult[] results = getMIOutput().getMIResultRecord().getMIResults();
for (int i = 0; i < results.length; i++) {
if (results[i].getVariable().equals("memory")) //$NON-NLS-1$
{
MIList v = (MIList) (results[i].getMIValue());
try {
for (int j = 0; j < v.getMIValues().length; ++j) {
MITuple b = (MITuple) (v.getMIValues()[j]);
int offset = 0;
String contents = ""; //$NON-NLS-1$
for (int k = 0; k < b.getMIResults().length; ++k) {
MIResult r = b.getMIResults()[k];
if (r.getVariable().equals("offset")) //$NON-NLS-1$
{
String offset_s = ((MIConst) r.getMIValue())
.getCString();
offset = Integer.decode(offset_s);
} else if (r.getVariable().equals("contents")) //$NON-NLS-1$
{
contents = ((MIConst) r.getMIValue()).getCString();
}
}
if (offset + contents.length()/2 <= size)
for (int k = 0; k < contents.length() / 2; ++k) {
fBlock[offset + k] = new MemoryByte(
(byte) Integer.parseInt(
contents.substring(k * 2, k * 2 + 2),
16));
}
}
}
catch(NumberFormatException e)
{
// Something went wrong. Stop processing this memory range.
}
}
}
}
}