84 lines
2.6 KiB
Java
84 lines
2.6 KiB
Java
package jxl.write.biff;
|
|
|
|
import java.io.IOException;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import jxl.biff.ByteData;
|
|
|
|
class SharedStrings {
|
|
private HashMap strings = new HashMap(100);
|
|
|
|
private ArrayList stringList = new ArrayList(100);
|
|
|
|
private int totalOccurrences = 0;
|
|
|
|
public int getIndex(String s) {
|
|
Integer i = (Integer)this.strings.get(s);
|
|
if (i == null) {
|
|
i = new Integer(this.strings.size());
|
|
this.strings.put(s, i);
|
|
this.stringList.add(s);
|
|
}
|
|
this.totalOccurrences++;
|
|
return i.intValue();
|
|
}
|
|
|
|
public String get(int i) {
|
|
return this.stringList.get(i);
|
|
}
|
|
|
|
public void write(File outputFile) throws IOException {
|
|
int charsLeft = 0;
|
|
String curString = null;
|
|
SSTRecord sst = new SSTRecord(this.totalOccurrences, this.stringList.size());
|
|
ExtendedSSTRecord extsst = new ExtendedSSTRecord(this.stringList.size());
|
|
int bucketSize = extsst.getNumberOfStringsPerBucket();
|
|
Iterator i = this.stringList.iterator();
|
|
int stringIndex = 0;
|
|
while (i.hasNext() && charsLeft == 0) {
|
|
curString = i.next();
|
|
int relativePosition = sst.getOffset() + 4;
|
|
charsLeft = sst.add(curString);
|
|
if (stringIndex % bucketSize == 0)
|
|
extsst.addString(outputFile.getPos(), relativePosition);
|
|
stringIndex++;
|
|
}
|
|
outputFile.write((ByteData)sst);
|
|
if (charsLeft != 0 || i.hasNext()) {
|
|
SSTContinueRecord cont = createContinueRecord(curString, charsLeft, outputFile);
|
|
while (i.hasNext()) {
|
|
curString = i.next();
|
|
int relativePosition = cont.getOffset() + 4;
|
|
charsLeft = cont.add(curString);
|
|
if (stringIndex % bucketSize == 0)
|
|
extsst.addString(outputFile.getPos(), relativePosition);
|
|
stringIndex++;
|
|
if (charsLeft != 0) {
|
|
outputFile.write((ByteData)cont);
|
|
cont = createContinueRecord(curString, charsLeft, outputFile);
|
|
}
|
|
}
|
|
outputFile.write((ByteData)cont);
|
|
}
|
|
outputFile.write((ByteData)extsst);
|
|
}
|
|
|
|
private SSTContinueRecord createContinueRecord(String curString, int charsLeft, File outputFile) throws IOException {
|
|
SSTContinueRecord cont = null;
|
|
while (charsLeft != 0) {
|
|
cont = new SSTContinueRecord();
|
|
if (charsLeft == curString.length() || curString.length() == 0) {
|
|
charsLeft = cont.setFirstString(curString, true);
|
|
} else {
|
|
charsLeft = cont.setFirstString(curString.substring(curString.length() - charsLeft), false);
|
|
}
|
|
if (charsLeft != 0) {
|
|
outputFile.write((ByteData)cont);
|
|
cont = new SSTContinueRecord();
|
|
}
|
|
}
|
|
return cont;
|
|
}
|
|
}
|