blob: 1485286c59dc20af2175610871e5d704497b72e0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.util;
/**
* Abstract class that defines helpers methods for decoding .class file.
*/
public abstract class ClassFileStruct {
protected double doubleAt(byte[] reference, int relativeOffset, int structOffset) {
return (Double.longBitsToDouble(i8At(reference, relativeOffset, structOffset)));
}
protected float floatAt(byte[] reference, int relativeOffset, int structOffset) {
return (Float.intBitsToFloat(i4At(reference, relativeOffset, structOffset)));
}
protected int i1At(byte[] reference, int relativeOffset, int structOffset) {
return reference[relativeOffset + structOffset];
}
protected int i2At(byte[] reference, int relativeOffset, int structOffset) {
int position = relativeOffset + structOffset;
return (reference[position++] << 8) + (reference[position] & 0xFF);
}
protected int i4At(byte[] reference, int relativeOffset, int structOffset) {
int position = relativeOffset + structOffset;
return ((reference[position++] & 0xFF) << 24)
+ ((reference[position++] & 0xFF) << 16)
+ ((reference[position++] & 0xFF) << 8)
+ (reference[position] & 0xFF);
}
protected long i8At(byte[] reference, int relativeOffset, int structOffset) {
int position = relativeOffset + structOffset;
return (((long) (reference[position++] & 0xFF)) << 56)
+ (((long) (reference[position++] & 0xFF)) << 48)
+ (((long) (reference[position++] & 0xFF)) << 40)
+ (((long) (reference[position++] & 0xFF)) << 32)
+ (((long) (reference[position++] & 0xFF)) << 24)
+ (((long) (reference[position++] & 0xFF)) << 16)
+ (((long) (reference[position++] & 0xFF)) << 8)
+ (reference[position++] & 0xFF);
}
protected int u1At(byte[] reference, int relativeOffset, int structOffset) {
return (reference[relativeOffset + structOffset] & 0xFF);
}
protected int u2At(byte[] reference, int relativeOffset, int structOffset) {
int position = relativeOffset + structOffset;
return ((reference[position++] & 0xFF) << 8) + (reference[position] & 0xFF);
}
protected long u4At(byte[] reference, int relativeOffset, int structOffset) {
int position = relativeOffset + structOffset;
return (
((reference[position++] & 0xFFL) << 24)
+ ((reference[position++] & 0xFF) << 16)
+ ((reference[position++] & 0xFF) << 8)
+ (reference[position] & 0xFF));
}
protected char[] utf8At(byte[] reference, int relativeOffset, int structOffset, int bytesAvailable) {
int length = bytesAvailable;
char outputBuf[] = new char[bytesAvailable];
int outputPos = 0;
int readOffset = structOffset + relativeOffset;
while (length != 0) {
int x = reference[readOffset++] & 0xFF;
length--;
if ((0x80 & x) != 0) {
if ((x & 0x20) != 0) {
length-=2;
x = ((x & 0xF) << 12) + ((reference[readOffset++] & 0x3F) << 6) + (reference[readOffset++] & 0x3F);
} else {
length--;
x = ((x & 0x1F) << 6) + (reference[readOffset++] & 0x3F);
}
}
outputBuf[outputPos++] = (char) x;
}
if (outputPos != bytesAvailable) {
System.arraycopy(outputBuf, 0, (outputBuf = new char[outputPos]), 0, outputPos);
}
return outputBuf;
}
final boolean equals(char[] first, char[] second) {
if (first == second)
return true;
if (first == null || second == null)
return false;
if (first.length != second.length)
return false;
for (int i = first.length; --i >= 0;)
if (first[i] != second[i])
return false;
return true;
}
}