[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/koffice/1.5/koffice/filters/kspread/excel/sidewinder
From:       Ariya Hidayat <ariya () kde ! org>
Date:       2006-04-04 18:38:36
Message-ID: 1144175916.772302.13584.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 526464 by ariya:

simplify handling of OpenDocument's version of the formula
disable few (useless) debug messages
fix crashes by incomplete/insane strings record
fix crashes due to unimplemented array-formula



 M  +89 -22    excel.cpp  


--- branches/koffice/1.5/koffice/filters/kspread/excel/sidewinder/excel.cpp #526463:526464
@@ -1150,8 +1150,8 @@
   }
 
   UString result;
-  result.append( UString("[") );  // OpenDocument format
-  
+
+// normal use
   if( !col1Relative )
     result.append( UString("$") );
   result.append( Cell::columnLabel( col1Ref ) );  
@@ -1165,8 +1165,6 @@
   if( !row2Relative )
     result.append( UString("$") );
   result.append( UString::from( row2Ref+1 ) );  
-  
-  result.append( UString("]") );// OpenDocument format
 
   return result;  
 }
@@ -1210,20 +1208,43 @@
 
   UString result;
 
-  result.append( UString("[") );  // OpenDocument format
-  
   if( !colRelative )
     result.append( UString("$") );
   result.append( Cell::columnLabel( colRef ) );  
   if( !rowRelative )
     result.append( UString("$") );
   result.append( UString::from( rowRef+1 ) );  
-  
-  result.append( UString("]") );// OpenDocument format
 
   return result;  
 }
 
+// only when id is Matrix
+unsigned FormulaToken::refRow() const
+{
+  // FIXME check data size !
+  unsigned char buf[2];
+
+  buf[0] = d->data[0];
+  buf[1] = d->data[1];
+  unsigned ref = readU16(buf);
+
+  return ref;
+}
+
+// only when id is Matrix
+unsigned FormulaToken::refColumn() const
+{
+  // FIXME check data size !
+  unsigned char buf[2];
+
+  buf[0] = d->data[2];
+  buf[1] = d->data[3];
+  unsigned ref = readU16(buf);
+
+  return ref;
+}
+
+
 std::ostream& Swinder::operator<<( std::ostream& s,  Swinder::FormulaToken token )
 {
   s << std::setw(2) << std::hex << token.id() << std::dec;
@@ -3743,6 +3764,10 @@
     offset += es.size();
   }
 
+  // safety, add null string if we can't read all of the rest
+  while( d->strings.size() < d->count )
+	  d->strings.push_back( UString() );
+
   
   // sanity check, adjust to safer condition
   if( d->count < d->strings.size() )
@@ -4472,7 +4497,7 @@
   POLE::Storage storage( filename );
   if( !storage.open() )
   {
-    std::cerr << "Cannot open " << filename << std::endl;
+    //std::cerr << "Cannot open " << filename << std::endl;
     return false;
   }
   
@@ -4488,7 +4513,7 @@
   
   if( stream->fail() )
   {
-    std::cerr << filename << " is not Excel workbook" << std::endl;
+    //std::cerr << filename << " is not Excel workbook" << std::endl;
     delete stream;
     return false;
   }
@@ -4886,8 +4911,14 @@
   unsigned xfIndex = record->xfIndex();
   Value value = record->result();
   
-  UString formula = decodeFormula( row, column, record->tokens() );
-  
+#if 1
+  // this gives the formula in OpenDocument format, e.g. "=SUM([A1]; [A2])
+  UString formula = decodeFormula( row, column, record->tokens(), true );
+#else
+  // this gives the formula in standard Excel format, e.g. "=SUM(A1, A2)
+  UString formula = decodeFormula( row, column, record->tokens(), true );
+#endif
+
   Cell* cell = d->activeSheet->cell( column, row, true );
   if( cell )
   {
@@ -5547,14 +5578,18 @@
 {
   if( !stack ) return;
   if( !stack->size() ) return;
+  if( count < 1 ) return;
   
   UString s1, s2;
 	
   while(count)
   {
 	count--;
-    
-    UString last = (*stack)[ stack->size()-1 ];
+
+        // sanity check
+	if(stack->size() == 0) break;
+
+    UString last = stack->at( stack->size()-1 );
     UString tmp = last;
     tmp.append( s1 );
     s1 = tmp;
@@ -5586,10 +5621,15 @@
 }
 #endif
 
-UString ExcelReader::decodeFormula( unsigned row, unsigned col, const FormulaTokens& tokens )
+UString ExcelReader::decodeFormula( unsigned row, unsigned col, 
+  const FormulaTokens& tokens, bool openDocumentFormat )
 {
   UStringStack stack;
   
+  UString argumentSeparator(",");
+  if( openDocumentFormat )
+    argumentSeparator = UString(";");
+  
   for( unsigned c=0; c < tokens.size(); c++ )
   {
     FormulaToken token = tokens[c];
@@ -5663,6 +5703,7 @@
         break;
       
       case FormulaToken::UPlus:
+		if(stack.size() > 1)
         {
           UString str( "+" );
           str.append( stack[ stack.size()-1 ] );
@@ -5671,6 +5712,7 @@
         break;
     
       case FormulaToken::UMinus:  
+		if(stack.size() > 1)
         {
           UString str( "-" );
           str.append( stack[ stack.size()-1 ] );
@@ -5725,16 +5767,32 @@
         break;
       
       case FormulaToken::Ref:
-        stack.push_back( token.ref( row, col ) );
+        {
+        	UString refName;
+        	if( openDocumentFormat )
+        	  refName = UString("[");
+        	refName.append( token.ref( row, col ) );
+        	if( openDocumentFormat )
+        	  refName.append(UString("]"));
+          stack.push_back( refName );
+        }
         break;
       
       case FormulaToken::Area:
-        stack.push_back( token.area( row, col ) );
+        {
+        	UString areaName;
+        	if( openDocumentFormat )
+        	  areaName = UString("[");
+        	areaName.append( token.area( row, col ) );
+        	if( openDocumentFormat )
+        	  areaName.append(UString("]"));
+          stack.push_back( areaName);
+        }
         break;
 
       case FormulaToken::Function:
         {
-          mergeTokens( &stack, token.functionParams(), UString(";") );
+          mergeTokens( &stack, token.functionParams(), argumentSeparator );
           if( stack.size() )
           {
             UString str( token.functionName() ? token.functionName() : "??" );
@@ -5749,7 +5807,7 @@
       case FormulaToken::FunctionVar:
         if( token.functionIndex() != 255 )
         {
-          mergeTokens( &stack, token.functionParams(), UString(";") );
+          mergeTokens( &stack, token.functionParams(), argumentSeparator );
           if( stack.size() )
           {
             UString str;
@@ -5764,7 +5822,7 @@
         else
         {
           unsigned count = token.functionParams()-1;
-          mergeTokens( &stack, count, UString(";") );
+          mergeTokens( &stack, count, argumentSeparator );
           if( stack.size() )
           {
             UString str;
@@ -5779,7 +5837,7 @@
       case FormulaToken::Attr:
         if( token.attr() & 0x10 )  // SUM
         {
-          mergeTokens( &stack, 1, UString(";") );
+          mergeTokens( &stack, 1, argumentSeparator );
           if( stack.size() )
           {
             UString str( "SUM" );
@@ -5797,6 +5855,14 @@
           stack.push_back( d->nameTable[ token.nameIndex()-1 ] );
         break;
 
+	  case FormulaToken::Matrix:
+		  {
+			  int row = token.refRow();
+			  int col = token.refColumn();
+			  //std::cout << "row is " << row << " col is " << col << std::endl;
+		  }
+		  break;
+
       case FormulaToken::NatFormula:
       case FormulaToken::Sheet:
       case FormulaToken::EndSheet:
@@ -5818,7 +5884,8 @@
       case FormulaToken::AreaErr3d:
       default:
         // FIXME handle this !
-        stack.push_back( UString("Unknown") );
+        stack.push_back( UString("UnknownToken") );
+		//std::cout << "UnknownToken ID=" << token.id() << std::endl;
         break;
     };
 
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic