acoliver    02/05/26 16:19:59

  Modified:    src/java/org/apache/poi/hssf/record/formula
                        FormulaParser.java Ptg.java
  Added:       src/java/org/apache/poi/hssf/record/formula StringPtg.java
  Log:
  Patches from Werner Froidevaux
  
  Revision  Changes    Path
  1.18      +21 -12    
jakarta-poi/src/java/org/apache/poi/hssf/record/formula/FormulaParser.java
  
  Index: FormulaParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/FormulaParser.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- FormulaParser.java        4 May 2002 15:45:05 -0000       1.17
  +++ FormulaParser.java        26 May 2002 23:19:58 -0000      1.18
  @@ -70,7 +70,7 @@
    *           Lets Build a Compiler, by Jack Crenshaw
    * BNF for the formula expression is :
    * <expression> ::= <term> [<addop> <term>]*
  - * <term> ::= <factor>  [ <mulop> <factor ]*
  + * <term> ::= <factor>  [ <mulop> <factor> ]*
    * <factor> ::= <number> | (<expression>) | <cellRef> | <function>
    * <function> ::= <functionName> ([expression [, expression]*])
    *
  @@ -281,8 +281,13 @@
               numArgs++; 
               Expression();
           }
  -        while (Look == ',') { //TODO handle EmptyArgs
  -            Match(',');
  +        while (Look == ','  || Look == ';') { //TODO handle EmptyArgs
  +            if(Look == ',') {
  +              Match(',');
  +            }
  +            else {
  +              Match(';');
  +            }
               Expression();
               numArgs++;
           }
  @@ -454,15 +459,19 @@
           String[] operands;
           for (int i=0;i<numPtgs;i++) {
               if (ptgs[i] instanceof OperationPtg) {
  -                o = (OperationPtg) ptgs[i];
  -                numOperands = o.getNumberOfOperands();
  -                operands = new String[numOperands];
  -                for (int j=0;j<numOperands;j++) {
  -                    operands[numOperands-j-1] = (String) stack.pop(); //TODO: catch 
stack underflow and throw parse exception. 
  -                    
  -                }  
  -                String result = o.toFormulaString(operands);
  -                stack.push(result);
  +                // Excel allows to have AttrPtg at position 0 (such as Blanks) which
  +                // do not have any operands. Skip them.
  +                if(i > 0) {
  +                  o = (OperationPtg) ptgs[i];
  +                  numOperands = o.getNumberOfOperands();
  +                  operands = new String[numOperands];
  +                  for (int j=0;j<numOperands;j++) {
  +                      operands[numOperands-j-1] = (String) stack.pop(); //TODO: 
catch stack underflow and throw parse exception. 
  +                      
  +                  }  
  +                  String result = o.toFormulaString(operands);
  +                  stack.push(result);
  +                }
               } else {
                   stack.push(ptgs[i].toFormulaString());
               }
  
  
  
  1.16      +7 -9      jakarta-poi/src/java/org/apache/poi/hssf/record/formula/Ptg.java
  
  Index: Ptg.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/Ptg.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- Ptg.java  6 May 2002 18:23:24 -0000       1.15
  +++ Ptg.java  26 May 2002 23:19:58 -0000      1.16
  @@ -173,7 +173,6 @@
           final int refArea = AreaPtg.sid-0x20;
           final int arrayArea = AreaPtg.sid+0x20;
   
  -        
           switch (id)
           {
   
  @@ -204,7 +203,6 @@
               case ConcatPtg.sid :
                   retval = new ConcatPtg(data, offset);
                   break;
  -                
   
               case AreaPtg.sid :
                   retval = new AreaPtg(data, offset);
  @@ -246,13 +244,13 @@
                   retval = new FunctionPtg(data, offset);
                   break;
                   
  -                
  -             case NumberPtg.sid :
  -                retval = new NumberPtg(data, offset);
  -             break;
  -
  -
  -                
  +            case NumberPtg.sid :
  +               retval = new NumberPtg(data, offset);
  +               break;
  +
  +            case StringPtg.sid :
  +               retval = new StringPtg(data, offset);
  +               break;
   
               case NamePtg.sid :
                   retval = new NamePtg(data, offset);
  
  
  
  1.1                  
jakarta-poi/src/java/org/apache/poi/hssf/record/formula/StringPtg.java
  
  Index: StringPtg.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache POI" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache POI", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.poi.hssf.record.formula;
  
  import org.apache.poi.util.LittleEndian;
  
  /**
   * Number
   * Stores a String value in a formula value stored in the format <length 2 
bytes>char[]
   * @author  Werner Froidevaux
   */
  
  public class StringPtg
      extends Ptg
  {
      public final static int  SIZE = 9;
      public final static byte sid  = 0x17;
      private String            field_1_value;
  
          
      /** Create a StringPtg from a byte array read from disk */
      public StringPtg(byte [] data, int offset)
      {
          setValue(new String(data, offset+3, data[offset+1] + 256*data[offset+2]));
      }
      
      /** Create a StringPtg 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
       */
      protected StringPtg(String value) {
          setValue(value);
      }
      
      
      public void setValue(String value)
      {
          field_1_value = value;
      }
      
      
      public String getValue()
      {
          return field_1_value;
      }
  
      public void writeBytes(byte [] array, int offset)
      {
          array[ offset + 0 ] = sid;
          array[ offset + 1 ] = (byte)(getValue().length() % 256);
          array[ offset + 2 ] = (byte)(getValue().length() / 256);
          System.arraycopy(getValue().getBytes(), 0, array, offset + 3, 
getValue().length());
      }
  
      public int getSize()
      {
          return field_1_value.length() + 3;
      }
  
      public String toFormulaString()
      {
          return getValue();
      }
         
  }
  
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to