You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by av...@apache.org on 2004/01/01 08:49:16 UTC

cvs commit: jakarta-poi/src/java/org/apache/poi/hssf/usermodel HSSFDateUtil.java

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: poi-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: poi-dev-help@jakarta.apache.org