avik        2003/12/31 23:49:16

  Modified:    src/java/org/apache/poi/hssf/model Tag: REL_2_BRANCH
                        FormulaParser.java
               src/java/org/apache/poi/hssf/record/formula Tag:
                        REL_2_BRANCH AbstractFunctionPtg.java
               src/java/org/apache/poi/hssf/usermodel Tag: REL_2_BRANCH
                        HSSFDateUtil.java
  Log:
  Formula Parser fixes with tests, by Peter M Murray
  Bug 25457.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.13.2.2  +69 -32    
jakarta-poi/src/java/org/apache/poi/hssf/model/FormulaParser.java
  
  Index: FormulaParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/model/FormulaParser.java,v
  retrieving revision 1.13.2.1
  retrieving revision 1.13.2.2
  diff -u -r1.13.2.1 -r1.13.2.2
  --- FormulaParser.java        23 Aug 2003 19:40:04 -0000      1.13.2.1
  +++ FormulaParser.java        1 Jan 2004 07:49:15 -0000       1.13.2.2
  @@ -80,6 +80,7 @@
    *  @author Andrew C. oliver (acoliver at apache dot org)
    *  @author Eric Ladner (eladner at goldinc dot com)
    *  @author Cameron Riley (criley at ekmail.com)
  + *  @author Peter M. Murray (pete at quantrix dot com)
    */
   public class FormulaParser {
       
  @@ -228,13 +229,31 @@
       /** Get an Identifier */
       private String GetName() {
           StringBuffer Token = new StringBuffer();
  -        if (!IsAlpha(look)) {
  +        if (!IsAlpha(look) && look != '\'') {
               Expected("Name");
           }
  -        while (IsAlNum(look)) {
  -            Token = Token.append(Character.toUpperCase(look));
  -            GetChar();
  -        }
  +        if(look == '\'')
  +        {
  +             Match('\'');
  +             boolean done = look == '\'';
  +             while(!done)
  +             {
  +                     Token.append(Character.toUpperCase(look));
  +                     GetChar();
  +                     if(look == '\'')
  +                     {
  +                             Match('\'');
  +                             done = look != '\'';
  +                     }
  +             }
  +        }
  +        else
  +        {
  +             while (IsAlNum(look)) {
  +                 Token.append(Character.toUpperCase(look));
  +                 GetChar();
  +             }
  +             }
           SkipWhite();
           return Token.toString();
       }
  @@ -478,12 +497,18 @@
   
      /** Parse and Translate a Math Factor  */
       private void Factor() {
  -        if (look == '(' ) {
  +     if (look == '-')
  +     {
  +             Match('-');
  +             Factor();
  +             tokens.add(new UnaryMinusPtg());
  +     }
  +        else if (look == '(' ) {
               Match('(');
               Expression();
               Match(')');
               tokens.add(new ParenthesisPtg());
  -        } else if (IsAlpha(look)){
  +        } else if (IsAlpha(look) || look == '\''){
               Ident();
           } else if(look == '"') {
              StringLiteral();
  @@ -501,26 +526,42 @@
           }
       }
       
  -    private void StringLiteral() {
  -        Match('"');
  -               StringBuffer Token = new StringBuffer();
  -               for(;;) {
  -                          if(look == '"') {
  -                     GetChar();
  -                     SkipWhite(); //potential white space here since it doesnt 
matter up to the operator
  -                     if(look == '"')
  -                         Token.append("\"");
  -                     else
  -                         break;
  -                 } else if(look == 0) {
  -                     break;
  -                 } else {
  -                     Token.append(look);
  -                     GetChar();
  -                 }
  +    private void StringLiteral() 
  +     {
  +             // Can't use match here 'cuz it consumes whitespace
  +             // which we need to preserve inside the string.
  +             // - pete
  +             // Match('"');
  +             if (look != '"')
  +                     Expected("\"");
  +             else
  +             {
  +                     GetChar();
  +                     StringBuffer Token = new StringBuffer();
  +                     for (;;)
  +                     {
  +                             if (look == '"')
  +                             {
  +                                     GetChar();
  +                                     SkipWhite(); //potential white space here 
since it doesnt matter up to the operator
  +                                     if (look == '"')
  +                                             Token.append("\"");
  +                                     else
  +                                             break;
  +                             }
  +                             else if (look == 0)
  +                             {
  +                                     break;
  +                             }
  +                             else
  +                             {
  +                                     Token.append(look);
  +                                     GetChar();
  +                             }
  +                     }
  +                     tokens.add(new StringPtg(Token.toString()));
                }
  -             tokens.add(new StringPtg(Token.toString()));        
  -    }
  +     }
       
       /** Recognize and Translate a Multiply */
       private void Multiply(){
  @@ -590,11 +631,7 @@
       
       /** Parse and Translate an Expression */
       private void Expression() {
  -        if (IsAddop(look)) {
  -            EmitLn("CLR D0");  //unaryAdd ptg???
  -        } else {
  -            Term();
  -        }
  +        Term();
           while (IsAddop(look)) {
               if (look == '+' )  Add();
               else if (look == '-') Subtract();
  @@ -725,7 +762,7 @@
       private void setRootLevelRVA(Node n, int formulaType) {
           //Pg 16, excelfileformat.pdf @ openoffice.org
           Ptg p = (Ptg) n.getValue();
  -            if (formulaType == this.FORMULA_TYPE_NAMEDRANGE) {
  +            if (formulaType == FormulaParser.FORMULA_TYPE_NAMEDRANGE) {
                   if (p.getDefaultOperandClass() == Ptg.CLASS_REF) {
                       setClass(n,Ptg.CLASS_REF);
                   } else {
  
  
  
  No                   revision
  No                   revision
  1.10.2.2  +2 -2      
jakarta-poi/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
  
  Index: AbstractFunctionPtg.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java,v
  retrieving revision 1.10.2.1
  retrieving revision 1.10.2.2
  diff -u -r1.10.2.1 -r1.10.2.2
  --- AbstractFunctionPtg.java  23 Aug 2003 19:40:04 -0000      1.10.2.1
  +++ AbstractFunctionPtg.java  1 Jan 2004 07:49:16 -0000       1.10.2.2
  @@ -536,7 +536,7 @@
           functionData[25][0]=new Byte(Ptg.CLASS_VALUE);functionData[25][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[25][2]=new Integer(1);
           functionData[26][0]=new Byte(Ptg.CLASS_VALUE);functionData[26][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[26][2]=new Integer(1);
           functionData[27][0]=new Byte(Ptg.CLASS_VALUE);functionData[27][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[27][2]=new Integer(2);
  -        functionData[28][0]=new Byte(Ptg.CLASS_VALUE);functionData[28][1]=new 
byte[] {Ptg.CLASS_REF};functionData[28][2]=new Integer(-1);
  +        functionData[28][0]=new Byte(Ptg.CLASS_VALUE);functionData[28][1]=new 
byte[] {Ptg.CLASS_VALUE, Ptg.CLASS_REF};functionData[28][2]=new Integer(-1);
           functionData[29][0]=new Byte(Ptg.CLASS_VALUE);functionData[29][1]=new 
byte[] {Ptg.CLASS_REF};functionData[29][2]=new Integer(-1);
           functionData[30][0]=new Byte(Ptg.CLASS_VALUE);functionData[30][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[30][2]=new Integer(2);
           functionData[31][0]=new Byte(Ptg.CLASS_VALUE);functionData[31][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[31][2]=new Integer(3);
  @@ -571,7 +571,7 @@
           functionData[61][0]=new Byte(Ptg.CLASS_VALUE);functionData[61][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[61][2]=new Integer(3);
           functionData[62][0]=new Byte(Ptg.CLASS_VALUE);functionData[62][1]=new 
byte[] {Ptg.CLASS_REF};functionData[62][2]=new Integer(-1);
           functionData[63][0]=new Byte(Ptg.CLASS_VALUE);functionData[63][1]=new 
byte[] {Ptg.CLASS_REF};functionData[63][2]=new Integer(1);
  -        functionData[64][0]=new Byte(Ptg.CLASS_VALUE);functionData[64][1]=new 
byte[] {Ptg.CLASS_REF};functionData[64][2]=new Integer(-1);
  +        functionData[64][0]=new Byte(Ptg.CLASS_VALUE);functionData[64][1]=new 
byte[] {Ptg.CLASS_VALUE, Ptg.CLASS_REF};functionData[64][2]=new Integer(-1);
           functionData[65][0]=new Byte(Ptg.CLASS_VALUE);functionData[65][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[65][2]=new Integer(3);
           functionData[66][0]=new Byte(Ptg.CLASS_VALUE);functionData[66][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[66][2]=new Integer(3);
           functionData[67][0]=new Byte(Ptg.CLASS_VALUE);functionData[67][1]=new 
byte[] {Ptg.CLASS_VALUE};functionData[67][2]=new Integer(1);
  
  
  
  No                   revision
  No                   revision
  1.6.2.1   +0 -12     
jakarta-poi/src/java/org/apache/poi/hssf/usermodel/HSSFDateUtil.java
  
  Index: HSSFDateUtil.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/usermodel/HSSFDateUtil.java,v
  retrieving revision 1.6
  retrieving revision 1.6.2.1
  diff -u -r1.6 -r1.6.2.1
  --- HSSFDateUtil.java 30 Apr 2003 04:39:00 -0000      1.6
  +++ HSSFDateUtil.java 1 Jan 2004 07:49:16 -0000       1.6.2.1
  @@ -186,18 +186,6 @@
                   case 0x2d:
                   case 0x2e:
                   case 0x2f:
  -                // Additional internal date formats found by inspection
  -                // Using Excel v.X 10.1.0 (Mac)
  -                case 0xa4:
  -                case 0xa5:
  -                case 0xa6:
  -                case 0xa7:
  -                case 0xa8:
  -                case 0xa9:
  -                case 0xaa:
  -                case 0xab:
  -                case 0xac:
  -                case 0xad:
                       retval = true;
                       break;
                       
  
  
  

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

Reply via email to