]> source.dussan.org Git - poi.git/commitdiff
Converted Ptgs to use LittleEndianOutput
authorJosh Micich <josh@apache.org>
Thu, 23 Oct 2008 22:28:05 +0000 (22:28 +0000)
committerJosh Micich <josh@apache.org>
Thu, 23 Oct 2008 22:28:05 +0000 (22:28 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@707486 13f79535-47bb-0310-9956-ffa450edef68

38 files changed:
src/java/org/apache/poi/hssf/record/LinkedDataFormulaField.java
src/java/org/apache/poi/hssf/record/TextObjectRecord.java
src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java
src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java
src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java
src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java
src/java/org/apache/poi/hssf/record/formula/AttrPtg.java
src/java/org/apache/poi/hssf/record/formula/BoolPtg.java
src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java
src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java
src/java/org/apache/poi/hssf/record/formula/ErrPtg.java
src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
src/java/org/apache/poi/hssf/record/formula/FuncPtg.java
src/java/org/apache/poi/hssf/record/formula/FuncVarPtg.java
src/java/org/apache/poi/hssf/record/formula/IntPtg.java
src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java
src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java
src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java
src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java
src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java
src/java/org/apache/poi/hssf/record/formula/NamePtg.java
src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
src/java/org/apache/poi/hssf/record/formula/NumberPtg.java
src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java
src/java/org/apache/poi/hssf/record/formula/Ptg.java
src/java/org/apache/poi/hssf/record/formula/RangePtg.java
src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java
src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java
src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java
src/java/org/apache/poi/hssf/record/formula/StringPtg.java
src/java/org/apache/poi/hssf/record/formula/TblPtg.java
src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java
src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java
src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java [new file with mode: 0644]

index 4a607c9e37d10feb53884013a82d11869cf11c5f..36aeb7b47ce524671946520299a8558b0acc504d 100644 (file)
@@ -51,7 +51,7 @@ public final class LinkedDataFormulaField {
                     .append( "=" )
                     .append(ptg.toString() )
                     .append( "\n" )
-                    .append(ptg.toDebugString() )
+                    .append(ptg.toString())
                     .append( "\n" );
         }
     }
index 6529dc93f8664902f403558b6d4b0a2956f9cc99..91780ee447ba72d25c5bc7f5ac07f3907b4b8464 100644 (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) {
index 037ebb83ae176083ba807b63770483aeb992512d..8e1f9ffe939051d59576867d7fbeb84d411009c4 100644 (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();
 
 
index f16a20077966d8ed7cea6521f73be1631ccead17..5bee0afe03b9bca0a4832b37568a5456ae5d613c 100644 (file)
 package org.apache.poi.hssf.record.formula;\r
 \r
 import org.apache.poi.hssf.record.RecordInputStream;\r
-import org.apache.poi.util.LittleEndian;\r
+import org.apache.poi.util.LittleEndianOutput;\r
 \r
 /**\r
- * Common superclass of 2-D area refs \r
+ * Common superclass of 2-D area refs\r
  */\r
 public abstract class Area2DPtgBase extends AreaPtgBase {\r
-       private final static int  SIZE = 9;\r
+       private final static int SIZE = 9;\r
 \r
        protected Area2DPtgBase(int firstRow, int lastRow, int firstColumn, int lastColumn, boolean firstRowRelative, boolean lastRowRelative, boolean firstColRelative, boolean lastColRelative) {\r
                super(firstRow, lastRow, firstColumn, lastColumn, firstRowRelative, lastRowRelative, firstColRelative, lastColRelative);\r
        }\r
+\r
        protected Area2DPtgBase(RecordInputStream in) {\r
                readCoordinates(in);\r
        }\r
+\r
        protected abstract byte getSid();\r
 \r
-       public final void writeBytes(byte [] array, int offset) {\r
-               LittleEndian.putByte(array, offset+0, getSid() + getPtgClass());\r
-               writeCoordinates(array, offset+1);       \r
+       public final void write(LittleEndianOutput out) {\r
+               out.writeByte(getSid() + getPtgClass());\r
+               writeCoordinates(out);\r
        }\r
+\r
        public Area2DPtgBase(String arearef) {\r
-       super(arearef);\r
+               super(arearef);\r
        }\r
+\r
        public final int getSize() {\r
                return SIZE;\r
        }\r
+\r
        public final String toFormulaString() {\r
-       return formatReferenceAsString();\r
+               return formatReferenceAsString();\r
+       }\r
+\r
+       public final String toString() {\r
+               StringBuffer sb = new StringBuffer();\r
+               sb.append(getClass().getName());\r
+               sb.append(" [");\r
+               sb.append(formatReferenceAsString());\r
+               sb.append("]");\r
+               return sb.toString();\r
        }\r
-    public final String toString() {\r
-        StringBuffer sb = new StringBuffer();\r
-        sb.append(getClass().getName());\r
-        sb.append(" [");\r
-        sb.append(formatReferenceAsString());\r
-        sb.append("]");\r
-        return sb.toString();\r
-    }\r
 }\r
index 58cdc5b275bfc21aff88643fe9cc5d23bf8aee52..e5c2fdc10dac9b94746326b01ebdde1479fbc472 100644 (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() {
index bfe247897dc7047ba8f28c2d96e6eec1bc93bbcb..f50af0d0cf259fe7d46aa5540212c8acdfb0ee9a 100644 (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() {
index d6df1fe4b2671d1d5ed5da83c1be101fd3faf945..2fa1290c0c65d1e302424b90ff4a528491358c8e 100644 (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();
        }
index 1b025872d4622a3b3a66e46bfc8d2c107553322c..21df3982a22c3105f840b81d90adbd9dbea84d16 100644 (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) {
index ea0afcc377913d6ef309653d2c143b7de7d586b6..51d3194c0b29dcb4980d689e7bd34b54be8d57a1 100644 (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);
         }
     }
 
index f975b0419ee4ac86e2a2af696664cc580ae9b7ce..8dfbca33fa1fdd3374ac24a15a2e474dacd6c0ad 100644 (file)
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.util.LittleEndianOutput;
 
 /**
- * Boolean (boolean)
- * Stores a (java) boolean value in a formula.
+ * Boolean (boolean) Stores a (java) boolean value in a formula.
+ * 
  * @author Paul Krause (pkrause at soundbite dot com)
  * @author Andrew C. Oliver (acoliver at apache dot org)
  * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class BoolPtg extends ScalarConstantPtg {
-    public final static int  SIZE = 2;
-    public final static byte sid  = 0x1d;
-    private final boolean _value;
-
-    public BoolPtg(RecordInputStream in) {
-        _value = (in.readByte() == 1);
-    }
-
-    public BoolPtg(String formulaToken) {
-        _value = (formulaToken.equalsIgnoreCase("TRUE"));
-    }
-
-    public boolean getValue() {
-        return _value;
-    }
-
-    public void writeBytes(byte [] array, int offset) {
-        array[ offset + 0 ] = sid;
-        array[ offset + 1 ] = (byte) (_value ? 1 : 0);
-    }
-
-    public int getSize() {
-        return SIZE;
-    }
-
-    public String toFormulaString() {
-        return _value ? "TRUE" : "FALSE";
-    }
+       public final static int SIZE = 2;
+       public final static byte sid = 0x1D;
+       private final boolean _value;
+
+       public BoolPtg(RecordInputStream in) {
+               _value = (in.readByte() == 1);
+       }
+
+       public BoolPtg(String formulaToken) {
+               _value = (formulaToken.equalsIgnoreCase("TRUE"));
+       }
+
+       public boolean getValue() {
+               return _value;
+       }
+
+       public void write(LittleEndianOutput out) {
+               out.writeByte(sid + getPtgClass());
+               out.writeByte(_value ? 1 : 0);
+       }
+
+       public int getSize() {
+               return SIZE;
+       }
+
+       public String toFormulaString() {
+               return _value ? "TRUE" : "FALSE";
+       }
 }
index a45cfcd69ea040e6fdff97a723afe2f02cec22dd..9aa07dddfce38f728a3f8089f701a53d78ef7119 100644 (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);
        }
 }
index 4dbf09b7ff1f46797e29b0d6842ab87c720611b1..90ac7efac77a53fb8ab1e54fcaa60cdf5b120665 100644 (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);
        }
 }
index 65d40dc51ed2a7880991b835bca2bc290c0c47e9..f2720e52d89253e3f75bd8a71bbaaf3b8c70a92a 100644 (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() {
index 5c48aeb6b0805605c288d3dbeea3135d71b85231..9a75a627bf47eecb0c8d74da5ed27600fe2e3b42 100644 (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();
-    }    
+    }
 }
index c0034b24fb29a4b62bba2e7fb2b652cd017f0ba3..3265f88b1dda657f673854a10a3e9f5177d545a3 100644 (file)
 ==================================================================== */
 
 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() {
index fd3546250a9029cee0f909e16033cf7e5321f64f..6a6ccda8aee0317d1c91e9179780259c3cca8957 100644 (file)
 ==================================================================== */
 
 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() {
index ea3fc80bd6f523d9cf39efa5f278ddd9b9350d10..4df6d6f22fd37bce253f7e1b47ec9273a032df4d 100644 (file)
 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());
+       }
 }
index f96c5ecb1a181c722712e6024bd068a7294f283e..0e6771de35862a19b843554497f8b14814385232 100644 (file)
 
 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;
+       }
 }
index 951fd7c43647ad6c21cbe2ad672e570fcf756d5a..9e9c0905101bbbc5bd04b475ace3225014e1bfd6 100644 (file)
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.LittleEndianOutput;
 
 /**
  * @author Daniel Noll (daniel at nuix dot com dot au)
  */
 public class MemAreaPtg extends OperandPtg {
-    public final static short sid  = 0x26;
-    private final static int  SIZE = 7;
-    private int               field_1_reserved;
-    private short             field_2_subex_len;
-
-    /** Creates new MemAreaPtg */
-
-    public MemAreaPtg()
-    {
-    }
-
-    public MemAreaPtg(RecordInputStream in)
-    {
-        field_1_reserved  = in.readInt();
-        field_2_subex_len = in.readShort();
-    }
-
-    public void setReserved(int res)
-    {
-        field_1_reserved = res;
-    }
-
-    public int getReserved()
-    {
-        return field_1_reserved;
-    }
-
-    public void setSubexpressionLength(short subexlen)
-    {
-        field_2_subex_len = subexlen;
-    }
-
-    public short getSubexpressionLength()
-    {
-        return field_2_subex_len;
-    }
-
-    public void writeBytes(byte [] array, int offset)
-    {
-        array[offset] = (byte) (sid + getPtgClass());
-        LittleEndian.putInt(array, offset + 1, field_1_reserved);
-        LittleEndian.putShort(array, offset + 5, field_2_subex_len);
-    }
-
-    public int getSize()
-    {
-        return SIZE;
-    }
-
-    public String toFormulaString()
-    {
-        return ""; // TODO: Not sure how to format this. -- DN
-    }
-
-    public byte getDefaultOperandClass() {
-       return Ptg.CLASS_VALUE;
-    }
+       public final static short sid = 0x26;
+       private final static int SIZE = 7;
+       private final int field_1_reserved;
+       private final int field_2_subex_len;
+
+       /** Creates new MemAreaPtg */
+
+       public MemAreaPtg(int subexLen) {
+               field_1_reserved = 0;
+               field_2_subex_len = subexLen;
+       }
+
+       public MemAreaPtg(RecordInputStream in) {
+               field_1_reserved = in.readInt();
+               field_2_subex_len = in.readShort();
+       }
+
+       public void write(LittleEndianOutput out) {
+               out.writeByte(sid + getPtgClass());
+               out.writeInt(field_1_reserved);
+               out.writeShort(field_2_subex_len);
+       }
+
+       public int getSize() {
+               return SIZE;
+       }
+
+       public String toFormulaString() {
+               return ""; // TODO: Not sure how to format this. -- DN
+       }
+
+       public byte getDefaultOperandClass() {
+               return Ptg.CLASS_VALUE;
+       }
 }
index d3de53fe1327ecf4d592e15c69ca3519db127187..dc87ec2734786464a33a8d109ff8622ef904b7a9 100644 (file)
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.util.LittleEndianOutput;
 
 /**
- *
- * @author  andy
+ * 
+ * @author andy
  * @author Jason Height (jheight at chariot dot net dot au)
  * @author Daniel Noll (daniel at nuix dot com dot au)
  */
-
-public final class MemErrPtg extends MemAreaPtg {
-    public final static short sid  = 0x27;
-
-    /** Creates new MemErrPtg */
-
-    public MemErrPtg()
-    {
-    }
-
-    public MemErrPtg(RecordInputStream in) {
-        super(in);
-    }
-
-    public void writeBytes(byte [] array, int offset) {
-        super.writeBytes(array, offset);
-        array[offset] = (byte) (sid + getPtgClass());
-    }
-
-    public String toFormulaString()
-    {
-        return "ERR#";
-    }
+public final class MemErrPtg extends OperandPtg {
+       public final static short sid = 0x27;
+       private final static int SIZE = 7;
+       private int field_1_reserved;
+       private short field_2_subex_len;
+
+       public MemErrPtg(RecordInputStream in) {
+               field_1_reserved = in.readInt();
+               field_2_subex_len = in.readShort();
+       }
+
+       public void write(LittleEndianOutput out) {
+               out.writeByte(sid + getPtgClass());
+               out.writeInt(field_1_reserved);
+               out.writeShort(field_2_subex_len);
+       }
+
+       public int getSize() {
+               return SIZE;
+       }
+
+       public String toFormulaString() {
+               return "ERR#";
+       }
+
+       public byte getDefaultOperandClass() {
+               return Ptg.CLASS_VALUE;
+       }
 }
index 991f1742c01266265a8428aebd20615aa3eca4f3..98557263c03ddb96a0ff4bd12cfa0db72c11867a 100644 (file)
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.LittleEndianOutput;
 
 /**
  * @author Glen Stampoultzis (glens at apache.org)
  */
 public final class MemFuncPtg extends OperandPtg {
 
-    public final static byte sid = 0x29;
-    private final int field_1_len_ref_subexpression;
+       public final static byte sid = 0x29;
+       private final int field_1_len_ref_subexpression;
 
-    /**Creates new function pointer from a byte array
-     * usually called while reading an excel file.
-     */
-    public MemFuncPtg(RecordInputStream in) {
-        this(in.readUShort());
-    }
+       /**
+        * Creates new function pointer from a byte array usually called while
+        * reading an excel file.
+        */
+       public MemFuncPtg(RecordInputStream in) {
+               this(in.readUShort());
+       }
 
-    public MemFuncPtg(int subExprLen) {
-       field_1_len_ref_subexpression = subExprLen;
+       public MemFuncPtg(int subExprLen) {
+               field_1_len_ref_subexpression = subExprLen;
        }
 
-       public int getSize()
-    {
-        return 3;
-    }
+       public int getSize() {
+               return 3;
+       }
 
-    public void writeBytes( byte[] array, int offset )
-    {
-        array[offset + 0] =  sid ;
-        LittleEndian.putUShort( array, offset + 1, field_1_len_ref_subexpression );
-    }
+       public void write(LittleEndianOutput out) {
+               out.writeByte(sid + getPtgClass());
+               out.writeShort(field_1_len_ref_subexpression);
+       }
 
-    public String toFormulaString()
-    {
-        return "";
-    }
+       public String toFormulaString() {
+               return "";
+       }
 
-    public byte getDefaultOperandClass()
-    {
-        return Ptg.CLASS_REF;
-    }
+       public byte getDefaultOperandClass() {
+               return Ptg.CLASS_REF;
+       }
 
-    public int getNumberOfOperands()
-    {
-        return field_1_len_ref_subexpression;
-    }
+       public int getNumberOfOperands() {
+               return field_1_len_ref_subexpression;
+       }
 
-    public int getLenRefSubexpression()
-    {
-        return field_1_len_ref_subexpression;
-    }
+       public int getLenRefSubexpression() {
+               return field_1_len_ref_subexpression;
+       }
 }
\ No newline at end of file
index 075105f50c9a11dba07c0f4d3901a081cb32af13..99b7708a4b8859733719ff317b03f1139145ddfd 100644 (file)
 
 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;
-    }
-
-    public int getSize() {
-        return SIZE;
-    }
-   
-    public String toFormulaString() {
-        return " ";
-    }
+
+       private final static int SIZE = 1;
+       public final static byte sid = 0x16;
+
+       public static final Ptg instance = new MissingArgPtg();
+
+       private MissingArgPtg() {
+               // enforce singleton
+       }
+
+       public void write(LittleEndianOutput out) {
+               out.writeByte(sid + getPtgClass());
+       }
+
+       public int getSize() {
+               return SIZE;
+       }
+
+       public String toFormulaString() {
+               return " ";
+       }
 }
index 59670f87580c1ac1adcf75fbc9432a440e6db26a..e44369d72d373d7ecd822b330a4c687bf36e2441 100644 (file)
 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;
        }
 }
index 7f1614347f322fa9a7c1428370fca90dd1032b63..bf8ea135610f2e47542b002f080a312a9a341e1d 100644 (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() {
index c4aa9734865de86e7831890b0f037cbafffb9fbc..52779e0641c75b6f65c9f623d0a298d43b06c3e3 100644 (file)
 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);
+       }
 }
index 5365b939d82aa7d7f79f230896c9f94b9ebd17d1..1b94c90383abf953771645a2c10b6582098f959d 100644 (file)
    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;
-    }
-
-    public String toFormulaString()
-    {
-        return "()";
-    }
-
-          
-    public String toFormulaString(String[] operands) {
-        return "("+operands[0]+")";
-    }  
+
+       private final static int SIZE = 1;
+       public final static byte sid = 0x15;
+
+       public static final ControlPtg instance = new ParenthesisPtg();
+
+       private ParenthesisPtg() {
+               // enforce singleton
+       }
+
+       public void write(LittleEndianOutput out) {
+               out.writeByte(sid + getPtgClass());
+       }
+
+       public int getSize() {
+               return SIZE;
+       }
+
+       public String toFormulaString() {
+               return "()";
+       }
+
+       public String toFormulaString(String[] operands) {
+               return "(" + operands[0] + ")";
+       }
 }
index a264481d4347f0fe880600a6a390612720c99b25..a1a826dbbf858822cb8f634de1392a19d082f47a 100644 (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
index 658e2f47b412e875597726462782442a3aa8e122..c2507244da899be473e265e417233104e1795947 100644 (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()
index 545ff0bfc4b728f214c7b3f37a2bc4bde0d1212c..f2fcd504c7bd6d635e7abeace29a19d76b3bb4fd 100644 (file)
 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();
+       }
 }
index 217990d73372a2dec46d6a1709eca9511ffef76f..ff86b8c3c8b79c94a802c1935034b4be450a0e1b 100644 (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() {
index 699f6344a3865c296fa445eed0bfbca1664c406c..3cf9b340bfe80a148888a97b7baf1cb3340e9707 100755 (executable)
@@ -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()
index f04ec0ac8ff05d04b6d498d8c6c5dc24f20b64fc..d623324a374c9db6859170bafa1e61dd6224b8f9 100644 (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;
-
-   /** The row index - zero based unsigned 16 bit value */
-    private int            field_1_row;
-    /** Field 2
-     * - lower 8 bits is the zero based unsigned byte column index
-     * - bit 16 - isRowRelative
-     * - bit 15 - isColumnRelative
-     */
-    private int            field_2_col;
-    private static final BitField         rowRelative = BitFieldFactory.getInstance(0x8000);
-    private static final BitField         colRelative = BitFieldFactory.getInstance(0x4000);
-    private static final BitField         column      = BitFieldFactory.getInstance(0x00FF);
-
-    protected RefPtgBase() {
-      //Required for clone methods
-    }
-
-    /**
-     * Takes in a String representation of a cell reference and fills out the
-     * numeric fields.
-     */
-    protected RefPtgBase(String cellref) {
-        CellReference c= new CellReference(cellref);
-        setRow(c.getRow());
-        setColumn(c.getCol());
-        setColRelative(!c.isColAbsolute());
-        setRowRelative(!c.isRowAbsolute());
-    }
-
-    protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
-      setRow(row);
-      setColumn(column);
-      setRowRelative(isRowRelative);
-      setColRelative(isColumnRelative);
-    }
-
-    protected final void readCoordinates(RecordInputStream in) {
-        field_1_row = in.readUShort();
-        field_2_col = in.readUShort();
-    }
-    protected final void writeCoordinates(byte[] array, int offset) {
-        LittleEndian.putUShort(array, offset + 0, field_1_row);
-        LittleEndian.putUShort(array, offset + 2, field_2_col);
-    }
-
-    public final void setRow(int row) {
-        if(row < 0 || row >= MAX_ROW_NUMBER) {
-           throw new IllegalArgumentException("The row number, when specified as an integer, must be between 0 and " + MAX_ROW_NUMBER);
-        }
-        field_1_row = row;
-    }
-
-    /**
-     * @return the row number as an int, between 0 and 65535
-     */
-    public final int getRow(){
-        return field_1_row;
-    }
-
-    public final boolean isRowRelative() {
-        return rowRelative.isSet(field_2_col);
-    }
-
-    public final void setRowRelative(boolean rel) {
-        field_2_col=rowRelative.setBoolean(field_2_col,rel);
-    }
-
-    public final boolean isColRelative() {
-        return colRelative.isSet(field_2_col);
-    }
-
-    public final void setColRelative(boolean rel) {
-        field_2_col=colRelative.setBoolean(field_2_col,rel);
-    }
-
-    public final void setColumn(int col) {
-        if(col < 0 || col >= 0x100) {
-            throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range");
-        }
-       field_2_col = column.setValue(field_2_col, col);
-    }
-
-    public final int getColumn() {
-       return column.getValue(field_2_col);
-    }
-    protected final String formatReferenceAsString() {
-        // Only make cell references as needed. Memory is an issue
-        CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(), !isColRelative());
-        return cr.formatAsString();
-    }
-
-    public final byte getDefaultOperandClass() {
-        return Ptg.CLASS_REF;
-    }
+       private final static int MAX_ROW_NUMBER = 65536;
+
+       /** The row index - zero based unsigned 16 bit value */
+       private int field_1_row;
+       /**
+        * Field 2 - lower 8 bits is the zero based unsigned byte column index - bit
+        * 16 - isRowRelative - bit 15 - isColumnRelative
+        */
+       private int field_2_col;
+       private static final BitField rowRelative = BitFieldFactory.getInstance(0x8000);
+       private static final BitField colRelative = BitFieldFactory.getInstance(0x4000);
+       private static final BitField column = BitFieldFactory.getInstance(0x00FF);
+
+       protected RefPtgBase() {
+               // Required for clone methods
+       }
+
+       /**
+        * Takes in a String representation of a cell reference and fills out the
+        * numeric fields.
+        */
+       protected RefPtgBase(String cellref) {
+               CellReference c = new CellReference(cellref);
+               setRow(c.getRow());
+               setColumn(c.getCol());
+               setColRelative(!c.isColAbsolute());
+               setRowRelative(!c.isRowAbsolute());
+       }
+
+       protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
+               setRow(row);
+               setColumn(column);
+               setRowRelative(isRowRelative);
+               setColRelative(isColumnRelative);
+       }
+
+       protected final void readCoordinates(RecordInputStream in) {
+               field_1_row = in.readUShort();
+               field_2_col = in.readUShort();
+       }
+
+       protected final void writeCoordinates(LittleEndianOutput out) {
+               out.writeShort(field_1_row);
+               out.writeShort(field_2_col);
+       }
+
+       public final void setRow(int rowIndex) {
+               if (rowIndex < 0 || rowIndex >= MAX_ROW_NUMBER) {
+                       throw new IllegalArgumentException("rowIndex must be between 0 and " + MAX_ROW_NUMBER);
+               }
+               field_1_row = rowIndex;
+       }
+
+       /**
+        * @return the row number as an int, between 0 and 65535
+        */
+       public final int getRow() {
+               return field_1_row;
+       }
+
+       public final boolean isRowRelative() {
+               return rowRelative.isSet(field_2_col);
+       }
+
+       public final void setRowRelative(boolean rel) {
+               field_2_col = rowRelative.setBoolean(field_2_col, rel);
+       }
+
+       public final boolean isColRelative() {
+               return colRelative.isSet(field_2_col);
+       }
+
+       public final void setColRelative(boolean rel) {
+               field_2_col = colRelative.setBoolean(field_2_col, rel);
+       }
+
+       public final void setColumn(int col) {
+               if (col < 0 || col >= 0x100) {
+                       throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range");
+               }
+               field_2_col = column.setValue(field_2_col, col);
+       }
+
+       public final int getColumn() {
+               return column.getValue(field_2_col);
+       }
+
+       protected final String formatReferenceAsString() {
+               // Only make cell references as needed. Memory is an issue
+               CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(), !isColRelative());
+               return cr.formatAsString();
+       }
+
+       public final byte getDefaultOperandClass() {
+               return Ptg.CLASS_REF;
+       }
 }
index 2f34e2e360d48b3f90702066aa3190d72d0add85..cd6749e5bc0f06e8162229c8ee1e4f3f89e1e275 100644 (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);
         }
     }
 
index 0b17e268e254e5a732e6872ff8cf2ffa12ab79f8..c62783a3a094cb288a75d17e444da4802b35e03a 100644 (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() {
index fdd82ce54927fb5bc0e52c053b6648f84b07c726..2c80ab6fe69349569ae8057b96ff685b110e70e2 100644 (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()
index d073878707f61bb3ddc7b143a5b85e728df1c10b..d441a0098d56169c7fb468d18dc64c7cd97e03c0 100644 (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;
     }
-
-    
 }
index 7bb632b59598a543b8a4c1d77674a40b3e07a357..4f9d4be30507536280c6f5c8412efc769e6cb541 100644 (file)
 
 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");
        }
 }
diff --git a/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java b/src/java/org/apache/poi/util/LittleEndianByteArrayOutputStream.java
new file mode 100644 (file)
index 0000000..598a9cb
--- /dev/null
@@ -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;
+       }
+}