| /* 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()); |
| } |
| } |