From 560bfb7eb3cd77f1a70e8e0b89fbe235656867ad Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Thu, 5 Nov 2009 02:33:32 +0000 Subject: [PATCH] Removed erroneous coding for Ptg 0x1a (see bugzilla 40008) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@832975 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/record/formula/Ptg.java | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/src/java/org/apache/poi/hssf/record/formula/Ptg.java b/src/java/org/apache/poi/hssf/record/formula/Ptg.java index 46c3ab9526..140e366bb4 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Ptg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Ptg.java @@ -25,14 +25,14 @@ import org.apache.poi.util.LittleEndianInput; import org.apache.poi.util.LittleEndianOutput; /** - * Ptg represents a syntactic token in a formula. 'PTG' is an acronym for - * 'parse thing'. Originally, the name referred to the single + * Ptg represents a syntactic token in a formula. 'PTG' is an acronym for + * 'parse thing'. Originally, the name referred to the single * byte identifier at the start of the token, but in POI, Ptg encapsulates * the whole formula token (initial byte + value data). *

- * + * * Ptgs are logically arranged in a tree representing the structure of the - * parsed formula. However, in BIFF files Ptgs are written/read in + * parsed formula. However, in BIFF files Ptgs are written/read in * Reverse-Polish Notation order. The RPN ordering also simplifies formula * evaluation logic, so POI mostly accesses Ptgs in the same way. * @@ -41,29 +41,29 @@ import org.apache.poi.util.LittleEndianOutput; * @author Jason Height (jheight at chariot dot net dot au) */ public abstract class Ptg implements Cloneable { - public static final Ptg[] EMPTY_PTG_ARRAY = { }; + public static final Ptg[] EMPTY_PTG_ARRAY = { }; + - /** * Reads size bytes of the input stream, to create an array of Ptgs. * Extra data (beyond size) may be read if and ArrayPtgs are present. */ public static Ptg[] readTokens(int size, LittleEndianInput in) { - List temp = new ArrayList(4 + size / 2); + List temp = new ArrayList(4 + size / 2); int pos = 0; - List arrayPtgs = null; + List arrayPtgs = null; while (pos < size) { Ptg ptg = Ptg.createPtg(in); if (ptg instanceof ArrayPtg) { if (arrayPtgs == null) { - arrayPtgs = new ArrayList(5); + arrayPtgs = new ArrayList(5); } arrayPtgs.add(ptg); pos += ArrayPtg.PLAIN_TOKEN_SIZE; } else { pos += ptg.getSize(); } - temp.add( ptg ); + temp.add(ptg); } if(pos != size) { throw new RuntimeException("Ptg array size mismatch"); @@ -79,28 +79,27 @@ public abstract class Ptg implements Cloneable { public static Ptg createPtg(LittleEndianInput in) { byte id = in.readByte(); - + if (id < 0x20) { return createBasePtg(id, in); } - + Ptg retval = createClassifiedPtg(id, in); - if (id >= 0x60) { + if (id >= 0x60) { retval.setClass(CLASS_ARRAY); } else if (id >= 0x40) { retval.setClass(CLASS_VALUE); } else { retval.setClass(CLASS_REF); } - return retval; } private static Ptg createClassifiedPtg(byte id, LittleEndianInput in) { - + int baseId = id & 0x1F | 0x20; - + switch (baseId) { case ArrayPtg.sid: return new ArrayPtg(in); // 0x20, 0x40, 0x60 case FuncPtg.sid: return new FuncPtg(in); // 0x21, 0x41, 0x61 @@ -123,7 +122,7 @@ public abstract class Ptg implements Cloneable { case DeletedArea3DPtg.sid: return new DeletedArea3DPtg(in); // 0x3d, 0x5d, 0x7d } throw new UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+ - Integer.toHexString(id) + " (" + ( int ) id + ")"); + Integer.toHexString(id) + " (" + ( int ) id + ")"); } private static Ptg createBasePtg(byte id, LittleEndianInput in) { @@ -153,8 +152,7 @@ public abstract class Ptg implements Cloneable { case MissingArgPtg.sid: return MissingArgPtg.instance; // 0x16 case StringPtg.sid: return new StringPtg(in); // 0x17 - case AttrPtg.sid: - case 0x1a: return new AttrPtg(in); // 0x19 + case AttrPtg.sid: return new AttrPtg(in); // 0x19 case ErrPtg.sid: return ErrPtg.read(in); // 0x1c case BoolPtg.sid: return new BoolPtg(in); // 0x1d case IntPtg.sid: return new IntPtg(in); // 0x1e @@ -167,7 +165,7 @@ public abstract class Ptg implements Cloneable { * if the class is immutable. */ public final Ptg copy() { - // TODO - all base tokens are logically immutable, but AttrPtg needs some clean-up + // TODO - all base tokens are logically immutable, but AttrPtg needs some clean-up if (this instanceof ValueOperatorPtg) { return this; } @@ -184,7 +182,7 @@ public abstract class Ptg implements Cloneable { throw new RuntimeException(e); } } - private static Ptg[] toPtgArray(List l) { + private static Ptg[] toPtgArray(List l) { if (l.isEmpty()) { return EMPTY_PTG_ARRAY; } @@ -193,9 +191,9 @@ public abstract class Ptg implements Cloneable { return result; } /** - * This method will return the same result as {@link #getEncodedSizeWithoutArrayData(Ptg[])} + * This method will return the same result as {@link #getEncodedSizeWithoutArrayData(Ptg[])} * if there are no array tokens present. - * @return the full size taken to encode the specified Ptgs + * @return the full size taken to encode the specified Ptgs */ public static int getEncodedSize(Ptg[] ptgs) { int result = 0; @@ -221,7 +219,7 @@ public abstract class Ptg implements Cloneable { return result; } /** - * Writes the ptgs to the data buffer, starting at the specified offset. + * Writes the ptgs to the data buffer, starting at the specified offset. * *
* The 2 byte encode length field is not written by this method. @@ -229,10 +227,10 @@ public abstract class Ptg implements Cloneable { */ public static int serializePtgs(Ptg[] ptgs, byte[] array, int offset) { int nTokens = ptgs.length; - + LittleEndianByteArrayOutputStream out = new LittleEndianByteArrayOutputStream(array, offset); - List arrayPtgs = null; + List arrayPtgs = null; for (int k = 0; k < nTokens; k++) { Ptg ptg = ptgs[k]; @@ -240,7 +238,7 @@ public abstract class Ptg implements Cloneable { ptg.write(out); if (ptg instanceof ArrayPtg) { if (arrayPtgs == null) { - arrayPtgs = new ArrayList(5); + arrayPtgs = new ArrayList(5); } arrayPtgs.add(ptg); } @@ -255,17 +253,12 @@ public abstract class Ptg implements Cloneable { } /** - * @return the encoded length of this Ptg, including the initial Ptg type identifier byte. + * @return the encoded length of this Ptg, including the initial Ptg type identifier byte. */ public abstract int getSize(); - - /** - * //@return the encoded length of this Ptg, not including the initial Ptg type identifier byte. - */ -// public abstract int getDataSize(); public abstract void write(LittleEndianOutput out); - + /** * return a string representation of this token alone */ @@ -298,7 +291,7 @@ public abstract class Ptg implements Cloneable { public final byte getPtgClass() { return ptgClass; } - + /** * Debug / diagnostic method to get this token's 'operand class' type. * @return 'R' for 'reference', 'V' for 'value', 'A' for 'array' and '.' for base tokens @@ -348,5 +341,4 @@ public abstract class Ptg implements Cloneable { } return false; } - }