Converted Ptgs to use LittleEndianOutput

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@707486 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Josh Micich 2008-10-23 22:28:05 +00:00
parent 44adbe3e25
commit 4f54a9b557
38 changed files with 714 additions and 678 deletions

View File

@ -51,7 +51,7 @@ public final class LinkedDataFormulaField {
.append( "=" ) .append( "=" )
.append(ptg.toString() ) .append(ptg.toString() )
.append( "\n" ) .append( "\n" )
.append(ptg.toDebugString() ) .append(ptg.toString())
.append( "\n" ); .append( "\n" );
} }
} }

View File

@ -25,6 +25,8 @@ import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.HexDump; import org.apache.poi.util.HexDump;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianByteArrayOutputStream;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* The TXO record (0x01B6) is used to define the properties of a text box. It is * The TXO record (0x01B6) is used to define the properties of a text box. It is
@ -190,36 +192,31 @@ public final class TextObjectRecord extends Record {
private int serializeTXORecord(int offset, byte[] data) { private int serializeTXORecord(int offset, byte[] data) {
int dataSize = getDataSize(); int dataSize = getDataSize();
int recSize = dataSize+4;
LittleEndianOutput out = new LittleEndianByteArrayOutputStream(data, offset, recSize);
LittleEndian.putUShort(data, 0 + offset, TextObjectRecord.sid); out.writeShort(TextObjectRecord.sid);
LittleEndian.putUShort(data, 2 + offset, dataSize); out.writeShort(dataSize);
out.writeShort(field_1_options);
LittleEndian.putUShort(data, 4 + offset, field_1_options); out.writeShort(field_2_textOrientation);
LittleEndian.putUShort(data, 6 + offset, field_2_textOrientation); out.writeShort(field_3_reserved4);
LittleEndian.putUShort(data, 8 + offset, field_3_reserved4); out.writeShort(field_4_reserved5);
LittleEndian.putUShort(data, 10 + offset, field_4_reserved5); out.writeShort(field_5_reserved6);
LittleEndian.putUShort(data, 12 + offset, field_5_reserved6); out.writeShort(_text.length());
LittleEndian.putUShort(data, 14 + offset, _text.length()); out.writeShort(getFormattingDataLength());
LittleEndian.putUShort(data, 16 + offset, getFormattingDataLength()); out.writeInt(field_8_reserved7);
LittleEndian.putInt(data, 18 + offset, field_8_reserved7);
if (_linkRefPtg != null) { if (_linkRefPtg != null) {
int pos = offset+22;
int formulaSize = _linkRefPtg.getSize(); int formulaSize = _linkRefPtg.getSize();
LittleEndian.putUShort(data, pos, formulaSize); out.writeShort(formulaSize);
pos += LittleEndian.SHORT_SIZE; out.writeInt(_unknownPreFormulaInt);
LittleEndian.putInt(data, pos, _unknownPreFormulaInt); _linkRefPtg.write(out);
pos += LittleEndian.INT_SIZE;
_linkRefPtg.writeBytes(data, pos);
pos += formulaSize;
if (_unknownPostFormulaByte != null) { if (_unknownPostFormulaByte != null) {
LittleEndian.putByte(data, pos, _unknownPostFormulaByte.byteValue()); out.writeByte(_unknownPostFormulaByte.byteValue());
pos += LittleEndian.BYTE_SIZE;
} }
} }
return recSize;
return 4 + dataSize;
} }
private int serializeTrailingRecords(int offset, byte[] data) { private int serializeTrailingRecords(int offset, byte[] data) {

View File

@ -98,7 +98,6 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
buf.append(")"); buf.append(")");
} }
public abstract void writeBytes(byte[] array, int offset);
public abstract int getSize(); public abstract int getSize();

View File

@ -18,41 +18,47 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* Common superclass of 2-D area refs * Common superclass of 2-D area refs
*/ */
public abstract class Area2DPtgBase extends AreaPtgBase { public abstract class Area2DPtgBase extends AreaPtgBase {
private final static int SIZE = 9; private final static int SIZE = 9;
protected Area2DPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) { protected Area2DPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {
super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative); super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);
} }
protected Area2DPtgBase(RecordInputStream in) { protected Area2DPtgBase(RecordInputStream in) {
readCoordinates(in); readCoordinates(in);
} }
protected abstract byte getSid(); protected abstract byte getSid();
public final void writeBytes(byte [] array, int offset) { public final void write(LittleEndianOutput out) {
LittleEndian.putByte(array, offset+0, getSid() + getPtgClass()); out.writeByte(getSid() + getPtgClass());
writeCoordinates(array, offset+1); writeCoordinates(out);
} }
public Area2DPtgBase(String arearef) { public Area2DPtgBase(String arearef) {
super(arearef); super(arearef);
} }
public final int getSize() { public final int getSize() {
return SIZE; return SIZE;
} }
public final String toFormulaString() { public final String toFormulaString() {
return formatReferenceAsString(); return formatReferenceAsString();
}
public final String toString() {
StringBuffer sb = new StringBuffer();
sb.append(getClass().getName());
sb.append(" [");
sb.append(formatReferenceAsString());
sb.append("]");
return sb.toString();
} }
public final String toString() {
StringBuffer sb = new StringBuffer();
sb.append(getClass().getName());
sb.append(" [");
sb.append(formatReferenceAsString());
sb.append("]");
return sb.toString();
}
} }

View File

@ -21,7 +21,7 @@ import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.ss.formula.ExternSheetReferenceToken; import org.apache.poi.ss.formula.ExternSheetReferenceToken;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.ss.formula.WorkbookDependentFormula; import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* Title: Area 3D Ptg - 3D reference (Sheet + Area)<P> * Title: Area 3D Ptg - 3D reference (Sheet + Area)<P>
@ -67,10 +67,10 @@ public final class Area3DPtg extends AreaPtgBase implements WorkbookDependentFor
return sb.toString(); return sb.toString();
} }
public void writeBytes(byte[] array, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(array, 1 + offset, field_1_index_extern_sheet); out.writeShort(field_1_index_extern_sheet);
writeCoordinates(array, offset+3); writeCoordinates(out);
} }
public int getSize() { public int getSize() {

View File

@ -19,7 +19,7 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants; import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* AreaErr - handles deleted cell area references. * AreaErr - handles deleted cell area references.
@ -42,10 +42,10 @@ public final class AreaErrPtg extends OperandPtg {
unused2 = in.readInt(); unused2 = in.readInt();
} }
public void writeBytes(byte[] array, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putInt(array, offset + 1, unused1); out.writeInt(unused1);
LittleEndian.putInt(array, offset + 5, unused2); out.writeInt(unused2);
} }
public String toFormulaString() { public String toFormulaString() {

View File

@ -22,7 +22,7 @@ import org.apache.poi.hssf.util.AreaReference;
import org.apache.poi.hssf.util.CellReference; import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.util.BitField; import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* Specifies a rectangular area of cells A1:A4 for instance. * Specifies a rectangular area of cells A1:A4 for instance.
@ -119,11 +119,11 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI {
field_3_first_column = in.readUShort(); field_3_first_column = in.readUShort();
field_4_last_column = in.readUShort(); field_4_last_column = in.readUShort();
} }
protected final void writeCoordinates(byte[] array, int offset) { protected final void writeCoordinates(LittleEndianOutput out) {
LittleEndian.putUShort(array, offset + 0, field_1_first_row); out.writeShort(field_1_first_row);
LittleEndian.putUShort(array, offset + 2, field_2_last_row); out.writeShort(field_2_last_row);
LittleEndian.putUShort(array, offset + 4, field_3_first_column); out.writeShort(field_3_first_column);
LittleEndian.putUShort(array, offset + 6, field_4_last_column); out.writeShort(field_4_last_column);
} }
/** /**

View File

@ -22,6 +22,7 @@ import org.apache.poi.hssf.record.UnicodeString;
import org.apache.poi.hssf.record.constant.ConstantValueParser; import org.apache.poi.hssf.record.constant.ConstantValueParser;
import org.apache.poi.hssf.record.constant.ErrorConstant; import org.apache.poi.hssf.record.constant.ErrorConstant;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* ArrayPtg - handles arrays * ArrayPtg - handles arrays
@ -153,10 +154,9 @@ public final class ArrayPtg extends Ptg {
return rowIx * token_1_columns + colIx; return rowIx * token_1_columns + colIx;
} }
public void writeBytes(byte[] data, int offset) { public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
LittleEndian.putByte(data, offset + 0, sid + getPtgClass()); out.write(field_1_reserved);
System.arraycopy(field_1_reserved, 0, data, offset+1, RESERVED_FIELD_LEN);
} }
public int writeTokenValueBytes(byte[] data, int offset) { public int writeTokenValueBytes(byte[] data, int offset) {

View File

@ -21,6 +21,7 @@ import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.BitField; import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* "Special Attributes" * "Special Attributes"
@ -213,19 +214,16 @@ public final class AttrPtg extends ControlPtg {
return sb.toString(); return sb.toString();
} }
public void writeBytes(byte [] array, int offset) public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
LittleEndian.putByte(array, offset+0, sid); out.writeByte(field_1_options);
LittleEndian.putByte(array, offset+1, field_1_options); out.writeShort(field_2_data);
LittleEndian.putShort(array,offset+2, field_2_data);
int[] jt = _jumpTable; int[] jt = _jumpTable;
if (jt != null) { if (jt != null) {
int joff = offset+4;
for (int i = 0; i < jt.length; i++) { for (int i = 0; i < jt.length; i++) {
LittleEndian.putUShort(array, joff, jt[i]); out.writeShort(jt[i]);
joff+=2;
} }
LittleEndian.putUShort(array, joff, _chooseFuncOffset); out.writeShort(_chooseFuncOffset);
} }
} }

View File

@ -18,41 +18,42 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* Boolean (boolean) * Boolean (boolean) Stores a (java) boolean value in a formula.
* Stores a (java) boolean value in a formula. *
* @author Paul Krause (pkrause at soundbite dot com) * @author Paul Krause (pkrause at soundbite dot com)
* @author Andrew C. Oliver (acoliver at apache dot org) * @author Andrew C. Oliver (acoliver at apache dot org)
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public final class BoolPtg extends ScalarConstantPtg { public final class BoolPtg extends ScalarConstantPtg {
public final static int SIZE = 2; public final static int SIZE = 2;
public final static byte sid = 0x1d; public final static byte sid = 0x1D;
private final boolean _value; private final boolean _value;
public BoolPtg(RecordInputStream in) { public BoolPtg(RecordInputStream in) {
_value = (in.readByte() == 1); _value = (in.readByte() == 1);
} }
public BoolPtg(String formulaToken) { public BoolPtg(String formulaToken) {
_value = (formulaToken.equalsIgnoreCase("TRUE")); _value = (formulaToken.equalsIgnoreCase("TRUE"));
} }
public boolean getValue() { public boolean getValue() {
return _value; return _value;
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
array[ offset + 0 ] = sid; out.writeByte(sid + getPtgClass());
array[ offset + 1 ] = (byte) (_value ? 1 : 0); out.writeByte(_value ? 1 : 0);
} }
public int getSize() { public int getSize() {
return SIZE; return SIZE;
} }
public String toFormulaString() { public String toFormulaString() {
return _value ? "TRUE" : "FALSE"; return _value ? "TRUE" : "FALSE";
} }
} }

View File

@ -19,9 +19,9 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants; import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.util.LittleEndian; import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* Title: Deleted Area 3D Ptg - 3D referecnce (Sheet + Area)<P> * Title: Deleted Area 3D Ptg - 3D referecnce (Sheet + Area)<P>
@ -60,10 +60,10 @@ public final class DeletedArea3DPtg extends OperandPtg implements WorkbookDepend
public int getSize() { public int getSize() {
return 11; return 11;
} }
public void writeBytes(byte[] data, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(data, 0 + offset, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(data, 1 + offset, field_1_index_extern_sheet); out.writeShort(field_1_index_extern_sheet);
LittleEndian.putInt(data, 3 + offset, unused1); out.writeInt(unused1);
LittleEndian.putInt(data, 7 + offset, unused2); out.writeInt(unused2);
} }
} }

View File

@ -20,9 +20,9 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants; import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.util.LittleEndian; import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* Title: Deleted Reference 3D Ptg <P> * Title: Deleted Reference 3D Ptg <P>
@ -60,9 +60,9 @@ public final class DeletedRef3DPtg extends OperandPtg implements WorkbookDepende
public int getSize() { public int getSize() {
return 7; return 7;
} }
public void writeBytes(byte[] data, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(data, 0 + offset, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(data, 1 + offset, field_1_index_extern_sheet); out.writeShort(field_1_index_extern_sheet);
LittleEndian.putInt(data, 3 + offset, unused1); out.writeInt(unused1);
} }
} }

View File

@ -19,6 +19,7 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants; import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author Daniel Noll (daniel at nuix dot com dot au) * @author Daniel Noll (daniel at nuix dot com dot au)
@ -61,10 +62,9 @@ public final class ErrPtg extends ScalarConstantPtg {
return valueOf(in.readByte()); return valueOf(in.readByte());
} }
public void writeBytes(byte [] array, int offset) public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
array[offset] = (byte) (sid + getPtgClass()); out.writeByte(field_1_error_code);
array[offset + 1] = (byte)field_1_error_code;
} }
public String toFormulaString() { public String toFormulaString() {

View File

@ -19,7 +19,7 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordFormatException; import org.apache.poi.hssf.record.RecordFormatException;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* *
@ -39,11 +39,10 @@ public final class ExpPtg extends ControlPtg {
field_2_first_col = in.readShort(); field_2_first_col = in.readShort();
} }
public void writeBytes(byte [] array, int offset) public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
array[offset+0]= (byte) (sid); out.writeShort(field_1_first_row);
LittleEndian.putShort(array,offset+1,field_1_first_row); out.writeShort(field_2_first_col);
LittleEndian.putShort(array,offset+3,field_2_first_col);
} }
public int getSize() public int getSize()

View File

@ -16,10 +16,10 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.record.formula.function.FunctionMetadata; import org.apache.poi.hssf.record.formula.function.FunctionMetadata;
import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry; import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author aviks * @author aviks
@ -55,9 +55,9 @@ public final class FuncPtg extends AbstractFunctionPtg {
paramClass = fm.getParameterClassCodes(); paramClass = fm.getParameterClassCodes();
} }
public void writeBytes(byte[] array, int offset) { public void write(LittleEndianOutput out) {
array[offset+0]= (byte) (sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putShort(array,offset+1,field_2_fnc_index); out.writeShort(field_2_fnc_index);
} }
public int getNumberOfOperands() { public int getNumberOfOperands() {

View File

@ -16,10 +16,10 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.record.formula.function.FunctionMetadata; import org.apache.poi.hssf.record.formula.function.FunctionMetadata;
import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry; import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* *
@ -64,10 +64,10 @@ public final class FuncVarPtg extends AbstractFunctionPtg{
} }
} }
public void writeBytes(byte[] array, int offset) { public void write(LittleEndianOutput out) {
array[offset+0]=(byte) (sid + getPtgClass()); out.writeByte(sid + getPtgClass());
array[offset+1]=field_1_num_args; out.writeByte(field_1_num_args);
LittleEndian.putShort(array,offset+2,field_2_fnc_index); out.writeShort(field_2_fnc_index);
} }
public int getNumberOfOperands() { public int getNumberOfOperands() {

View File

@ -18,57 +18,59 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* Integer (unsigned short integer) * Integer (unsigned short integer) Stores an unsigned short value (java int) in
* Stores an unsigned short value (java int) in a formula * a formula
* @author Andrew C. Oliver (acoliver at apache dot org) *
* @author Andrew C. Oliver (acoliver at apache dot org)
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public final class IntPtg extends ScalarConstantPtg { public final class IntPtg extends ScalarConstantPtg {
// 16 bit unsigned integer // 16 bit unsigned integer
private static final int MIN_VALUE = 0x0000; private static final int MIN_VALUE = 0x0000;
private static final int MAX_VALUE = 0xFFFF; private static final int MAX_VALUE = 0xFFFF;
/** /**
* Excel represents integers 0..65535 with the tInt token. * Excel represents integers 0..65535 with the tInt token.
* @return <code>true</code> if the specified value is within the range of values *
* <tt>IntPtg</tt> can represent. * @return <code>true</code> if the specified value is within the range of values
*/ * <tt>IntPtg</tt> can represent.
public static boolean isInRange(int i) { */
return i>=MIN_VALUE && i <=MAX_VALUE; public static boolean isInRange(int i) {
} return i >= MIN_VALUE && i <= MAX_VALUE;
}
public final static int SIZE = 3; public final static int SIZE = 3;
public final static byte sid = 0x1e; public final static byte sid = 0x1e;
private final int field_1_value; private final int field_1_value;
public IntPtg(RecordInputStream in) { public IntPtg(RecordInputStream in) {
this(in.readUShort()); this(in.readUShort());
} }
public IntPtg(int value) { public IntPtg(int value) {
if(!isInRange(value)) { if (!isInRange(value)) {
throw new IllegalArgumentException("value is out of range: " + value); throw new IllegalArgumentException("value is out of range: " + value);
} }
field_1_value = value; field_1_value = value;
} }
public int getValue() { public int getValue() {
return field_1_value; return field_1_value;
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
array[ offset + 0 ] = sid; out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(array, offset + 1, getValue()); out.writeShort(getValue());
} }
public int getSize() { public int getSize() {
return SIZE; return SIZE;
} }
public String toFormulaString() { public String toFormulaString() {
return String.valueOf(getValue()); return String.valueOf(getValue());
} }
} }

View File

@ -17,54 +17,46 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author Daniel Noll (daniel at nuix dot com dot au) * @author Daniel Noll (daniel at nuix dot com dot au)
*/ */
public final class IntersectionPtg extends OperationPtg { public final class IntersectionPtg extends OperationPtg {
public final static byte sid = 0x0f; public final static byte sid = 0x0f;
public static final OperationPtg instance = new IntersectionPtg(); public static final OperationPtg instance = new IntersectionPtg();
private IntersectionPtg() { private IntersectionPtg() {
// enforce singleton // enforce singleton
} }
public final boolean isBaseToken() { public final boolean isBaseToken() {
return true; return true;
} }
public int getSize() public int getSize() {
{ return 1;
return 1; }
}
public void writeBytes( byte[] array, int offset ) public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
array[ offset + 0 ] = sid; }
}
/** Implementation of method from Ptg */ public String toFormulaString() {
public String toFormulaString() return " ";
{ }
return " ";
}
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
/** implementation of method from OperationsPtg*/ buffer.append(operands[0]);
public String toFormulaString(String[] operands) buffer.append(" ");
{ buffer.append(operands[1]);
StringBuffer buffer = new StringBuffer(); return buffer.toString();
}
buffer.append(operands[ 0 ]);
buffer.append(" ");
buffer.append(operands[ 1 ]);
return buffer.toString();
}
public int getNumberOfOperands()
{
return 2;
}
public int getNumberOfOperands() {
return 2;
}
} }

View File

@ -18,67 +18,44 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author Daniel Noll (daniel at nuix dot com dot au) * @author Daniel Noll (daniel at nuix dot com dot au)
*/ */
public class MemAreaPtg extends OperandPtg { public class MemAreaPtg extends OperandPtg {
public final static short sid = 0x26; public final static short sid = 0x26;
private final static int SIZE = 7; private final static int SIZE = 7;
private int field_1_reserved; private final int field_1_reserved;
private short field_2_subex_len; private final int field_2_subex_len;
/** Creates new MemAreaPtg */ /** Creates new MemAreaPtg */
public MemAreaPtg() public MemAreaPtg(int subexLen) {
{ field_1_reserved = 0;
} field_2_subex_len = subexLen;
}
public MemAreaPtg(RecordInputStream in) public MemAreaPtg(RecordInputStream in) {
{ field_1_reserved = in.readInt();
field_1_reserved = in.readInt(); field_2_subex_len = in.readShort();
field_2_subex_len = in.readShort(); }
}
public void setReserved(int res) public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
field_1_reserved = res; out.writeInt(field_1_reserved);
} out.writeShort(field_2_subex_len);
}
public int getReserved() public int getSize() {
{ return SIZE;
return field_1_reserved; }
}
public void setSubexpressionLength(short subexlen) public String toFormulaString() {
{ return ""; // TODO: Not sure how to format this. -- DN
field_2_subex_len = subexlen; }
}
public short getSubexpressionLength() public byte getDefaultOperandClass() {
{ return Ptg.CLASS_VALUE;
return field_2_subex_len; }
}
public void writeBytes(byte [] array, int offset)
{
array[offset] = (byte) (sid + getPtgClass());
LittleEndian.putInt(array, offset + 1, field_1_reserved);
LittleEndian.putShort(array, offset + 5, field_2_subex_len);
}
public int getSize()
{
return SIZE;
}
public String toFormulaString()
{
return ""; // TODO: Not sure how to format this. -- DN
}
public byte getDefaultOperandClass() {
return Ptg.CLASS_VALUE;
}
} }

View File

@ -18,35 +18,40 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.util.LittleEndianOutput;
/** /**
* *
* @author andy * @author andy
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
* @author Daniel Noll (daniel at nuix dot com dot au) * @author Daniel Noll (daniel at nuix dot com dot au)
*/ */
public final class MemErrPtg extends OperandPtg {
public final static short sid = 0x27;
private final static int SIZE = 7;
private int field_1_reserved;
private short field_2_subex_len;
public final class MemErrPtg extends MemAreaPtg { public MemErrPtg(RecordInputStream in) {
public final static short sid = 0x27; field_1_reserved = in.readInt();
field_2_subex_len = in.readShort();
}
/** Creates new MemErrPtg */ public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
out.writeInt(field_1_reserved);
out.writeShort(field_2_subex_len);
}
public MemErrPtg() public int getSize() {
{ return SIZE;
} }
public MemErrPtg(RecordInputStream in) { public String toFormulaString() {
super(in); return "ERR#";
} }
public void writeBytes(byte [] array, int offset) { public byte getDefaultOperandClass() {
super.writeBytes(array, offset); return Ptg.CLASS_VALUE;
array[offset] = (byte) (sid + getPtgClass()); }
}
public String toFormulaString()
{
return "ERR#";
}
} }

View File

@ -18,55 +18,50 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author Glen Stampoultzis (glens at apache.org) * @author Glen Stampoultzis (glens at apache.org)
*/ */
public final class MemFuncPtg extends OperandPtg { public final class MemFuncPtg extends OperandPtg {
public final static byte sid = 0x29; public final static byte sid = 0x29;
private final int field_1_len_ref_subexpression; private final int field_1_len_ref_subexpression;
/**Creates new function pointer from a byte array /**
* usually called while reading an excel file. * Creates new function pointer from a byte array usually called while
*/ * reading an excel file.
public MemFuncPtg(RecordInputStream in) { */
this(in.readUShort()); public MemFuncPtg(RecordInputStream in) {
} this(in.readUShort());
public MemFuncPtg(int subExprLen) {
field_1_len_ref_subexpression = subExprLen;
} }
public int getSize() public MemFuncPtg(int subExprLen) {
{ field_1_len_ref_subexpression = subExprLen;
return 3; }
}
public void writeBytes( byte[] array, int offset ) public int getSize() {
{ return 3;
array[offset + 0] = sid ; }
LittleEndian.putUShort( array, offset + 1, field_1_len_ref_subexpression );
}
public String toFormulaString() public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
return ""; out.writeShort(field_1_len_ref_subexpression);
} }
public byte getDefaultOperandClass() public String toFormulaString() {
{ return "";
return Ptg.CLASS_REF; }
}
public int getNumberOfOperands() public byte getDefaultOperandClass() {
{ return Ptg.CLASS_REF;
return field_1_len_ref_subexpression; }
}
public int getLenRefSubexpression() public int getNumberOfOperands() {
{ return field_1_len_ref_subexpression;
return field_1_len_ref_subexpression; }
}
public int getLenRefSubexpression() {
return field_1_len_ref_subexpression;
}
} }

View File

@ -17,32 +17,35 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* Missing Function Arguments * Missing Function Arguments
* *
* Avik Sengupta &lt;avik at apache.org&gt; * Avik Sengupta &lt;avik at apache.org&gt;
*
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public final class MissingArgPtg extends ScalarConstantPtg { public final class MissingArgPtg extends ScalarConstantPtg {
private final static int SIZE = 1; private final static int SIZE = 1;
public final static byte sid = 0x16; public final static byte sid = 0x16;
public static final Ptg instance = new MissingArgPtg(); public static final Ptg instance = new MissingArgPtg();
private MissingArgPtg() { private MissingArgPtg() {
// enforce singleton // enforce singleton
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
array[ offset + 0 ] = sid; out.writeByte(sid + getPtgClass());
} }
public int getSize() { public int getSize() {
return SIZE; return SIZE;
} }
public String toFormulaString() { public String toFormulaString() {
return " "; return " ";
} }
} }

View File

@ -18,62 +18,62 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.util.LittleEndian; import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* *
* @author andy * @author andy
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public final class NamePtg extends OperandPtg implements WorkbookDependentFormula { public final class NamePtg extends OperandPtg implements WorkbookDependentFormula {
public final static short sid = 0x23; public final static short sid = 0x23;
private final static int SIZE = 5; private final static int SIZE = 5;
/** one-based index to defined name record */ /** one-based index to defined name record */
private int field_1_label_index; private int field_1_label_index;
private short field_2_zero; // reserved must be 0 private short field_2_zero; // reserved must be 0
/** /**
* @param nameIndex zero-based index to name within workbook * @param nameIndex zero-based index to name within workbook
*/ */
public NamePtg(int nameIndex) { public NamePtg(int nameIndex) {
field_1_label_index = 1+nameIndex; // convert to 1-based field_1_label_index = 1 + nameIndex; // convert to 1-based
} }
/** Creates new NamePtg */ /** Creates new NamePtg */
public NamePtg(RecordInputStream in) { public NamePtg(RecordInputStream in) {
field_1_label_index = in.readShort(); field_1_label_index = in.readShort();
field_2_zero = in.readShort(); field_2_zero = in.readShort();
} }
/** /**
* @return zero based index to a defined name record in the LinkTable * @return zero based index to a defined name record in the LinkTable
*/ */
public int getIndex() { public int getIndex() {
return field_1_label_index-1; // convert to zero based return field_1_label_index - 1; // convert to zero based
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(array, offset + 1, field_1_label_index); out.writeShort(field_1_label_index);
LittleEndian.putUShort(array, offset + 3, field_2_zero); out.writeShort(field_2_zero);
} }
public int getSize() { public int getSize() {
return SIZE; return SIZE;
} }
public String toFormulaString(FormulaRenderingWorkbook book) {
return book.getNameText(this);
}
public String toFormulaString(FormulaRenderingWorkbook book)
{
return book.getNameText(this);
}
public String toFormulaString() { public String toFormulaString() {
throw new RuntimeException("3D references need a workbook to determine formula text"); throw new RuntimeException("3D references need a workbook to determine formula text");
} }
public byte getDefaultOperandClass() { public byte getDefaultOperandClass() {
return Ptg.CLASS_REF; return Ptg.CLASS_REF;
} }
} }

View File

@ -18,9 +18,9 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.util.LittleEndian; import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* *
@ -55,11 +55,11 @@ public final class NameXPtg extends OperandPtg implements WorkbookDependentFormu
this(in.readUShort(), in.readUShort(), in.readUShort()); this(in.readUShort(), in.readUShort(), in.readUShort());
} }
public void writeBytes(byte[] array, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(array, offset + 1, _sheetRefIndex); out.writeShort(_sheetRefIndex);
LittleEndian.putUShort(array, offset + 3, _nameNumber); out.writeShort(_nameNumber);
LittleEndian.putUShort(array, offset + 5, _reserved); out.writeShort(_reserved);
} }
public int getSize() { public int getSize() {

View File

@ -18,53 +18,54 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* Number * Number Stores a floating point value in a formula value stored in a 8 byte
* Stores a floating point value in a formula * field using IEEE notation
* value stored in a 8 byte field using IEEE notation *
* @author Avik Sengupta * @author Avik Sengupta
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public final class NumberPtg extends ScalarConstantPtg { public final class NumberPtg extends ScalarConstantPtg {
public final static int SIZE = 9; public final static int SIZE = 9;
public final static byte sid = 0x1f; public final static byte sid = 0x1f;
private final double field_1_value; private final double field_1_value;
/** Create a NumberPtg from a byte array read from disk */ public NumberPtg(RecordInputStream in) {
public NumberPtg(RecordInputStream in) { this(in.readDouble());
this(in.readDouble()); }
}
/** Create a NumberPtg from a string representation of the number /**
* Number format is not checked, it is expected to be validated in the parser * Create a NumberPtg from a string representation of the number Number
* that calls this method. * format is not checked, it is expected to be validated in the parser that
* @param value : String representation of a floating point number * calls this method.
*/ *
public NumberPtg(String value) { * @param value String representation of a floating point number
this(Double.parseDouble(value)); */
} public NumberPtg(String value) {
this(Double.parseDouble(value));
}
public NumberPtg(double value) { public NumberPtg(double value) {
field_1_value = value; field_1_value = value;
} }
public double getValue() { public double getValue() {
return field_1_value; return field_1_value;
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
array[ offset + 0 ] = sid; out.writeByte(sid + getPtgClass());
LittleEndian.putDouble(array, offset + 1, getValue()); out.writeDouble(getValue());
} }
public int getSize() { public int getSize() {
return SIZE; return SIZE;
} }
public String toFormulaString() { public String toFormulaString() {
// TODO - java's rendering of double values is not quite same as excel's // TODO - java's rendering of double values is not quite same as excel's
return String.valueOf(field_1_value); return String.valueOf(field_1_value);
} }
} }

View File

@ -15,46 +15,44 @@
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* While formula tokens are stored in RPN order and thus do not need parenthesis for * While formula tokens are stored in RPN order and thus do not need parenthesis
* precedence reasons, Parenthesis tokens ARE written to ensure that user entered * for precedence reasons, Parenthesis tokens ARE written to ensure that user
* parenthesis are displayed as-is on reading back * entered parenthesis are displayed as-is on reading back
*
* Avik Sengupta &lt;lists@aviksengupta.com&gt; Andrew C. Oliver (acoliver at
* apache dot org)
* *
* Avik Sengupta &lt;lists@aviksengupta.com&gt;
* Andrew C. Oliver (acoliver at apache dot org)
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public final class ParenthesisPtg extends ControlPtg { public final class ParenthesisPtg extends ControlPtg {
private final static int SIZE = 1; private final static int SIZE = 1;
public final static byte sid = 0x15; public final static byte sid = 0x15;
public static final ControlPtg instance = new ParenthesisPtg(); public static final ControlPtg instance = new ParenthesisPtg();
private ParenthesisPtg() {
// enforce singleton
}
public void writeBytes(byte [] array, int offset) private ParenthesisPtg() {
{ // enforce singleton
array[ offset + 0 ] = sid; }
}
public int getSize() public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
return SIZE; }
}
public String toFormulaString() public int getSize() {
{ return SIZE;
return "()"; }
}
public String toFormulaString() {
return "()";
}
public String toFormulaString(String[] operands) { public String toFormulaString(String[] operands) {
return "("+operands[0]+")"; return "(" + operands[0] + ")";
} }
} }

View File

@ -21,7 +21,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.HexDump; import org.apache.poi.util.LittleEndianByteArrayOutputStream;
import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.LittleEndianOutput;
/** /**
@ -128,7 +128,7 @@ public abstract class Ptg implements Cloneable {
private static Ptg createBasePtg(byte id, RecordInputStream in) { private static Ptg createBasePtg(byte id, RecordInputStream in) {
switch(id) { switch(id) {
case 0x00: return new UnknownPtg(); // TODO - not a real Ptg case 0x00: return new UnknownPtg(id); // TODO - not a real Ptg
case ExpPtg.sid: return new ExpPtg(in); // 0x01 case ExpPtg.sid: return new ExpPtg(in); // 0x01
case TblPtg.sid: return new TblPtg(in); // 0x02 case TblPtg.sid: return new TblPtg(in); // 0x02
case AddPtg.sid: return AddPtg.instance; // 0x03 case AddPtg.sid: return AddPtg.instance; // 0x03
@ -229,14 +229,16 @@ public abstract class Ptg implements Cloneable {
*/ */
public static int serializePtgs(Ptg[] ptgs, byte[] array, int offset) { public static int serializePtgs(Ptg[] ptgs, byte[] array, int offset) {
int pos = 0; int pos = 0;
int size = ptgs.length; int nTokens = ptgs.length;
LittleEndianOutput out = new LittleEndianByteArrayOutputStream(array, offset);
List arrayPtgs = null; List arrayPtgs = null;
for (int k = 0; k < size; k++) { for (int k = 0; k < nTokens; k++) {
Ptg ptg = ptgs[k]; Ptg ptg = ptgs[k];
ptg.writeBytes(array, pos + offset); ptg.write(out);
if (ptg instanceof ArrayPtg) { if (ptg instanceof ArrayPtg) {
if (arrayPtgs == null) { if (arrayPtgs == null) {
arrayPtgs = new ArrayList(5); arrayPtgs = new ArrayList(5);
@ -266,38 +268,12 @@ public abstract class Ptg implements Cloneable {
*/ */
// public abstract int getDataSize(); // public abstract int getDataSize();
public final byte[] getBytes() public abstract void write(LittleEndianOutput out);
{
int size = getSize();
byte[] bytes = new byte[ size ];
writeBytes(bytes, 0);
return bytes;
}
/** write this Ptg to a byte array*/
public abstract void writeBytes(byte [] array, int offset);
public void write(LittleEndianOutput out) {
out.write(getBytes()); // TODO - optimise - just a hack for the moment
}
/** /**
* return a string representation of this token alone * return a string representation of this token alone
*/ */
public abstract String toFormulaString(); public abstract String toFormulaString();
/**
* dump a debug representation (hexdump) to a string
*/
public final String toDebugString() {
byte[] ba = new byte[getSize()];
writeBytes(ba,0);
try {
return HexDump.dump(ba,0,0);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/** Overridden toString method to ensure object hash is not printed. /** Overridden toString method to ensure object hash is not printed.
* This helps get rid of gratuitous diffs when comparing two dumps * This helps get rid of gratuitous diffs when comparing two dumps

View File

@ -17,6 +17,8 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author Daniel Noll (daniel at nuix dot com dot au) * @author Daniel Noll (daniel at nuix dot com dot au)
@ -40,9 +42,8 @@ public final class RangePtg extends OperationPtg {
return SIZE; return SIZE;
} }
public void writeBytes( byte[] array, int offset ) public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
array[ offset + 0 ] = sid;
} }
public String toFormulaString() public String toFormulaString()

View File

@ -18,50 +18,54 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author Josh Micich * @author Josh Micich
*/ */
abstract class Ref2DPtgBase extends RefPtgBase { abstract class Ref2DPtgBase extends RefPtgBase {
private final static int SIZE = 5; private final static int SIZE = 5;
/** /**
* Takes in a String representation of a cell reference and fills out the * Takes in a String representation of a cell reference and fills out the
* numeric fields. * numeric fields.
*/ */
protected Ref2DPtgBase(String cellref) { protected Ref2DPtgBase(String cellref) {
super(cellref); super(cellref);
} }
protected Ref2DPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) { protected Ref2DPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
setRow(row); setRow(row);
setColumn(column); setColumn(column);
setRowRelative(isRowRelative); setRowRelative(isRowRelative);
setColRelative(isColumnRelative); setColRelative(isColumnRelative);
} }
protected Ref2DPtgBase(RecordInputStream in) { protected Ref2DPtgBase(RecordInputStream in) {
readCoordinates(in); readCoordinates(in);
} }
public final void writeBytes(byte [] array, int offset) {
LittleEndian.putByte(array, offset+0, getSid() + getPtgClass()); public void write(LittleEndianOutput out) {
writeCoordinates(array, offset+1); out.writeByte(getSid() + getPtgClass());
} writeCoordinates(out);
public final String toFormulaString() { }
return formatReferenceAsString();
} public final String toFormulaString() {
return formatReferenceAsString();
}
protected abstract byte getSid(); protected abstract byte getSid();
public final int getSize() {
return SIZE; public final int getSize() {
} return SIZE;
public final String toString() { }
StringBuffer sb = new StringBuffer();
sb.append(getClass().getName()); public final String toString() {
sb.append(" ["); StringBuffer sb = new StringBuffer();
sb.append(formatReferenceAsString()); sb.append(getClass().getName());
sb.append("]"); sb.append(" [");
return sb.toString(); sb.append(formatReferenceAsString());
} sb.append("]");
return sb.toString();
}
} }

View File

@ -22,7 +22,7 @@ import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.ss.formula.ExternSheetReferenceToken; import org.apache.poi.ss.formula.ExternSheetReferenceToken;
import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
import org.apache.poi.ss.formula.WorkbookDependentFormula; import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* Title: Reference 3D Ptg <P> * Title: Reference 3D Ptg <P>
@ -66,10 +66,10 @@ public final class Ref3DPtg extends RefPtgBase implements WorkbookDependentFormu
return sb.toString(); return sb.toString();
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(array, 0 + offset, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(array, 1 + offset, getExternSheetIndex()); out.writeShort(getExternSheetIndex());
writeCoordinates(array, offset + 3); writeCoordinates(out);
} }
public int getSize() { public int getSize() {

View File

@ -19,8 +19,7 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.usermodel.HSSFErrorConstants; import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.util.LittleEndianOutput;
import org.apache.poi.util.LittleEndian;
/** /**
* RefError - handles deleted cell reference * RefError - handles deleted cell reference
@ -43,9 +42,9 @@ public final class RefErrorPtg extends OperandPtg {
return getClass().getName(); return getClass().getName();
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(array, offset+0, sid + getPtgClass()); out.writeByte(sid + getPtgClass());
LittleEndian.putInt(array,offset+1,field_1_reserved); out.writeInt(field_1_reserved);
} }
public int getSize() public int getSize()

View File

@ -21,108 +21,110 @@ import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.util.CellReference; import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.util.BitField; import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* ReferencePtgBase - handles references (such as A1, A2, IA4) * ReferencePtgBase - handles references (such as A1, A2, IA4)
* @author Andrew C. Oliver (acoliver@apache.org) *
* @author Andrew C. Oliver (acoliver@apache.org)
* @author Jason Height (jheight at chariot dot net dot au) * @author Jason Height (jheight at chariot dot net dot au)
*/ */
public abstract class RefPtgBase extends OperandPtg { public abstract class RefPtgBase extends OperandPtg {
private final static int MAX_ROW_NUMBER = 65536; private final static int MAX_ROW_NUMBER = 65536;
/** The row index - zero based unsigned 16 bit value */ /** The row index - zero based unsigned 16 bit value */
private int field_1_row; private int field_1_row;
/** Field 2 /**
* - lower 8 bits is the zero based unsigned byte column index * Field 2 - lower 8 bits is the zero based unsigned byte column index - bit
* - bit 16 - isRowRelative * 16 - isRowRelative - bit 15 - isColumnRelative
* - bit 15 - isColumnRelative */
*/ private int field_2_col;
private int field_2_col; private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000); private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
private static final BitField colRelative = BitFieldFactory.getInstance(0x4000); private static final BitField column = BitFieldFactory.getInstance(0x00FF);
private static final BitField column = BitFieldFactory.getInstance(0x00FF);
protected RefPtgBase() { protected RefPtgBase() {
//Required for clone methods // Required for clone methods
} }
/** /**
* Takes in a String representation of a cell reference and fills out the * Takes in a String representation of a cell reference and fills out the
* numeric fields. * numeric fields.
*/ */
protected RefPtgBase(String cellref) { protected RefPtgBase(String cellref) {
CellReference c= new CellReference(cellref); CellReference c = new CellReference(cellref);
setRow(c.getRow()); setRow(c.getRow());
setColumn(c.getCol()); setColumn(c.getCol());
setColRelative(!c.isColAbsolute()); setColRelative(!c.isColAbsolute());
setRowRelative(!c.isRowAbsolute()); setRowRelative(!c.isRowAbsolute());
} }
protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) { protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
setRow(row); setRow(row);
setColumn(column); setColumn(column);
setRowRelative(isRowRelative); setRowRelative(isRowRelative);
setColRelative(isColumnRelative); setColRelative(isColumnRelative);
} }
protected final void readCoordinates(RecordInputStream in) { protected final void readCoordinates(RecordInputStream in) {
field_1_row = in.readUShort(); field_1_row = in.readUShort();
field_2_col = in.readUShort(); field_2_col = in.readUShort();
} }
protected final void writeCoordinates(byte[] array, int offset) {
LittleEndian.putUShort(array, offset + 0, field_1_row);
LittleEndian.putUShort(array, offset + 2, field_2_col);
}
public final void setRow(int row) { protected final void writeCoordinates(LittleEndianOutput out) {
if(row < 0 || row >= MAX_ROW_NUMBER) { out.writeShort(field_1_row);
throw new IllegalArgumentException("The row number, when specified as an integer, must be between 0 and " + MAX_ROW_NUMBER); out.writeShort(field_2_col);
} }
field_1_row = row;
}
/** public final void setRow(int rowIndex) {
* @return the row number as an int, between 0 and 65535 if (rowIndex < 0 || rowIndex >= MAX_ROW_NUMBER) {
*/ throw new IllegalArgumentException("rowIndex must be between 0 and " + MAX_ROW_NUMBER);
public final int getRow(){ }
return field_1_row; field_1_row = rowIndex;
} }
public final boolean isRowRelative() { /**
return rowRelative.isSet(field_2_col); * @return the row number as an int, between 0 and 65535
} */
public final int getRow() {
return field_1_row;
}
public final void setRowRelative(boolean rel) { public final boolean isRowRelative() {
field_2_col=rowRelative.setBoolean(field_2_col,rel); return rowRelative.isSet(field_2_col);
} }
public final boolean isColRelative() { public final void setRowRelative(boolean rel) {
return colRelative.isSet(field_2_col); field_2_col = rowRelative.setBoolean(field_2_col, rel);
} }
public final void setColRelative(boolean rel) { public final boolean isColRelative() {
field_2_col=colRelative.setBoolean(field_2_col,rel); return colRelative.isSet(field_2_col);
} }
public final void setColumn(int col) { public final void setColRelative(boolean rel) {
if(col < 0 || col >= 0x100) { field_2_col = colRelative.setBoolean(field_2_col, rel);
throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range"); }
}
field_2_col = column.setValue(field_2_col, col);
}
public final int getColumn() { public final void setColumn(int col) {
return column.getValue(field_2_col); if (col < 0 || col >= 0x100) {
} throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range");
protected final String formatReferenceAsString() { }
// Only make cell references as needed. Memory is an issue field_2_col = column.setValue(field_2_col, col);
CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(), !isColRelative()); }
return cr.formatAsString();
}
public final byte getDefaultOperandClass() { public final int getColumn() {
return Ptg.CLASS_REF; return column.getValue(field_2_col);
} }
protected final String formatReferenceAsString() {
// Only make cell references as needed. Memory is an issue
CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(), !isColRelative());
return cr.formatAsString();
}
public final byte getDefaultOperandClass() {
return Ptg.CLASS_REF;
}
} }

View File

@ -20,6 +20,7 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.BitField; import org.apache.poi.util.BitField;
import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.BitFieldFactory;
import org.apache.poi.util.LittleEndianOutput;
import org.apache.poi.util.StringUtil; import org.apache.poi.util.StringUtil;
/** /**
@ -78,14 +79,14 @@ public final class StringPtg extends ScalarConstantPtg {
return field_3_string; return field_3_string;
} }
public void writeBytes(byte[] array, int offset) { public void write(LittleEndianOutput out) {
array[offset + 0] = sid; out.writeByte(sid + getPtgClass());
array[offset + 1] = (byte) field_1_length; out.writeByte(field_1_length);
array[offset + 2] = field_2_options; out.writeByte(field_2_options);
if (fHighByte.isSet(field_2_options)) { if (fHighByte.isSet(field_2_options)) {
StringUtil.putUnicodeLE(getValue(), array, offset + 3); StringUtil.putUnicodeLE(getValue(), out);
} else { } else {
StringUtil.putCompressedUnicode(getValue(), array, offset + 3); StringUtil.putCompressedUnicode(getValue(), out);
} }
} }

View File

@ -19,7 +19,7 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordFormatException; import org.apache.poi.hssf.record.RecordFormatException;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianOutput;
/** /**
* This ptg indicates a data table. * This ptg indicates a data table.
@ -48,10 +48,10 @@ public final class TblPtg extends ControlPtg {
field_2_first_col = in.readUShort(); field_2_first_col = in.readUShort();
} }
public void writeBytes(byte [] array, int offset) { public void write(LittleEndianOutput out) {
LittleEndian.putByte(array, offset+0, sid); out.writeByte(sid + getPtgClass());
LittleEndian.putUShort(array, offset+1, field_1_first_row); out.writeShort(field_1_first_row);
LittleEndian.putUShort(array, offset+3, field_2_first_col); out.writeShort(field_2_first_col);
} }
public int getSize() { public int getSize() {

View File

@ -17,6 +17,8 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndianOutput;
/** /**
* @author Glen Stampoultzis (glens at apache.org) * @author Glen Stampoultzis (glens at apache.org)
@ -39,9 +41,8 @@ public final class UnionPtg extends OperationPtg {
return 1; return 1;
} }
public void writeBytes( byte[] array, int offset ) public void write(LittleEndianOutput out) {
{ out.writeByte(sid + getPtgClass());
array[ offset + 0 ] = sid;
} }
public String toFormulaString() public String toFormulaString()

View File

@ -16,7 +16,7 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.util.LittleEndianOutput;
/** /**
* *
@ -25,22 +25,17 @@ import org.apache.poi.hssf.record.RecordInputStream;
*/ */
public class UnknownPtg extends Ptg { public class UnknownPtg extends Ptg {
private short size = 1; private short size = 1;
private final int _sid;
/** Creates new UnknownPtg */ public UnknownPtg(int sid) {
_sid = sid;
public UnknownPtg()
{
}
public UnknownPtg(RecordInputStream in) {
// doesn't need anything
} }
public boolean isBaseToken() { public boolean isBaseToken() {
return true; return true;
} }
public void writeBytes(byte [] array, int offset) public void write(LittleEndianOutput out) {
{ out.writeByte(_sid);
} }
public int getSize() public int getSize()
@ -55,8 +50,6 @@ public class UnknownPtg extends Ptg {
public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;} public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
public Object clone() { public Object clone() {
return new UnknownPtg(); return this;
} }
} }

View File

@ -17,11 +17,12 @@
package org.apache.poi.hssf.record.formula; package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.util.LittleEndianOutput;
/** /**
* Common superclass of all value operators. * Common superclass of all value operators. Subclasses include all unary and
* Subclasses include all unary and binary operators except for the reference operators (IntersectionPtg, RangePtg, UnionPtg) * binary operators except for the reference operators (IntersectionPtg,
* RangePtg, UnionPtg)
* *
* @author Josh Micich * @author Josh Micich
*/ */
@ -38,8 +39,8 @@ public abstract class ValueOperatorPtg extends OperationPtg {
return Ptg.CLASS_VALUE; return Ptg.CLASS_VALUE;
} }
public final void writeBytes(byte[] array, int offset) { public void write(LittleEndianOutput out) {
array[offset + 0] = getSid(); out.writeByte(getSid());
} }
protected abstract byte getSid(); protected abstract byte getSid();
@ -47,8 +48,9 @@ public abstract class ValueOperatorPtg extends OperationPtg {
public final int getSize() { public final int getSize() {
return 1; return 1;
} }
public final String toFormulaString() {
// TODO - prune this method out of the hierarchy public final String toFormulaString() {
throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs"); // TODO - prune this method out of the hierarchy
throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs");
} }
} }

View File

@ -0,0 +1,84 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.util;
/**
* Adapts a plain byte array to {@link LittleEndianOutput}
*
*
* @author Josh Micich
*/
public final class LittleEndianByteArrayOutputStream implements LittleEndianOutput {
private final byte[] _buf;
private final int _endIndex;
private int _writeIndex;
public LittleEndianByteArrayOutputStream(byte[] buf, int startOffset, int maxWriteLen) {
_buf = buf;
_writeIndex = startOffset;
_endIndex = startOffset + maxWriteLen;
}
public LittleEndianByteArrayOutputStream(byte[] buf, int startOffset) {
this(buf, startOffset, buf.length - startOffset);
}
private void checkPosition(int i) {
if (i > _endIndex - _writeIndex) {
throw new RuntimeException("Buffer overrun");
}
}
public void writeByte(int v) {
checkPosition(1);
_buf[_writeIndex++] = (byte)v;
}
public void writeDouble(double v) {
writeLong(Double.doubleToLongBits(v));
}
public void writeInt(int v) {
checkPosition(4);
int i = _writeIndex;
_buf[i++] = (byte)((v >>> 0) & 0xFF);
_buf[i++] = (byte)((v >>> 8) & 0xFF);
_buf[i++] = (byte)((v >>> 16) & 0xFF);
_buf[i++] = (byte)((v >>> 24) & 0xFF);
_writeIndex = i;
}
public void writeLong(long v) {
writeInt((int)(v >> 0));
writeInt((int)(v >> 32));
}
public void writeShort(int v) {
checkPosition(2);
int i = _writeIndex;
_buf[i++] = (byte)((v >>> 0) & 0xFF);
_buf[i++] = (byte)((v >>> 8) & 0xFF);
_writeIndex = i;
}
public void write(byte[] b) {
int len = b.length;
checkPosition(len);
System.arraycopy(b, 0, _buf, _writeIndex, len);
_writeIndex += len;
}
}