gcc/libjava/gnu/gcj/tools/gc_analyze/BytePtr.java

116 lines
2.4 KiB
Java

/* BytePtr.java -- Container for bytes from a memory image.
Copyright (C) 2007 Free Software Foundation
This file is part of libgcj.
This software is copyrighted work licensed under the terms of the
Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
details. */
package gnu.gcj.tools.gc_analyze;
import java.nio.ByteBuffer;
public class BytePtr
{
ByteBuffer content;
int wordSize;
BytePtr(ByteBuffer b, int ws)
{
content = b;
wordSize = ws;
}
public int getsize()
{
return content.limit();
}
public int getByte(int offset)
{
return content.get(offset);
}
public int getInt(int n)
{
return content.getInt(n * 4);
}
public int getShort(int n)
{
return content.getShort(n * 2);
}
public long getWord(int n)
{
if (4 == wordSize)
return 0xffffffffL & content.getInt(n * 4);
else
return content.getLong(n * 8);
}
public int intsPerWord()
{
return (4 == wordSize) ? 1 : 2;
}
public BytePtr getRegion(int offset, int size)
{
int oldLimit = content.limit();
content.position(offset);
content.limit(offset + size);
ByteBuffer n = content.slice();
content.position(0);
content.limit(oldLimit);
return new BytePtr(n, wordSize);
}
public void setInt(int a, int n)
{
content.putInt(a * 4, n);
}
public void dump()
{
// 38 5a f4 2a 50 bd 04 10 10 00 00 00 0e 00 00 00 8Z.*P...........
int i;
StringBuilder b = new StringBuilder(67);
for (i = 0; i < 66; i++)
b.append(' ');
b.append('\n');
i = 0;
do
{
for (int j = 0; j < 16; j++)
{
int k = i + j;
if (k < content.limit())
{
int v = 0xff & getByte(k);
// hex
int v1 = v/16;
b.setCharAt(j * 3 + 0,
(char)(v1 >= 10 ? 'a' - 10 + v1 : v1 + '0'));
v1 = v % 16;
b.setCharAt(j * 3 + 1,
(char)(v1 >= 10 ? 'a' - 10 + v1 : v1 + '0'));
// ascii
b.setCharAt(j + 50, (char)((v >= 32 && v <= 127) ? v: '.'));
}
else
{
b.setCharAt(j * 3 + 0, ' ');
b.setCharAt(j * 3 + 1, ' ');
b.setCharAt(j + 50, ' ');
}
}
i += 16;
System.out.print(b);
} while (i < content.limit());
}
}