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