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

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.
@ -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 <code>true</code> 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();
}

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,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 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(RecordInputStream in) {
_value = (in.readByte() == 1);
}
public BoolPtg(String formulaToken) {
_value = (formulaToken.equalsIgnoreCase("TRUE"));
}
public BoolPtg(String formulaToken) {
_value = (formulaToken.equalsIgnoreCase("TRUE"));
}
public boolean getValue() {
return _value;
}
public boolean getValue() {
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() {
return SIZE;
}
public int getSize() {
return SIZE;
}
public String toFormulaString() {
return _value ? "TRUE" : "FALSE";
}
public String toFormulaString() {
return _value ? "TRUE" : "FALSE";
}
}

View File

@ -19,9 +19,9 @@ package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.record.RecordInputStream;
import org.apache.poi.hssf.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;
/**
*
@ -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();
}
}
}

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,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 <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;
}
// 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 <code>true</code> if the specified value is within the range of values
* <tt>IntPtg</tt> can represent.
*/
public static boolean isInRange(int i) {
return i >= MIN_VALUE && i <= MAX_VALUE;
}
public 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());
}
}

View File

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

View File

@ -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;
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 */
/** Creates new MemAreaPtg */
public 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 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 int getSize() {
return SIZE;
}
public void setSubexpressionLength(short subexlen)
{
field_2_subex_len = subexlen;
}
public String toFormulaString() {
return ""; // TODO: Not sure how to format this. -- DN
}
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 byte getDefaultOperandClass() {
return Ptg.CLASS_VALUE;
}
}

View File

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

View File

@ -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());
}
public MemFuncPtg(int subExprLen) {
field_1_len_ref_subexpression = subExprLen;
/**
* Creates new function pointer from a byte array usually called while
* reading an excel file.
*/
public MemFuncPtg(RecordInputStream in) {
this(in.readUShort());
}
public int getSize()
{
return 3;
}
public MemFuncPtg(int subExprLen) {
field_1_len_ref_subexpression = subExprLen;
}
public void writeBytes( byte[] array, int offset )
{
array[offset + 0] = sid ;
LittleEndian.putUShort( array, offset + 1, field_1_len_ref_subexpression );
}
public int getSize() {
return 3;
}
public String toFormulaString()
{
return "";
}
public void write(LittleEndianOutput out) {
out.writeByte(sid + getPtgClass());
out.writeShort(field_1_len_ref_subexpression);
}
public byte getDefaultOperandClass()
{
return Ptg.CLASS_REF;
}
public String toFormulaString() {
return "";
}
public int getNumberOfOperands()
{
return field_1_len_ref_subexpression;
}
public byte getDefaultOperandClass() {
return Ptg.CLASS_REF;
}
public int getLenRefSubexpression()
{
return field_1_len_ref_subexpression;
}
public int getNumberOfOperands() {
return field_1_len_ref_subexpression;
}
public int getLenRefSubexpression() {
return field_1_len_ref_subexpression;
}
}

View File

@ -17,32 +17,35 @@
package org.apache.poi.hssf.record.formula;
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 {
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;
}
private final static int SIZE = 1;
public final static byte sid = 0x16;
public int getSize() {
return SIZE;
}
public String toFormulaString() {
return " ";
}
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 " ";
}
}

View File

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

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

View File

@ -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 &lt;lists@aviksengupta.com&gt;
* 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 &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 {
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;
}
private final static int SIZE = 1;
public final static byte sid = 0x15;
public String toFormulaString()
{
return "()";
}
public static final ControlPtg instance = new ParenthesisPtg();
public String toFormulaString(String[] operands) {
return "("+operands[0]+")";
}
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] + ")";
}
}

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

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,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;
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);
/** 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
}
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());
}
/**
* 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 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);
}
protected final void readCoordinates(RecordInputStream in) {
field_1_row = in.readUShort();
field_2_col = in.readUShort();
}
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;
}
protected final void writeCoordinates(LittleEndianOutput out) {
out.writeShort(field_1_row);
out.writeShort(field_2_col);
}
/**
* @return the row number as an int, between 0 and 65535
*/
public final int getRow(){
return field_1_row;
}
public final void 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;
}
public final boolean isRowRelative() {
return rowRelative.isSet(field_2_col);
}
/**
* @return the row number as an int, between 0 and 65535
*/
public final int getRow() {
return field_1_row;
}
public final void setRowRelative(boolean rel) {
field_2_col=rowRelative.setBoolean(field_2_col,rel);
}
public final boolean isRowRelative() {
return rowRelative.isSet(field_2_col);
}
public final boolean isColRelative() {
return colRelative.isSet(field_2_col);
}
public final void setRowRelative(boolean rel) {
field_2_col = rowRelative.setBoolean(field_2_col, rel);
}
public final void setColRelative(boolean rel) {
field_2_col=colRelative.setBoolean(field_2_col,rel);
}
public final boolean isColRelative() {
return colRelative.isSet(field_2_col);
}
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 void setColRelative(boolean rel) {
field_2_col = colRelative.setBoolean(field_2_col, rel);
}
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 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 byte getDefaultOperandClass() {
return Ptg.CLASS_REF;
}
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;
}
}

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;
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,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 <tt>Ptg</tt>s are base tokens (i.e. are not RVA classified)
* All Operator <tt>Ptg</tt>s 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");
}
}

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