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 1369bb9314
commit 812aded595
38 changed files with 714 additions and 678 deletions

View File

@ -51,7 +51,7 @@ public final class LinkedDataFormulaField {
.append( "=" )
.append(ptg.toString() )
.append( "\n" )
.append(ptg.toDebugString() )
.append(ptg.toString())
.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.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) {

View File

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

View File

@ -18,7 +18,7 @@
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
@ -29,24 +29,30 @@ public abstract class Area2DPtgBase extends AreaPtgBase {
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);
}
public final int getSize() {
return SIZE;
}
public final String toFormulaString() {
return formatReferenceAsString();
}
public final String toString() {
StringBuffer sb = new StringBuffer();
sb.append(getClass().getName());

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.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)<P>
@ -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() {

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.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() {

View File

@ -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.
@ -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);
}
/**

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.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) {

View File

@ -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);
}
}

View File

@ -18,17 +18,18 @@
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;
public final static byte sid = 0x1D;
private final boolean _value;
public BoolPtg(RecordInputStream in) {
@ -43,9 +44,9 @@ public final class BoolPtg extends ScalarConstantPtg {
return _value;
}
public void writeBytes(byte [] array, int offset) {
array[ offset + 0 ] = sid;
array[ offset + 1 ] = (byte) (_value ? 1 : 0);
public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
out.writeByte(_value ? 1 : 0);
}
public int getSize() {

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.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)<P>
@ -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);
}
}

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.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 <P>
@ -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);
}
}

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.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() {

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.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();
}
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()

View File

@ -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() {

View File

@ -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() {

View File

@ -18,11 +18,12 @@
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
* 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)
*/
@ -33,11 +34,12 @@ public final class IntPtg extends ScalarConstantPtg {
/**
* 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.
*/
public static boolean isInRange(int i) {
return i>=MIN_VALUE && i <=MAX_VALUE;
return i >= MIN_VALUE && i <= MAX_VALUE;
}
public final static int SIZE = 3;
@ -49,7 +51,7 @@ public final class IntPtg extends ScalarConstantPtg {
}
public IntPtg(int value) {
if(!isInRange(value)) {
if (!isInRange(value)) {
throw new IllegalArgumentException("value is out of range: " + value);
}
field_1_value = value;
@ -59,9 +61,9 @@ public final class IntPtg extends ScalarConstantPtg {
return field_1_value;
}
public void writeBytes(byte [] array, int offset) {
array[ offset + 0 ] = sid;
LittleEndian.putUShort(array, offset + 1, getValue());
public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
out.writeShort(getValue());
}
public int getSize() {

View File

@ -17,6 +17,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndianOutput;
/**
* @author Daniel Noll (daniel at nuix dot com dot au)
@ -34,37 +35,28 @@ public final class IntersectionPtg extends OperationPtg {
return true;
}
public int getSize()
{
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()
{
public String toFormulaString() {
return " ";
}
/** implementation of method from OperationsPtg*/
public String toFormulaString(String[] operands)
{
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
buffer.append(operands[0]);
buffer.append(" ");
buffer.append(operands[ 1 ]);
buffer.append(operands[1]);
return buffer.toString();
}
public int getNumberOfOperands()
{
public int getNumberOfOperands() {
return 2;
}
}

View File

@ -18,7 +18,7 @@
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)
@ -26,55 +26,32 @@ import org.apache.poi.util.LittleEndian;
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;
private final int field_1_reserved;
private final int field_2_subex_len;
/** 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_2_subex_len = in.readShort();
}
public void setReserved(int res)
{
field_1_reserved = res;
public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
out.writeInt(field_1_reserved);
out.writeShort(field_2_subex_len);
}
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()
{
public int getSize() {
return SIZE;
}
public String toFormulaString()
{
public String toFormulaString() {
return ""; // TODO: Not sure how to format this. -- DN
}

View File

@ -18,7 +18,7 @@
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;
/**
*
@ -26,27 +26,32 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
* @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 class MemErrPtg extends OperandPtg {
public final static short sid = 0x27;
/** Creates new MemErrPtg */
public MemErrPtg()
{
}
private final static int SIZE = 7;
private int field_1_reserved;
private short field_2_subex_len;
public MemErrPtg(RecordInputStream in) {
super(in);
field_1_reserved = in.readInt();
field_2_subex_len = in.readShort();
}
public void writeBytes(byte [] array, int offset) {
super.writeBytes(array, offset);
array[offset] = (byte) (sid + getPtgClass());
public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
out.writeInt(field_1_reserved);
out.writeShort(field_2_subex_len);
}
public String toFormulaString()
{
public int getSize() {
return SIZE;
}
public String toFormulaString() {
return "ERR#";
}
public byte getDefaultOperandClass() {
return Ptg.CLASS_VALUE;
}
}

View File

@ -18,7 +18,7 @@
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)
@ -28,8 +28,9 @@ public final class MemFuncPtg extends OperandPtg {
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.
/**
* Creates new function pointer from a byte array usually called while
* reading an excel file.
*/
public MemFuncPtg(RecordInputStream in) {
this(in.readUShort());
@ -39,34 +40,28 @@ public final class MemFuncPtg extends OperandPtg {
field_1_len_ref_subexpression = subExprLen;
}
public int getSize()
{
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()
{
public String toFormulaString() {
return "";
}
public byte getDefaultOperandClass()
{
public byte getDefaultOperandClass() {
return Ptg.CLASS_REF;
}
public int getNumberOfOperands()
{
public int getNumberOfOperands() {
return field_1_len_ref_subexpression;
}
public int getLenRefSubexpression()
{
public int getLenRefSubexpression() {
return field_1_len_ref_subexpression;
}
}

View File

@ -17,10 +17,13 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndianOutput;
/**
* Missing Function Arguments
*
* Avik Sengupta &lt;avik at apache.org&gt;
*
* @author Jason Height (jheight at chariot dot net dot au)
*/
public final class MissingArgPtg extends ScalarConstantPtg {
@ -34,8 +37,8 @@ public final class MissingArgPtg extends ScalarConstantPtg {
// enforce singleton
}
public void writeBytes(byte [] array, int offset) {
array[ offset + 0 ] = sid;
public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
}
public int getSize() {

View File

@ -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;
/**
*
@ -38,7 +38,7 @@ public final class NamePtg extends OperandPtg implements WorkbookDependentFormul
* @param nameIndex zero-based index to name within workbook
*/
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 */
@ -52,23 +52,23 @@ public final class NamePtg extends OperandPtg implements WorkbookDependentFormul
* @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
return field_1_label_index - 1; // convert to zero based
}
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);
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)
{
public String toFormulaString(FormulaRenderingWorkbook book) {
return book.getNameText(this);
}
public String toFormulaString() {
throw new RuntimeException("3D references need a workbook to determine formula text");
}

View File

@ -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() {

View File

@ -18,12 +18,12 @@
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
* 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)
*/
@ -32,15 +32,16 @@ public final class NumberPtg extends ScalarConstantPtg {
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
/**
* 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));
@ -54,9 +55,9 @@ public final class NumberPtg extends ScalarConstantPtg {
return field_1_value;
}
public void writeBytes(byte [] array, int offset) {
array[ offset + 0 ] = sid;
LittleEndian.putDouble(array, offset + 1, getValue());
public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
out.writeDouble(getValue());
}
public int getSize() {

View File

@ -15,17 +15,18 @@
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
* 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 &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)
*/
public final class ParenthesisPtg extends ControlPtg {
@ -34,27 +35,24 @@ public final class ParenthesisPtg extends ControlPtg {
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 void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
}
public int getSize()
{
public int getSize() {
return SIZE;
}
public String toFormulaString()
{
public String toFormulaString() {
return "()";
}
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 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

View File

@ -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()

View File

@ -18,7 +18,7 @@
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
@ -44,18 +44,22 @@ abstract class Ref2DPtgBase extends RefPtgBase {
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 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());

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.FormulaRenderingWorkbook;
import org.apache.poi.ss.formula.WorkbookDependentFormula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.LittleEndianOutput;
/**
* Title: Reference 3D Ptg <P>
@ -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() {

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.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()

View File

@ -21,10 +21,11 @@ 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 Jason Height (jheight at chariot dot net dot au)
*/
@ -34,10 +35,9 @@ public abstract class RefPtgBase extends OperandPtg {
/** 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
/**
* 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);
@ -45,7 +45,7 @@ public abstract class RefPtgBase extends OperandPtg {
private static final BitField column = BitFieldFactory.getInstance(0x00FF);
protected RefPtgBase() {
//Required for clone methods
// Required for clone methods
}
/**
@ -53,7 +53,7 @@ public abstract class RefPtgBase extends OperandPtg {
* numeric fields.
*/
protected RefPtgBase(String cellref) {
CellReference c= new CellReference(cellref);
CellReference c = new CellReference(cellref);
setRow(c.getRow());
setColumn(c.getCol());
setColRelative(!c.isColAbsolute());
@ -71,22 +71,23 @@ public abstract class RefPtgBase extends OperandPtg {
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);
protected final void writeCoordinates(LittleEndianOutput out) {
out.writeShort(field_1_row);
out.writeShort(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);
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 = row;
field_1_row = rowIndex;
}
/**
* @return the row number as an int, between 0 and 65535
*/
public final int getRow(){
public final int getRow() {
return field_1_row;
}
@ -95,7 +96,7 @@ public abstract class RefPtgBase extends OperandPtg {
}
public final void setRowRelative(boolean rel) {
field_2_col=rowRelative.setBoolean(field_2_col,rel);
field_2_col = rowRelative.setBoolean(field_2_col, rel);
}
public final boolean isColRelative() {
@ -103,11 +104,11 @@ public abstract class RefPtgBase extends OperandPtg {
}
public final void setColRelative(boolean rel) {
field_2_col=colRelative.setBoolean(field_2_col,rel);
field_2_col = colRelative.setBoolean(field_2_col, rel);
}
public final void setColumn(int col) {
if(col < 0 || col >= 0x100) {
if (col < 0 || col >= 0x100) {
throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range");
}
field_2_col = column.setValue(field_2_col, col);
@ -116,6 +117,7 @@ public abstract class RefPtgBase extends OperandPtg {
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());

View File

@ -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);
}
}

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.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() {

View File

@ -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()

View File

@ -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;
}
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;
}
}

View File

@ -17,11 +17,12 @@
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
*/
@ -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,6 +48,7 @@ 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");

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;
}
}