54 lines
1.8 KiB
Java
54 lines
1.8 KiB
Java
package jxl.write.biff;
|
|
|
|
import jxl.biff.IntegerHelper;
|
|
import jxl.biff.Type;
|
|
import jxl.biff.WritableRecordData;
|
|
|
|
class ExtendedSSTRecord extends WritableRecordData {
|
|
private static final int infoRecordSize = 8;
|
|
|
|
private int numberOfStrings;
|
|
|
|
private int[] absoluteStreamPositions;
|
|
|
|
private int[] relativeStreamPositions;
|
|
|
|
private int currentStringIndex = 0;
|
|
|
|
public ExtendedSSTRecord(int newNumberOfStrings) {
|
|
super(Type.EXTSST);
|
|
this.numberOfStrings = newNumberOfStrings;
|
|
int numberOfBuckets = getNumberOfBuckets();
|
|
this.absoluteStreamPositions = new int[numberOfBuckets];
|
|
this.relativeStreamPositions = new int[numberOfBuckets];
|
|
this.currentStringIndex = 0;
|
|
}
|
|
|
|
public int getNumberOfBuckets() {
|
|
int numberOfStringsPerBucket = getNumberOfStringsPerBucket();
|
|
return (numberOfStringsPerBucket != 0) ? ((this.numberOfStrings + numberOfStringsPerBucket - 1) / numberOfStringsPerBucket) : 0;
|
|
}
|
|
|
|
public int getNumberOfStringsPerBucket() {
|
|
int bucketLimit = 128;
|
|
return (this.numberOfStrings + 128 - 1) / 128;
|
|
}
|
|
|
|
public void addString(int absoluteStreamPosition, int relativeStreamPosition) {
|
|
this.absoluteStreamPositions[this.currentStringIndex] = absoluteStreamPosition + relativeStreamPosition;
|
|
this.relativeStreamPositions[this.currentStringIndex] = relativeStreamPosition;
|
|
this.currentStringIndex++;
|
|
}
|
|
|
|
public byte[] getData() {
|
|
int numberOfBuckets = getNumberOfBuckets();
|
|
byte[] data = new byte[2 + 8 * numberOfBuckets];
|
|
IntegerHelper.getTwoBytes(getNumberOfStringsPerBucket(), data, 0);
|
|
for (int i = 0; i < numberOfBuckets; i++) {
|
|
IntegerHelper.getFourBytes(this.absoluteStreamPositions[i], data, 2 + i * 8);
|
|
IntegerHelper.getTwoBytes(this.relativeStreamPositions[i], data, 6 + i * 8);
|
|
}
|
|
return data;
|
|
}
|
|
}
|