From: Josh Micich Date: Thu, 23 Oct 2008 22:28:05 +0000 (+0000) Subject: Converted Ptgs to use LittleEndianOutput X-Git-Tag: trunk_20081106~42 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=4f54a9b5576aad8a8a8dc795b4f0edabbeb6bb14;p=poi.git Converted Ptgs to use LittleEndianOutput git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@707486 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/hssf/record/LinkedDataFormulaField.java b/src/java/org/apache/poi/hssf/record/LinkedDataFormulaField.java index 4a607c9e37..36aeb7b47c 100644 --- a/src/java/org/apache/poi/hssf/record/LinkedDataFormulaField.java +++ b/src/java/org/apache/poi/hssf/record/LinkedDataFormulaField.java @@ -51,7 +51,7 @@ public final class LinkedDataFormulaField { .append( "=" ) .append(ptg.toString() ) .append( "\n" ) - .append(ptg.toDebugString() ) + .append(ptg.toString()) .append( "\n" ); } } diff --git a/src/java/org/apache/poi/hssf/record/TextObjectRecord.java b/src/java/org/apache/poi/hssf/record/TextObjectRecord.java index 6529dc93f8..91780ee447 100644 --- a/src/java/org/apache/poi/hssf/record/TextObjectRecord.java +++ b/src/java/org/apache/poi/hssf/record/TextObjectRecord.java @@ -25,6 +25,8 @@ import org.apache.poi.util.BitField; import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.HexDump; 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 @@ -190,36 +192,31 @@ public final class TextObjectRecord extends Record { private int serializeTXORecord(int offset, byte[] data) { int dataSize = getDataSize(); + int recSize = dataSize+4; + LittleEndianOutput out = new LittleEndianByteArrayOutputStream(data, offset, recSize); - LittleEndian.putUShort(data, 0 + offset, TextObjectRecord.sid); - LittleEndian.putUShort(data, 2 + offset, dataSize); - + out.writeShort(TextObjectRecord.sid); + out.writeShort(dataSize); - LittleEndian.putUShort(data, 4 + offset, field_1_options); - LittleEndian.putUShort(data, 6 + offset, field_2_textOrientation); - LittleEndian.putUShort(data, 8 + offset, field_3_reserved4); - LittleEndian.putUShort(data, 10 + offset, field_4_reserved5); - LittleEndian.putUShort(data, 12 + offset, field_5_reserved6); - LittleEndian.putUShort(data, 14 + offset, _text.length()); - LittleEndian.putUShort(data, 16 + offset, getFormattingDataLength()); - LittleEndian.putInt(data, 18 + offset, field_8_reserved7); + out.writeShort(field_1_options); + out.writeShort(field_2_textOrientation); + out.writeShort(field_3_reserved4); + out.writeShort(field_4_reserved5); + out.writeShort(field_5_reserved6); + out.writeShort(_text.length()); + out.writeShort(getFormattingDataLength()); + out.writeInt(field_8_reserved7); if (_linkRefPtg != null) { - int pos = offset+22; int formulaSize = _linkRefPtg.getSize(); - LittleEndian.putUShort(data, pos, formulaSize); - pos += LittleEndian.SHORT_SIZE; - LittleEndian.putInt(data, pos, _unknownPreFormulaInt); - pos += LittleEndian.INT_SIZE; - _linkRefPtg.writeBytes(data, pos); - pos += formulaSize; + out.writeShort(formulaSize); + out.writeInt(_unknownPreFormulaInt); + _linkRefPtg.write(out); if (_unknownPostFormulaByte != null) { - LittleEndian.putByte(data, pos, _unknownPostFormulaByte.byteValue()); - pos += LittleEndian.BYTE_SIZE; + out.writeByte(_unknownPostFormulaByte.byteValue()); } } - - return 4 + dataSize; + return recSize; } private int serializeTrailingRecords(int offset, byte[] data) { diff --git a/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java b/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java index 037ebb83ae..8e1f9ffe93 100644 --- a/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java @@ -98,7 +98,6 @@ public abstract class AbstractFunctionPtg extends OperationPtg { buf.append(")"); } - public abstract void writeBytes(byte[] array, int offset); public abstract int getSize(); diff --git a/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java b/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java index f16a200779..5bee0afe03 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java +++ b/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java @@ -18,41 +18,47 @@ package org.apache.poi.hssf.record.formula; 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 { - 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) { super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative); } + protected Area2DPtgBase(RecordInputStream in) { readCoordinates(in); } + protected abstract byte getSid(); - public final void writeBytes(byte [] array, int offset) { - LittleEndian.putByte(array, offset+0, getSid() + getPtgClass()); - writeCoordinates(array, offset+1); + public final void write(LittleEndianOutput out) { + out.writeByte(getSid() + getPtgClass()); + writeCoordinates(out); } + public Area2DPtgBase(String arearef) { - super(arearef); + super(arearef); } + public final int getSize() { return SIZE; } + 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(); - } } diff --git a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java index 58cdc5b275..e5c2fdc10d 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java @@ -21,7 +21,7 @@ import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.ss.formula.ExternSheetReferenceToken; import org.apache.poi.ss.formula.FormulaRenderingWorkbook; 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)

@@ -67,10 +67,10 @@ public final class Area3DPtg extends AreaPtgBase implements WorkbookDependentFor return sb.toString(); } - public void writeBytes(byte[] array, int offset) { - LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); - LittleEndian.putUShort(array, 1 + offset, field_1_index_extern_sheet); - writeCoordinates(array, offset+3); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_1_index_extern_sheet); + writeCoordinates(out); } public int getSize() { diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java b/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java index bfe247897d..f50af0d0cf 100644 --- a/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java @@ -19,7 +19,7 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; 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. @@ -42,10 +42,10 @@ public final class AreaErrPtg extends OperandPtg { unused2 = in.readInt(); } - public void writeBytes(byte[] array, int offset) { - LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); - LittleEndian.putInt(array, offset + 1, unused1); - LittleEndian.putInt(array, offset + 5, unused2); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeInt(unused1); + out.writeInt(unused2); } public String toFormulaString() { diff --git a/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java b/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java index d6df1fe4b2..2fa1290c0c 100644 --- a/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java +++ b/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java @@ -22,7 +22,7 @@ import org.apache.poi.hssf.util.AreaReference; import org.apache.poi.hssf.util.CellReference; import org.apache.poi.util.BitField; 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. @@ -46,7 +46,7 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { private int field_3_first_column; /** zero based, unsigned 8 bit */ private int field_4_last_column; - + private final static BitField rowRelative = BitFieldFactory.getInstance(0x8000); private final static BitField colRelative = BitFieldFactory.getInstance(0x4000); private final static BitField columnMask = BitFieldFactory.getInstance(0x3FFF); @@ -54,7 +54,7 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { protected AreaPtgBase() { // do nothing } - + protected AreaPtgBase(String arearef) { AreaReference ar = new AreaReference(arearef); CellReference firstCell = ar.getFirstCell(); @@ -66,17 +66,17 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { setFirstColRelative(!firstCell.isColAbsolute()); setLastColRelative(!lastCell.isColAbsolute()); setFirstRowRelative(!firstCell.isRowAbsolute()); - setLastRowRelative(!lastCell.isRowAbsolute()); + setLastRowRelative(!lastCell.isRowAbsolute()); } - + protected AreaPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) { - + checkColumnBounds(firstColumn); checkColumnBounds(lastColumn); checkRowBounds(firstRow); checkRowBounds(lastRow); - + if (lastRow > firstRow) { setFirstRow(firstRow); setLastRow(lastRow); @@ -88,7 +88,7 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { setFirstRowRelative(lastRowRelative); setLastRowRelative(firstRowRelative); } - + if (lastColumn > firstColumn) { setFirstColumn(firstColumn); setLastColumn(lastColumn); @@ -100,7 +100,7 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { setFirstColRelative(lastColRelative); setLastColRelative(firstColRelative); } - } + } private static void checkColumnBounds(int colIx) { if((colIx & 0x0FF) != colIx) { @@ -119,11 +119,11 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { field_3_first_column = in.readUShort(); field_4_last_column = in.readUShort(); } - protected final void writeCoordinates(byte[] array, int offset) { - LittleEndian.putUShort(array, offset + 0, field_1_first_row); - LittleEndian.putUShort(array, offset + 2, field_2_last_row); - LittleEndian.putUShort(array, offset + 4, field_3_first_column); - LittleEndian.putUShort(array, offset + 6, field_4_last_column); + protected final void writeCoordinates(LittleEndianOutput out) { + out.writeShort(field_1_first_row); + out.writeShort(field_2_last_row); + out.writeShort(field_3_first_column); + out.writeShort(field_4_last_column); } /** @@ -150,7 +150,7 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { } /** - * @param rowIx last row number in the area + * @param rowIx last row number in the area */ public final void setLastRow(int rowIx) { checkRowBounds(rowIx); @@ -177,7 +177,7 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { public final boolean isFirstRowRelative() { return rowRelative.isSet(field_3_first_column); } - + /** * sets the first row to relative or not * @param rel is relative or not. @@ -192,9 +192,9 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { public final boolean isFirstColRelative() { return colRelative.isSet(field_3_first_column); } - + /** - * set whether the first column is relative + * set whether the first column is relative */ public final void setFirstColRelative(boolean rel) { field_3_first_column=colRelative.setBoolean(field_3_first_column,rel); @@ -235,7 +235,7 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { public final boolean isLastRowRelative() { return rowRelative.isSet(field_4_last_column); } - + /** * set whether the last row is relative or not * @param rel true if the last row relative, else @@ -251,14 +251,14 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { public final boolean isLastColRelative() { return colRelative.isSet(field_4_last_column); } - + /** * set whether the last column should be relative or not */ public final void setLastColRelative(boolean rel) { field_4_last_column=colRelative.setBoolean(field_4_last_column,rel); } - + /** * set the last column in the area */ @@ -276,13 +276,13 @@ public abstract class AreaPtgBase extends OperandPtg implements AreaI { protected final String formatReferenceAsString() { CellReference topLeft = new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative()); CellReference botRight = new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative()); - + if(AreaReference.isWholeColumnReference(topLeft, botRight)) { return (new AreaReference(topLeft, botRight)).formatAsString(); } - return topLeft.formatAsString() + ":" + botRight.formatAsString(); + return topLeft.formatAsString() + ":" + botRight.formatAsString(); } - + public String toFormulaString() { return formatReferenceAsString(); } diff --git a/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java b/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java index 1b025872d4..21df3982a2 100644 --- a/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java @@ -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.ErrorConstant; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** * ArrayPtg - handles arrays @@ -153,10 +154,9 @@ public final class ArrayPtg extends Ptg { return rowIx * token_1_columns + colIx; } - public void writeBytes(byte[] data, int offset) { - - LittleEndian.putByte(data, offset + 0, sid + getPtgClass()); - System.arraycopy(field_1_reserved, 0, data, offset+1, RESERVED_FIELD_LEN); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.write(field_1_reserved); } public int writeTokenValueBytes(byte[] data, int offset) { diff --git a/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java b/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java index ea0afcc377..51d3194c0b 100644 --- a/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java @@ -21,6 +21,7 @@ import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.util.BitField; import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** * "Special Attributes" @@ -213,19 +214,16 @@ public final class AttrPtg extends ControlPtg { return sb.toString(); } - public void writeBytes(byte [] array, int offset) - { - LittleEndian.putByte(array, offset+0, sid); - LittleEndian.putByte(array, offset+1, field_1_options); - LittleEndian.putShort(array,offset+2, field_2_data); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeByte(field_1_options); + out.writeShort(field_2_data); int[] jt = _jumpTable; if (jt != null) { - int joff = offset+4; for (int i = 0; i < jt.length; i++) { - LittleEndian.putUShort(array, joff, jt[i]); - joff+=2; + out.writeShort(jt[i]); } - LittleEndian.putUShort(array, joff, _chooseFuncOffset); + out.writeShort(_chooseFuncOffset); } } diff --git a/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java b/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java index f975b0419e..8dfbca33fa 100644 --- a/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java @@ -18,41 +18,42 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; +import org.apache.poi.util.LittleEndianOutput; /** - * Boolean (boolean) - * Stores a (java) boolean value in a formula. + * Boolean (boolean) Stores a (java) boolean value in a formula. + * * @author Paul Krause (pkrause at soundbite dot com) * @author Andrew C. Oliver (acoliver at apache dot org) * @author Jason Height (jheight at chariot dot net dot au) */ public final class BoolPtg extends ScalarConstantPtg { - public final static int SIZE = 2; - public final static byte sid = 0x1d; - private final boolean _value; - - public BoolPtg(RecordInputStream in) { - _value = (in.readByte() == 1); - } - - public BoolPtg(String formulaToken) { - _value = (formulaToken.equalsIgnoreCase("TRUE")); - } - - public boolean getValue() { - return _value; - } - - public void writeBytes(byte [] array, int offset) { - array[ offset + 0 ] = sid; - array[ offset + 1 ] = (byte) (_value ? 1 : 0); - } - - public int getSize() { - return SIZE; - } - - public String toFormulaString() { - return _value ? "TRUE" : "FALSE"; - } + public final static int SIZE = 2; + public final static byte sid = 0x1D; + private final boolean _value; + + public BoolPtg(RecordInputStream in) { + _value = (in.readByte() == 1); + } + + public BoolPtg(String formulaToken) { + _value = (formulaToken.equalsIgnoreCase("TRUE")); + } + + public boolean getValue() { + return _value; + } + + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeByte(_value ? 1 : 0); + } + + public int getSize() { + return SIZE; + } + + public String toFormulaString() { + return _value ? "TRUE" : "FALSE"; + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java index a45cfcd69e..9aa07dddfc 100644 --- a/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java @@ -19,9 +19,9 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; 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.util.LittleEndian; +import org.apache.poi.ss.formula.WorkbookDependentFormula; +import org.apache.poi.util.LittleEndianOutput; /** * Title: Deleted Area 3D Ptg - 3D referecnce (Sheet + Area)

@@ -60,10 +60,10 @@ public final class DeletedArea3DPtg extends OperandPtg implements WorkbookDepend public int getSize() { return 11; } - public void writeBytes(byte[] data, int offset) { - LittleEndian.putByte(data, 0 + offset, sid + getPtgClass()); - LittleEndian.putUShort(data, 1 + offset, field_1_index_extern_sheet); - LittleEndian.putInt(data, 3 + offset, unused1); - LittleEndian.putInt(data, 7 + offset, unused2); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_1_index_extern_sheet); + out.writeInt(unused1); + out.writeInt(unused2); } } diff --git a/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java index 4dbf09b7ff..90ac7efac7 100644 --- a/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java @@ -20,9 +20,9 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; 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.util.LittleEndian; +import org.apache.poi.ss.formula.WorkbookDependentFormula; +import org.apache.poi.util.LittleEndianOutput; /** * Title: Deleted Reference 3D Ptg

@@ -60,9 +60,9 @@ public final class DeletedRef3DPtg extends OperandPtg implements WorkbookDepende public int getSize() { return 7; } - public void writeBytes(byte[] data, int offset) { - LittleEndian.putByte(data, 0 + offset, sid + getPtgClass()); - LittleEndian.putUShort(data, 1 + offset, field_1_index_extern_sheet); - LittleEndian.putInt(data, 3 + offset, unused1); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_1_index_extern_sheet); + out.writeInt(unused1); } } diff --git a/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java b/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java index 65d40dc51e..f2720e52d8 100644 --- a/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java @@ -19,6 +19,7 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.usermodel.HSSFErrorConstants; +import org.apache.poi.util.LittleEndianOutput; /** * @author Daniel Noll (daniel at nuix dot com dot au) @@ -61,10 +62,9 @@ public final class ErrPtg extends ScalarConstantPtg { return valueOf(in.readByte()); } - public void writeBytes(byte [] array, int offset) - { - array[offset] = (byte) (sid + getPtgClass()); - array[offset + 1] = (byte)field_1_error_code; + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeByte(field_1_error_code); } public String toFormulaString() { diff --git a/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java b/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java index 5c48aeb6b0..9a75a627bf 100644 --- a/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java @@ -19,7 +19,7 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordFormatException; import org.apache.poi.hssf.record.RecordInputStream; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** * @@ -38,37 +38,36 @@ public final class ExpPtg extends ControlPtg { field_1_first_row = in.readShort(); field_2_first_col = in.readShort(); } - - public void writeBytes(byte [] array, int offset) - { - array[offset+0]= (byte) (sid); - LittleEndian.putShort(array,offset+1,field_1_first_row); - LittleEndian.putShort(array,offset+3,field_2_first_col); + + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_1_first_row); + out.writeShort(field_2_first_col); } public int getSize() { return SIZE; } - + public short getRow() { return field_1_first_row; } public short getColumn() { return field_2_first_col; - } + } public String toFormulaString() { throw new RecordFormatException("Coding Error: Expected ExpPtg to be converted from Shared to Non-Shared Formula by ValueRecordsAggregate, but it wasn't"); } - + public String toString() { StringBuffer buffer = new StringBuffer("[Array Formula or Shared Formula]\n"); buffer.append("row = ").append(getRow()).append("\n"); buffer.append("col = ").append(getColumn()).append("\n"); return buffer.toString(); - } + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java b/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java index c0034b24fb..3265f88b1d 100644 --- a/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/FuncPtg.java @@ -16,10 +16,10 @@ ==================================================================== */ 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.formula.function.FunctionMetadata; import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry; +import org.apache.poi.util.LittleEndianOutput; /** * @author aviks @@ -55,9 +55,9 @@ public final class FuncPtg extends AbstractFunctionPtg { paramClass = fm.getParameterClassCodes(); } - public void writeBytes(byte[] array, int offset) { - array[offset+0]= (byte) (sid + getPtgClass()); - LittleEndian.putShort(array,offset+1,field_2_fnc_index); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_2_fnc_index); } public int getNumberOfOperands() { diff --git a/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java b/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java index fd3546250a..6a6ccda8ae 100644 --- a/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java @@ -16,10 +16,10 @@ ==================================================================== */ 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.formula.function.FunctionMetadata; 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) { - array[offset+0]=(byte) (sid + getPtgClass()); - array[offset+1]=field_1_num_args; - LittleEndian.putShort(array,offset+2,field_2_fnc_index); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeByte(field_1_num_args); + out.writeShort(field_2_fnc_index); } public int getNumberOfOperands() { diff --git a/src/java/org/apache/poi/hssf/record/formula/IntPtg.java b/src/java/org/apache/poi/hssf/record/formula/IntPtg.java index ea3fc80bd6..4df6d6f22f 100644 --- a/src/java/org/apache/poi/hssf/record/formula/IntPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/IntPtg.java @@ -18,57 +18,59 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** - * Integer (unsigned short integer) - * Stores an unsigned short value (java int) in a formula - * @author Andrew C. Oliver (acoliver at apache dot org) + * Integer (unsigned short integer) Stores an unsigned short value (java int) in + * a formula + * + * @author Andrew C. Oliver (acoliver at apache dot org) * @author Jason Height (jheight at chariot dot net dot au) */ public final class IntPtg extends ScalarConstantPtg { - // 16 bit unsigned integer - private static final int MIN_VALUE = 0x0000; - private static final int MAX_VALUE = 0xFFFF; - - /** - * Excel represents integers 0..65535 with the tInt token. - * @return true if the specified value is within the range of values - * IntPtg can represent. - */ - public static boolean isInRange(int i) { - return i>=MIN_VALUE && i <=MAX_VALUE; - } + // 16 bit unsigned integer + private static final int MIN_VALUE = 0x0000; + private static final int MAX_VALUE = 0xFFFF; - public final static int SIZE = 3; - public final static byte sid = 0x1e; - private final int field_1_value; - - public IntPtg(RecordInputStream in) { - this(in.readUShort()); - } + /** + * Excel represents integers 0..65535 with the tInt token. + * + * @return true if the specified value is within the range of values + * IntPtg can represent. + */ + public static boolean isInRange(int i) { + return i >= MIN_VALUE && i <= MAX_VALUE; + } - public IntPtg(int value) { - if(!isInRange(value)) { - throw new IllegalArgumentException("value is out of range: " + value); - } - field_1_value = value; - } + public final static int SIZE = 3; + public final static byte sid = 0x1e; + private final int field_1_value; - public int getValue() { - return field_1_value; - } + public IntPtg(RecordInputStream in) { + this(in.readUShort()); + } - public void writeBytes(byte [] array, int offset) { - array[ offset + 0 ] = sid; - LittleEndian.putUShort(array, offset + 1, getValue()); - } + public IntPtg(int value) { + if (!isInRange(value)) { + throw new IllegalArgumentException("value is out of range: " + value); + } + field_1_value = value; + } - public int getSize() { - return SIZE; - } + public int getValue() { + return field_1_value; + } - public String toFormulaString() { - return String.valueOf(getValue()); - } + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(getValue()); + } + + public int getSize() { + return SIZE; + } + + public String toFormulaString() { + return String.valueOf(getValue()); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java b/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java index f96c5ecb1a..0e6771de35 100644 --- a/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java @@ -17,54 +17,46 @@ package org.apache.poi.hssf.record.formula; +import org.apache.poi.util.LittleEndianOutput; /** * @author Daniel Noll (daniel at nuix dot com dot au) */ 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() { - // enforce singleton - } + private IntersectionPtg() { + // enforce singleton + } - public final boolean isBaseToken() { - return true; - } + public final boolean isBaseToken() { + return true; + } - public int getSize() - { - return 1; - } + public int getSize() { + return 1; + } - public void writeBytes( byte[] array, int offset ) - { - array[ offset + 0 ] = sid; - } + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + } - /** Implementation of method from Ptg */ - public String toFormulaString() - { - return " "; - } + public String toFormulaString() { + return " "; + } + public String toFormulaString(String[] operands) { + StringBuffer buffer = new StringBuffer(); - /** implementation of method from OperationsPtg*/ - public String toFormulaString(String[] operands) - { - StringBuffer buffer = new StringBuffer(); - - buffer.append(operands[ 0 ]); - buffer.append(" "); - buffer.append(operands[ 1 ]); - return buffer.toString(); - } - - public int getNumberOfOperands() - { - return 2; - } + buffer.append(operands[0]); + buffer.append(" "); + buffer.append(operands[1]); + return buffer.toString(); + } + public int getNumberOfOperands() { + return 2; + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java b/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java index 951fd7c436..9e9c090510 100644 --- a/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java @@ -18,67 +18,44 @@ package org.apache.poi.hssf.record.formula; 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) */ public class MemAreaPtg extends OperandPtg { - public final static short sid = 0x26; - private final static int SIZE = 7; - private int field_1_reserved; - private short field_2_subex_len; - - /** Creates new MemAreaPtg */ - - public MemAreaPtg() - { - } - - public MemAreaPtg(RecordInputStream in) - { - field_1_reserved = in.readInt(); - field_2_subex_len = in.readShort(); - } - - public void setReserved(int res) - { - field_1_reserved = res; - } - - public int getReserved() - { - return field_1_reserved; - } - - public void setSubexpressionLength(short subexlen) - { - field_2_subex_len = subexlen; - } - - public short getSubexpressionLength() - { - 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; - } + public final static short sid = 0x26; + private final static int SIZE = 7; + private final int field_1_reserved; + private final int field_2_subex_len; + + /** Creates new MemAreaPtg */ + + public MemAreaPtg(int subexLen) { + field_1_reserved = 0; + field_2_subex_len = subexLen; + } + + public MemAreaPtg(RecordInputStream in) { + field_1_reserved = in.readInt(); + field_2_subex_len = in.readShort(); + } + + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeInt(field_1_reserved); + out.writeShort(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; + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java b/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java index d3de53fe13..dc87ec2734 100644 --- a/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java @@ -18,35 +18,40 @@ package org.apache.poi.hssf.record.formula; 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 Daniel Noll (daniel at nuix dot com dot au) */ - -public final class MemErrPtg extends MemAreaPtg { - public final static short sid = 0x27; - - /** Creates new MemErrPtg */ - - public MemErrPtg() - { - } - - public MemErrPtg(RecordInputStream in) { - super(in); - } - - public void writeBytes(byte [] array, int offset) { - super.writeBytes(array, offset); - array[offset] = (byte) (sid + getPtgClass()); - } - - public String toFormulaString() - { - return "ERR#"; - } +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 MemErrPtg(RecordInputStream in) { + field_1_reserved = in.readInt(); + field_2_subex_len = in.readShort(); + } + + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeInt(field_1_reserved); + out.writeShort(field_2_subex_len); + } + + public int getSize() { + return SIZE; + } + + public String toFormulaString() { + return "ERR#"; + } + + public byte getDefaultOperandClass() { + return Ptg.CLASS_VALUE; + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java b/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java index 991f1742c0..98557263c0 100644 --- a/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java @@ -18,55 +18,50 @@ package org.apache.poi.hssf.record.formula; 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) */ public final class MemFuncPtg extends OperandPtg { - public final static byte sid = 0x29; - private final int field_1_len_ref_subexpression; + public final static byte sid = 0x29; + private final int field_1_len_ref_subexpression; - /**Creates new function pointer from a byte array - * usually called while reading an excel file. - */ - public MemFuncPtg(RecordInputStream in) { - this(in.readUShort()); - } + /** + * Creates new function pointer from a byte array usually called while + * reading an excel file. + */ + public MemFuncPtg(RecordInputStream in) { + this(in.readUShort()); + } - public MemFuncPtg(int subExprLen) { - field_1_len_ref_subexpression = subExprLen; + public MemFuncPtg(int subExprLen) { + field_1_len_ref_subexpression = subExprLen; } - public int getSize() - { - return 3; - } + public int getSize() { + return 3; + } - public void writeBytes( byte[] array, int offset ) - { - array[offset + 0] = sid ; - LittleEndian.putUShort( array, offset + 1, field_1_len_ref_subexpression ); - } + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_1_len_ref_subexpression); + } - public String toFormulaString() - { - return ""; - } + public String toFormulaString() { + return ""; + } - public byte getDefaultOperandClass() - { - return Ptg.CLASS_REF; - } + public byte getDefaultOperandClass() { + return Ptg.CLASS_REF; + } - public int getNumberOfOperands() - { - return field_1_len_ref_subexpression; - } + public int getNumberOfOperands() { + return field_1_len_ref_subexpression; + } - public int getLenRefSubexpression() - { - return field_1_len_ref_subexpression; - } + public int getLenRefSubexpression() { + return field_1_len_ref_subexpression; + } } \ No newline at end of file diff --git a/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java b/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java index 075105f50c..99b7708a4b 100644 --- a/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java @@ -17,32 +17,35 @@ package org.apache.poi.hssf.record.formula; +import org.apache.poi.util.LittleEndianOutput; + /** * Missing Function Arguments - * + * * Avik Sengupta <avik at apache.org> + * * @author Jason Height (jheight at chariot dot net dot au) */ public final class MissingArgPtg extends ScalarConstantPtg { - - private final static int SIZE = 1; - public final static byte sid = 0x16; - - public static final Ptg instance = new MissingArgPtg(); - - private MissingArgPtg() { - // enforce singleton - } - - public void writeBytes(byte [] array, int offset) { - array[ offset + 0 ] = sid; - } - - public int getSize() { - return SIZE; - } - - public String toFormulaString() { - return " "; - } + + private final static int SIZE = 1; + public final static byte sid = 0x16; + + public static final Ptg instance = new MissingArgPtg(); + + private MissingArgPtg() { + // enforce singleton + } + + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + } + + public int getSize() { + return SIZE; + } + + public String toFormulaString() { + return " "; + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/NamePtg.java b/src/java/org/apache/poi/hssf/record/formula/NamePtg.java index 59670f8758..e44369d72d 100644 --- a/src/java/org/apache/poi/hssf/record/formula/NamePtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/NamePtg.java @@ -18,62 +18,62 @@ package org.apache.poi.hssf.record.formula; 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.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) */ public final class NamePtg extends OperandPtg implements WorkbookDependentFormula { - public final static short sid = 0x23; - private final static int SIZE = 5; - /** one-based index to defined name record */ - private int field_1_label_index; - private short field_2_zero; // reserved must be 0 + public final static short sid = 0x23; + private final static int SIZE = 5; + /** one-based index to defined name record */ + private int field_1_label_index; + private short field_2_zero; // reserved must be 0 - /** - * @param nameIndex zero-based index to name within workbook - */ - public NamePtg(int nameIndex) { - field_1_label_index = 1+nameIndex; // convert to 1-based - } + /** + * @param nameIndex zero-based index to name within workbook + */ + public NamePtg(int nameIndex) { + field_1_label_index = 1 + nameIndex; // convert to 1-based + } - /** Creates new NamePtg */ + /** Creates new NamePtg */ - public NamePtg(RecordInputStream in) { - field_1_label_index = in.readShort(); - field_2_zero = in.readShort(); - } - - /** - * @return zero based index to a defined name record in the LinkTable - */ - public int getIndex() { - return field_1_label_index-1; // convert to zero based - } + public NamePtg(RecordInputStream in) { + field_1_label_index = in.readShort(); + field_2_zero = in.readShort(); + } - public void writeBytes(byte [] array, int offset) { - LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); - LittleEndian.putUShort(array, offset + 1, field_1_label_index); - LittleEndian.putUShort(array, offset + 3, field_2_zero); - } + /** + * @return zero based index to a defined name record in the LinkTable + */ + public int getIndex() { + return field_1_label_index - 1; // convert to zero based + } - public int getSize() { - return SIZE; - } + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_1_label_index); + out.writeShort(field_2_zero); + } + + public int getSize() { + return SIZE; + } + + public String toFormulaString(FormulaRenderingWorkbook book) { + return book.getNameText(this); + } - public String toFormulaString(FormulaRenderingWorkbook book) - { - return book.getNameText(this); - } public String toFormulaString() { throw new RuntimeException("3D references need a workbook to determine formula text"); } - - public byte getDefaultOperandClass() { + + public byte getDefaultOperandClass() { return Ptg.CLASS_REF; } } diff --git a/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java b/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java index 7f1614347f..bf8ea13561 100644 --- a/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java @@ -18,9 +18,9 @@ package org.apache.poi.hssf.record.formula; 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.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()); } - public void writeBytes(byte[] array, int offset) { - LittleEndian.putByte(array, offset + 0, sid + getPtgClass()); - LittleEndian.putUShort(array, offset + 1, _sheetRefIndex); - LittleEndian.putUShort(array, offset + 3, _nameNumber); - LittleEndian.putUShort(array, offset + 5, _reserved); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(_sheetRefIndex); + out.writeShort(_nameNumber); + out.writeShort(_reserved); } public int getSize() { diff --git a/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java b/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java index c4aa973486..52779e0641 100644 --- a/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java @@ -18,53 +18,54 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** - * Number - * Stores a floating point value in a formula - * value stored in a 8 byte field using IEEE notation - * @author Avik Sengupta + * Number Stores a floating point value in a formula value stored in a 8 byte + * field using IEEE notation + * + * @author Avik Sengupta * @author Jason Height (jheight at chariot dot net dot au) */ public final class NumberPtg extends ScalarConstantPtg { - public final static int SIZE = 9; - public final static byte sid = 0x1f; - private final double field_1_value; - - /** Create a NumberPtg from a byte array read from disk */ - public NumberPtg(RecordInputStream in) { - 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 - * that calls this method. - * @param value : String representation of a floating point number - */ - public NumberPtg(String value) { - this(Double.parseDouble(value)); - } - - public NumberPtg(double value) { - field_1_value = value; - } - - public double getValue() { - return field_1_value; - } + public final static int SIZE = 9; + public final static byte sid = 0x1f; + private final double field_1_value; - public void writeBytes(byte [] array, int offset) { - array[ offset + 0 ] = sid; - LittleEndian.putDouble(array, offset + 1, getValue()); - } + public NumberPtg(RecordInputStream in) { + this(in.readDouble()); + } - public int getSize() { - return SIZE; - } + /** + * Create a NumberPtg from a string representation of the number Number + * format is not checked, it is expected to be validated in the parser that + * calls this method. + * + * @param value String representation of a floating point number + */ + public NumberPtg(String value) { + this(Double.parseDouble(value)); + } - public String toFormulaString() { - // TODO - java's rendering of double values is not quite same as excel's - return String.valueOf(field_1_value); - } + public NumberPtg(double value) { + field_1_value = value; + } + + public double getValue() { + return field_1_value; + } + + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeDouble(getValue()); + } + + public int getSize() { + return SIZE; + } + + public String toFormulaString() { + // TODO - java's rendering of double values is not quite same as excel's + return String.valueOf(field_1_value); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java b/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java index 5365b939d8..1b94c90383 100644 --- a/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java @@ -15,46 +15,44 @@ limitations under the License. ==================================================================== */ - 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 - * precedence reasons, Parenthesis tokens ARE written to ensure that user entered - * parenthesis are displayed as-is on reading back - * - * Avik Sengupta <lists@aviksengupta.com> - * Andrew C. Oliver (acoliver at apache dot org) + * While formula tokens are stored in RPN order and thus do not need parenthesis + * for precedence reasons, Parenthesis tokens ARE written to ensure that user + * entered parenthesis are displayed as-is on reading back + * + * Avik Sengupta <lists@aviksengupta.com> Andrew C. Oliver (acoliver at + * apache dot org) + * * @author Jason Height (jheight at chariot dot net dot au) */ public final class ParenthesisPtg extends ControlPtg { - - private final static int SIZE = 1; - public final static byte sid = 0x15; - - public static final ControlPtg instance = new ParenthesisPtg(); - private ParenthesisPtg() { - // enforce singleton - } - - public void writeBytes(byte [] array, int offset) - { - array[ offset + 0 ] = sid; - } - - public int getSize() - { - return SIZE; - } - - public String toFormulaString() - { - return "()"; - } - - - public String toFormulaString(String[] operands) { - return "("+operands[0]+")"; - } + + private final static int SIZE = 1; + public final static byte sid = 0x15; + + public static final ControlPtg instance = new ParenthesisPtg(); + + private ParenthesisPtg() { + // enforce singleton + } + + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + } + + public int getSize() { + return SIZE; + } + + public String toFormulaString() { + return "()"; + } + + public String toFormulaString(String[] operands) { + return "(" + operands[0] + ")"; + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/Ptg.java b/src/java/org/apache/poi/hssf/record/formula/Ptg.java index a264481d43..a1a826dbbf 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Ptg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Ptg.java @@ -21,7 +21,7 @@ import java.util.ArrayList; import java.util.List; 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; /** @@ -128,7 +128,7 @@ public abstract class Ptg implements Cloneable { private static Ptg createBasePtg(byte id, RecordInputStream in) { 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 TblPtg.sid: return new TblPtg(in); // 0x02 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) { int pos = 0; - int size = ptgs.length; + int nTokens = ptgs.length; + + LittleEndianOutput out = new LittleEndianByteArrayOutputStream(array, offset); List arrayPtgs = null; - for (int k = 0; k < size; k++) { + for (int k = 0; k < nTokens; k++) { Ptg ptg = ptgs[k]; - ptg.writeBytes(array, pos + offset); + ptg.write(out); if (ptg instanceof ArrayPtg) { if (arrayPtgs == null) { arrayPtgs = new ArrayList(5); @@ -266,38 +268,12 @@ public abstract class Ptg implements Cloneable { */ // public abstract int getDataSize(); - public final byte[] getBytes() - { - 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 - } + public abstract void write(LittleEndianOutput out); /** * return a string representation of this token alone */ 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. * This helps get rid of gratuitous diffs when comparing two dumps diff --git a/src/java/org/apache/poi/hssf/record/formula/RangePtg.java b/src/java/org/apache/poi/hssf/record/formula/RangePtg.java index 658e2f47b4..c2507244da 100644 --- a/src/java/org/apache/poi/hssf/record/formula/RangePtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/RangePtg.java @@ -17,6 +17,8 @@ package org.apache.poi.hssf.record.formula; +import org.apache.poi.util.LittleEndianOutput; + /** * @author Daniel Noll (daniel at nuix dot com dot au) @@ -40,9 +42,8 @@ public final class RangePtg extends OperationPtg { return SIZE; } - public void writeBytes( byte[] array, int offset ) - { - array[ offset + 0 ] = sid; + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); } public String toFormulaString() diff --git a/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java b/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java index 545ff0bfc4..f2fcd504c7 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java +++ b/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java @@ -18,50 +18,54 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** * @author Josh Micich */ 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 - * numeric fields. - */ - protected Ref2DPtgBase(String cellref) { - super(cellref); - } + /** + * Takes in a String representation of a cell reference and fills out the + * numeric fields. + */ + protected Ref2DPtgBase(String cellref) { + super(cellref); + } - protected Ref2DPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) { - setRow(row); - setColumn(column); - setRowRelative(isRowRelative); - setColRelative(isColumnRelative); - } + protected Ref2DPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) { + setRow(row); + setColumn(column); + setRowRelative(isRowRelative); + setColRelative(isColumnRelative); + } - protected Ref2DPtgBase(RecordInputStream in) { - readCoordinates(in); - } - public final void writeBytes(byte [] array, int offset) { - LittleEndian.putByte(array, offset+0, getSid() + getPtgClass()); - writeCoordinates(array, offset+1); - } - public final String toFormulaString() { - return formatReferenceAsString(); - } + protected Ref2DPtgBase(RecordInputStream in) { + readCoordinates(in); + } + + public void write(LittleEndianOutput out) { + out.writeByte(getSid() + getPtgClass()); + writeCoordinates(out); + } + + public final String toFormulaString() { + return formatReferenceAsString(); + } protected abstract byte getSid(); - public final int getSize() { - return SIZE; - } - public final String toString() { - StringBuffer sb = new StringBuffer(); - sb.append(getClass().getName()); - sb.append(" ["); - sb.append(formatReferenceAsString()); - sb.append("]"); - return sb.toString(); - } + + public final int getSize() { + return SIZE; + } + + public final String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(getClass().getName()); + sb.append(" ["); + sb.append(formatReferenceAsString()); + sb.append("]"); + return sb.toString(); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java index 217990d733..ff86b8c3c8 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java @@ -22,7 +22,7 @@ import org.apache.poi.hssf.util.CellReference; import org.apache.poi.ss.formula.ExternSheetReferenceToken; import org.apache.poi.ss.formula.FormulaRenderingWorkbook; import org.apache.poi.ss.formula.WorkbookDependentFormula; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** * Title: Reference 3D Ptg

@@ -66,10 +66,10 @@ public final class Ref3DPtg extends RefPtgBase implements WorkbookDependentFormu return sb.toString(); } - public void writeBytes(byte [] array, int offset) { - LittleEndian.putByte(array, 0 + offset, sid + getPtgClass()); - LittleEndian.putUShort(array, 1 + offset, getExternSheetIndex()); - writeCoordinates(array, offset + 3); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(getExternSheetIndex()); + writeCoordinates(out); } public int getSize() { diff --git a/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java b/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java index 699f6344a3..3cf9b340bf 100755 --- a/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java @@ -19,8 +19,7 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.usermodel.HSSFErrorConstants; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.LittleEndianOutput; /** * RefError - handles deleted cell reference @@ -43,9 +42,9 @@ public final class RefErrorPtg extends OperandPtg { return getClass().getName(); } - public void writeBytes(byte [] array, int offset) { - LittleEndian.putByte(array, offset+0, sid + getPtgClass()); - LittleEndian.putInt(array,offset+1,field_1_reserved); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeInt(field_1_reserved); } public int getSize() diff --git a/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java b/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java index f04ec0ac8f..d623324a37 100644 --- a/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java +++ b/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java @@ -21,108 +21,110 @@ import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.hssf.util.CellReference; import org.apache.poi.util.BitField; 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) - * @author Andrew C. Oliver (acoliver@apache.org) + * + * @author Andrew C. Oliver (acoliver@apache.org) * @author Jason Height (jheight at chariot dot net dot au) */ public abstract class RefPtgBase extends OperandPtg { - private final static int MAX_ROW_NUMBER = 65536; - - /** The row index - zero based unsigned 16 bit value */ - private int field_1_row; - /** Field 2 - * - lower 8 bits is the zero based unsigned byte column index - * - bit 16 - isRowRelative - * - bit 15 - isColumnRelative - */ - private int field_2_col; - private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000); - private static final BitField colRelative = BitFieldFactory.getInstance(0x4000); - private static final BitField column = BitFieldFactory.getInstance(0x00FF); - - protected RefPtgBase() { - //Required for clone methods - } - - /** - * Takes in a String representation of a cell reference and fills out the - * numeric fields. - */ - protected RefPtgBase(String cellref) { - CellReference c= new CellReference(cellref); - setRow(c.getRow()); - setColumn(c.getCol()); - setColRelative(!c.isColAbsolute()); - setRowRelative(!c.isRowAbsolute()); - } - - protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) { - setRow(row); - setColumn(column); - setRowRelative(isRowRelative); - setColRelative(isColumnRelative); - } - - protected final void readCoordinates(RecordInputStream in) { - field_1_row = 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) { - if(row < 0 || row >= MAX_ROW_NUMBER) { - throw new IllegalArgumentException("The row number, when specified as an integer, must be between 0 and " + MAX_ROW_NUMBER); - } - field_1_row = row; - } - - /** - * @return the row number as an int, between 0 and 65535 - */ - public final int getRow(){ - return field_1_row; - } - - public final boolean isRowRelative() { - return rowRelative.isSet(field_2_col); - } - - public final void setRowRelative(boolean rel) { - field_2_col=rowRelative.setBoolean(field_2_col,rel); - } - - public final boolean isColRelative() { - return colRelative.isSet(field_2_col); - } - - public final void setColRelative(boolean rel) { - field_2_col=colRelative.setBoolean(field_2_col,rel); - } - - public final void setColumn(int col) { - if(col < 0 || col >= 0x100) { - throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range"); - } - field_2_col = column.setValue(field_2_col, col); - } - - public final int getColumn() { - 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; - } + private final static int MAX_ROW_NUMBER = 65536; + + /** The row index - zero based unsigned 16 bit value */ + private int field_1_row; + /** + * Field 2 - lower 8 bits is the zero based unsigned byte column index - bit + * 16 - isRowRelative - bit 15 - isColumnRelative + */ + private int field_2_col; + private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000); + private static final BitField colRelative = BitFieldFactory.getInstance(0x4000); + private static final BitField column = BitFieldFactory.getInstance(0x00FF); + + protected RefPtgBase() { + // Required for clone methods + } + + /** + * Takes in a String representation of a cell reference and fills out the + * numeric fields. + */ + protected RefPtgBase(String cellref) { + CellReference c = new CellReference(cellref); + setRow(c.getRow()); + setColumn(c.getCol()); + setColRelative(!c.isColAbsolute()); + setRowRelative(!c.isRowAbsolute()); + } + + protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) { + setRow(row); + setColumn(column); + setRowRelative(isRowRelative); + setColRelative(isColumnRelative); + } + + protected final void readCoordinates(RecordInputStream in) { + field_1_row = in.readUShort(); + field_2_col = in.readUShort(); + } + + protected final void writeCoordinates(LittleEndianOutput out) { + out.writeShort(field_1_row); + out.writeShort(field_2_col); + } + + public final void setRow(int rowIndex) { + if (rowIndex < 0 || rowIndex >= MAX_ROW_NUMBER) { + throw new IllegalArgumentException("rowIndex must be between 0 and " + MAX_ROW_NUMBER); + } + field_1_row = rowIndex; + } + + /** + * @return the row number as an int, between 0 and 65535 + */ + public final int getRow() { + return field_1_row; + } + + public final boolean isRowRelative() { + return rowRelative.isSet(field_2_col); + } + + public final void setRowRelative(boolean rel) { + field_2_col = rowRelative.setBoolean(field_2_col, rel); + } + + public final boolean isColRelative() { + return colRelative.isSet(field_2_col); + } + + public final void setColRelative(boolean rel) { + field_2_col = colRelative.setBoolean(field_2_col, rel); + } + + public final void setColumn(int col) { + if (col < 0 || col >= 0x100) { + throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range"); + } + field_2_col = column.setValue(field_2_col, col); + } + + public final int getColumn() { + 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; + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java index 2f34e2e360..cd6749e5bc 100644 --- a/src/java/org/apache/poi/hssf/record/formula/StringPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/StringPtg.java @@ -20,6 +20,7 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; import org.apache.poi.util.BitField; import org.apache.poi.util.BitFieldFactory; +import org.apache.poi.util.LittleEndianOutput; import org.apache.poi.util.StringUtil; /** @@ -78,14 +79,14 @@ public final class StringPtg extends ScalarConstantPtg { return field_3_string; } - public void writeBytes(byte[] array, int offset) { - array[offset + 0] = sid; - array[offset + 1] = (byte) field_1_length; - array[offset + 2] = field_2_options; + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeByte(field_1_length); + out.writeByte(field_2_options); if (fHighByte.isSet(field_2_options)) { - StringUtil.putUnicodeLE(getValue(), array, offset + 3); + StringUtil.putUnicodeLE(getValue(), out); } else { - StringUtil.putCompressedUnicode(getValue(), array, offset + 3); + StringUtil.putCompressedUnicode(getValue(), out); } } diff --git a/src/java/org/apache/poi/hssf/record/formula/TblPtg.java b/src/java/org/apache/poi/hssf/record/formula/TblPtg.java index 0b17e268e2..c62783a3a0 100644 --- a/src/java/org/apache/poi/hssf/record/formula/TblPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/TblPtg.java @@ -19,7 +19,7 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordFormatException; 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. @@ -48,10 +48,10 @@ public final class TblPtg extends ControlPtg { field_2_first_col = in.readUShort(); } - public void writeBytes(byte [] array, int offset) { - LittleEndian.putByte(array, offset+0, sid); - LittleEndian.putUShort(array, offset+1, field_1_first_row); - LittleEndian.putUShort(array, offset+3, field_2_first_col); + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); + out.writeShort(field_1_first_row); + out.writeShort(field_2_first_col); } public int getSize() { diff --git a/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java b/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java index fdd82ce549..2c80ab6fe6 100644 --- a/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java @@ -17,6 +17,8 @@ package org.apache.poi.hssf.record.formula; +import org.apache.poi.util.LittleEndianOutput; + /** * @author Glen Stampoultzis (glens at apache.org) @@ -39,9 +41,8 @@ public final class UnionPtg extends OperationPtg { return 1; } - public void writeBytes( byte[] array, int offset ) - { - array[ offset + 0 ] = sid; + public void write(LittleEndianOutput out) { + out.writeByte(sid + getPtgClass()); } public String toFormulaString() diff --git a/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java b/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java index d073878707..d441a0098d 100644 --- a/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java @@ -16,7 +16,7 @@ ==================================================================== */ 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 { private short size = 1; + private final int _sid; - /** Creates new UnknownPtg */ - - public UnknownPtg() - { - } - - public UnknownPtg(RecordInputStream in) { - // doesn't need anything + public UnknownPtg(int sid) { + _sid = sid; } 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() @@ -55,8 +50,6 @@ public class UnknownPtg extends Ptg { public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;} public Object clone() { - return new UnknownPtg(); + return this; } - - } diff --git a/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java b/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java index 7bb632b595..4f9d4be305 100644 --- a/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java @@ -17,18 +17,19 @@ 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. - * Subclasses include all unary and binary operators except for the reference operators (IntersectionPtg, RangePtg, UnionPtg) + * Common superclass of all value operators. Subclasses include all unary and + * binary operators except for the reference operators (IntersectionPtg, + * RangePtg, UnionPtg) * * @author Josh Micich */ public abstract class ValueOperatorPtg extends OperationPtg { /** - * All Operator Ptgs are base tokens (i.e. are not RVA classified) + * All Operator Ptgs are base tokens (i.e. are not RVA classified) */ public final boolean isBaseToken() { return true; @@ -38,8 +39,8 @@ public abstract class ValueOperatorPtg extends OperationPtg { return Ptg.CLASS_VALUE; } - public final void writeBytes(byte[] array, int offset) { - array[offset + 0] = getSid(); + public void write(LittleEndianOutput out) { + out.writeByte(getSid()); } protected abstract byte getSid(); @@ -47,8 +48,9 @@ public abstract class ValueOperatorPtg extends OperationPtg { public final int getSize() { return 1; } - public final String toFormulaString() { - // TODO - prune this method out of the hierarchy - throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs"); + + public final String toFormulaString() { + // TODO - prune this method out of the hierarchy + throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs"); } } diff --git a/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java b/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java new file mode 100644 index 0000000000..598a9cbdbc --- /dev/null +++ b/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java @@ -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; + } +}