package de.masters_of_disaster.ant.tasks.ar;
/**
* This class provides static utility methods to work with byte streams.
*/
public class ArUtils {
/**
* Parse an octal string from a header buffer. This is used for the
* file permission mode value.
*
* @param header The header buffer from which to parse.
* @param offset The offset into the buffer from which to parse.
* @param length The number of header bytes to parse.
* @return The long value of the octal string.
*/
public static long parseOctal(byte[] header, int offset, int length) {
long result = 0;
int end = offset + length;
for (int i=offset ; i<end ; i++) {
if (header[i] == (byte) ' ') {
break;
}
result = (result << 3) + (header[i] - '0');
}
return result;
}
/**
* Parse an entry name from a header buffer.
*
* @param header The header buffer from which to parse.
* @param offset The offset into the buffer from which to parse.
* @param length The number of header bytes to parse.
* @return The header's entry name.
*/
public static StringBuffer parseName(byte[] header, int offset, int length) {
StringBuffer result = new StringBuffer(length);
int end = offset + length;
for (int i=offset ; i<end ; i++) {
if (header[i] == ' ') {
break;
}
result.append((char) header[i]);
}
return result;
}
/**
* Write a name into a byte array.
*
* @param name The name to write.
* @param buf The byte array into which to write.
* @param offset The offset into the buffer from which to write.
* @param length The number of header bytes to write.
* @return The number of bytes written to the buffer.
*/
public static int getNameBytes(StringBuffer name, byte[] buf, int offset, int length) {
int i;
int c = name.length();
for (i=0 ; i<length && i<c ; i++) {
buf[offset+i] = (byte) name.charAt(i);
}
while (i<length) {
buf[offset+i] = (byte) ' ';
i++;
}
return offset + length;
}
/**
* Write a long value into a byte array.
*
* @param value The value to write.
* @param buf The byte array into which to write.
* @param offset The offset into the buffer from which to write.
* @param length The number of header bytes to write.
* @return The number of bytes written to the buffer.
*/
public static int getLongBytes(long value, byte[] buf, int offset, int length) {
int i;
String tmp = Long.toString(value);
int c = tmp.length();
for (i=0 ; i<length && i<c ; i++) {
buf[offset+i] = (byte) tmp.charAt(i);
}
while (i<length) {
buf[offset+i] = (byte) ' ';
i++;
}
return offset + length;
}
/**
* Write an int value into a byte array.
*
* @param value The value to write.
* @param buf The byte array into which to write.
* @param offset The offset into the buffer from which to write.
* @param length The number of header bytes to write.
* @return The number of bytes written to the buffer.
*/
public static int getIntegerBytes(int value, byte[] buf, int offset, int length) {
int i;
String tmp = Integer.toString(value);
int c = tmp.length();
for (i=0 ; i<length && i<c ; i++) {
buf[offset+i] = (byte) tmp.charAt(i);
}
while (i<length) {
buf[offset+i] = (byte) ' ';
i++;
}
return offset + length;
}
/**
* Write an octal value into a byte array.
*
* @param value The value to write.
* @param buf The byte array into which to write.
* @param offset The offset into the buffer from which to write.
* @param length The number of header bytes to write.
* @return The number of bytes written to the buffer.
*/
public static int getOctalBytes(long value, byte[] buf, int offset, int length) {
int i;
String tmp = Long.toOctalString(value);
int c = tmp.length();
for (i=0 ; i<length && i<c ; i++) {
buf[offset+i] = (byte) tmp.charAt(i);
}
while (i<length) {
buf[offset+i] = (byte) ' ';
i++;
}
return offset + length;
}
}