Did some more work on the WordPerfect importer. Changed the byte dispatch 
stuff from a "switch" structure to a "function pointer" structure. Added some 
more stubs for various byte functions. Changed the way the undo byte is 
handled. This fixes bug #1927, although the important document looks 
terrible-- clearly more work is still required.. (assistance is, as always, 
welcome)

The patch is in unified diff format.

PS: I have created a bugzilla account. [EMAIL PROTECTED]

Regards,

William Lachance
[EMAIL PROTECTED]
--- ie_imp_WordPerfect.cpp	Mon Sep 17 03:32:12 2001
+++ /home/apostle/wpdev/ie_imp_WordPerfect.cpp	Mon Sep 17 03:24:28 2001
@@ -74,6 +74,13 @@
    m_justificationMode = WordPerfectParagraphProperties::full;
 }
 
+WordPerfectByteTag::WordPerfectByteTag(unsigned char byte, UT_Error (IE_Imp_WordPerfect::*func)())
+{
+   m_byte = byte;
+   m_func = func;
+}
+
+
 
 /****************************************************************************/
 /****************************************************************************/
@@ -211,6 +218,31 @@
 {
    m_firstParagraph = true;
    m_undoOn = false;
+
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_SOFT_EOL, &IE_Imp_WordPerfect::_insertSpace));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_SOFT_SPACE, &IE_Imp_WordPerfect::_insertSpace));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_HARD_HYPHEN, &IE_Imp_WordPerfect::_insertHyphen));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_EXTENDED_CHARACTER, &IE_Imp_WordPerfect::_handleExtendedCharacter));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_DORMANT_HARD_RETURN, &IE_Imp_WordPerfect::_handleHardEndOfLine));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_HARD_EOL, &IE_Imp_WordPerfect::_handleHardEndOfLine));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_EOL_GROUP, &IE_Imp_WordPerfect::_handleEndOfLineGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_PAGE_GROUP, &IE_Imp_WordPerfect::_handlePageGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_COLUMN_GROUP, &IE_Imp_WordPerfect::_handleColumnGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_PARAGRAPH_GROUP, &IE_Imp_WordPerfect::_handleParagraphGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_SET_NUMBER_GROUP, &IE_Imp_WordPerfect::_handleSetNumberGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_NUMBERING_METHOD_GROUP, &IE_Imp_WordPerfect::_handleNumberingMethodGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_DISPLAY_NUMBER_REFERENCE_GROUP, &IE_Imp_WordPerfect::_handleDisplayNumberReferenceGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_INCREMENT_NUMBER_GROUP, &IE_Imp_WordPerfect::_handleIncrementNumberGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_DECREMENT_NUMBER_GROUP, &IE_Imp_WordPerfect::_handleDecrementNumberGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_STYLE_GROUP, &IE_Imp_WordPerfect::_handleStyleGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_BOX_GROUP, &IE_Imp_WordPerfect::_handleBoxGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_TAB_GROUP, &IE_Imp_WordPerfect::_handleTabGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_CHARACTER_GROUP, &IE_Imp_WordPerfect::_handleCharacterGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_FOOTENDNOTE_GROUP, &IE_Imp_WordPerfect::_handleFootEndNoteGroup));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_UNDO_GROUP, &IE_Imp_WordPerfect::_handleUndo));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_ATTRIBUTE_ON, &IE_Imp_WordPerfect::_handleAttributeOn));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_ATTRIBUTE_OFF, &IE_Imp_WordPerfect::_handleAttributeOff));
+   m_wordPerfectDispatchBytes.addItem(new WordPerfectByteTag(WP_TOP_UNDO_GROUP, &IE_Imp_WordPerfect::_handleUndo));
 }
 
 IE_Imp_WordPerfect::~IE_Imp_WordPerfect() 
@@ -389,8 +421,6 @@
 {
    UT_DEBUGMSG(("WordPerfect: Parsing the Document \n"));
 
-   wchar_t wc = 0;
-
    X_CheckDocumentError(getDoc()->appendStrux(PTX_Section, NULL));
    
    if (fseek(m_importFile, m_documentPointer, SEEK_SET) != 0)
@@ -400,80 +430,29 @@
      {
 	int readVal = fgetc(m_importFile);
 	X_CheckFileError(readVal);
-
-	switch (readVal)
-	  { 
-	   case WP_TOP_HARD_HYPHEN:
-	     if(!m_undoOn)
-	       {		  
-		  m_Mbtowc.mbtowc(wc, '-');
-		  m_textBuf.append( (UT_uint16 *)&wc, 1);
-	       }
-	     break;
-	   case WP_TOP_SOFT_SPACE:
-	     if(!m_undoOn)
-	       {		  
-		  m_Mbtowc.mbtowc(wc, ' ');
-		  m_textBuf.append( (UT_uint16 *)&wc, 1);
-	       }	     
-	     break;
-	   case WP_TOP_SOFT_EOL:
-	     if(!m_undoOn)
-	       {		  
-		  m_Mbtowc.mbtowc(wc, ' ');
-		  m_textBuf.append( (UT_uint16 *)&wc, 1);
-	       }
-	     break;
-	   case WP_TOP_DORMANT_HARD_RETURN:
-	   case WP_TOP_HARD_EOL: 
-	     X_CheckWordPerfectError(_handleHardEndOfLine());
-	     break;
-	   case WP_TOP_EOL_GROUP: 
-	     X_CheckWordPerfectError(_handleEndOfLineGroup());
-	     break;
-	   case WP_TOP_CHARACTER_GROUP:
-	     X_CheckWordPerfectError(_handleCharacterGroup());
-	     break;
-	   case WP_TOP_PAGE_GROUP:
-	     X_CheckWordPerfectError(_handlePageGroup());
-	     break;
-	   case WP_TOP_COLUMN_GROUP:
-	     X_CheckWordPerfectError(_handleColumnGroup());
-	     break;
-	   case WP_TOP_PARAGRAPH_GROUP:
-	     X_CheckWordPerfectError(_handleParagraphGroup());
-	     break;
-	   case WP_TOP_FOOTENDNOTE_GROUP:
-	     X_CheckWordPerfectError(_handleFootEndNoteGroup());
-	     break;
-	   case WP_TOP_STYLE_GROUP:
-  	     X_CheckWordPerfectError(_handleStyleGroup());
-	     break;
-	   case WP_TOP_TAB_GROUP:
-  	     X_CheckWordPerfectError(_handleTabGroup());
-	     break;
-	   case WP_TOP_EXTENDED_CHARACTER:
-	     X_CheckWordPerfectError(_handleExtendedCharacter());
-	     break;
-	   case WP_TOP_UNDO:
-	     X_CheckWordPerfectError(_handleUndo());
-	     break;
-	   case WP_TOP_ATTRIBUTE_ON:
-	     X_CheckWordPerfectError(_handleAttribute(true));
-	     break;
-	   case WP_TOP_ATTRIBUTE_OFF:
-	     X_CheckWordPerfectError(_handleAttribute(false));
-	     break;
-	   default:	     
-	     if(readVal > 32 && readVal < 127 && !m_undoOn) // ASCII characters
+	
+	if(readVal > 32 && readVal < 127 && !m_undoOn) // ASCII characters
+	  {
+	     //UT_DEBUGMSG((" current char = %c \n",(char)readVal));
+	     wchar_t wc = 0;
+	     m_Mbtowc.mbtowc(wc, (char)readVal);
+	     m_textBuf.append( (UT_uint16 *)&wc, 1);
+	  }	     
+	else 
+	  {
+	     
+	     for (unsigned int i=0; i<m_wordPerfectDispatchBytes.size(); i++)
 	       {
-		  //UT_DEBUGMSG((" current char = %c \n",(char)readVal));
-		  m_Mbtowc.mbtowc(wc, (char)readVal);
-		  m_textBuf.append( (UT_uint16 *)&wc, 1);
-	       }	     
-	     break;
+		  WordPerfectByteTag *dispatchByte = (WordPerfectByteTag *) m_wordPerfectDispatchBytes.getNthItem( i );
+		  if( dispatchByte->m_byte == (unsigned char) readVal )
+		    {
+		       (*this.*(dispatchByte->m_func)) ();
+		       break;
+		    }	  
+	       }
 	  }
      }
+   
 
    
    UT_DEBUGMSG(("WordPerfect: File Pointer at %i exceeds document length of %i\n", (int)ftell(m_importFile), (int)m_documentEnd));
@@ -484,6 +463,30 @@
    return UT_OK;
 }
 
+UT_Error IE_Imp_WordPerfect::_insertSpace()
+{
+   if(!m_undoOn)
+     {
+	wchar_t wc = 0;
+	m_Mbtowc.mbtowc(wc, ' ');
+	m_textBuf.append( (UT_uint16 *)&wc, 1);
+     }
+   
+   return UT_OK;
+}
+
+UT_Error IE_Imp_WordPerfect::_insertHyphen()
+{
+   if(!m_undoOn)
+     {		  
+	wchar_t wc = 0;
+	m_Mbtowc.mbtowc(wc, '-');
+	m_textBuf.append( (UT_uint16 *)&wc, 1);
+     }
+   
+   return UT_OK;
+}
+
 UT_Error IE_Imp_WordPerfect::_handleHardEndOfLine()
 {
    // (TODO: eliminate a prev space if it's just before this)
@@ -617,7 +620,7 @@
    return UT_OK;
 }
 
-// handles a tab group
+// handles a foot or end note group
 // (TODO: not implemented, just skips over it)
 UT_Error IE_Imp_WordPerfect::_handleFootEndNoteGroup()
 {
@@ -627,12 +630,71 @@
    return UT_OK;
 }
 
-// handles an attribute byte in wordperfect. if attributeOn is true,
-// turn the attribute on, if attributeOn is false, turn the attribute
-// off.
-UT_Error IE_Imp_WordPerfect::_handleAttribute(bool attributeOn)
+// handles a set number group
+// (TODO: not implemented, just skips over it)
+UT_Error IE_Imp_WordPerfect::_handleSetNumberGroup()
+{
+   UT_DEBUGMSG(("WordPerfect: Handling a set number group\n"));
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_SET_NUMBER_GROUP));
+   
+   return UT_OK;
+}
+
+// handles a numbering method group
+// (TODO: not implemented, just skips over it)
+UT_Error IE_Imp_WordPerfect::_handleNumberingMethodGroup()
+{
+   UT_DEBUGMSG(("WordPerfect: Handling a numbering method group\n"));
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_NUMBERING_METHOD_GROUP));
+   
+   return UT_OK;
+}
+
+
+// handles a display number reference group
+// (TODO: not implemented, just skips over it)
+UT_Error IE_Imp_WordPerfect::_handleDisplayNumberReferenceGroup()
+{
+   UT_DEBUGMSG(("WordPerfect: Handling a display number rerference group\n"));
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_DISPLAY_NUMBER_REFERENCE_GROUP));
+   
+   return UT_OK;
+}
+
+// handles a increment number group
+// (TODO: not implemented, just skips over it)
+UT_Error IE_Imp_WordPerfect::_handleIncrementNumberGroup()
+{
+   UT_DEBUGMSG(("WordPerfect: Handling an increment number group\n"));
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_INCREMENT_NUMBER_GROUP));
+   
+   return UT_OK;
+}
+
+
+// handles a decrement number reference group
+// (TODO: not implemented, just skips over it)
+UT_Error IE_Imp_WordPerfect::_handleDecrementNumberGroup()
+{
+   UT_DEBUGMSG(("WordPerfect: Handling a decrement number group\n"));
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_DECREMENT_NUMBER_GROUP));
+   
+   return UT_OK;
+}
+
+UT_Error IE_Imp_WordPerfect::_handleBoxGroup()
+{
+   UT_DEBUGMSG(("WordPerfect: Handling a box group\n"));
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_BOX_GROUP));
+   
+   return UT_OK;
+}
+
+// handles an attribute "on" byte in wordperfect. turns a formatting/style
+// property on.
+UT_Error IE_Imp_WordPerfect::_handleAttributeOn()
 {   
-   UT_DEBUGMSG(("WordPerfect: Handling an attribute\n"));
+   UT_DEBUGMSG(("WordPerfect: Handling an attribute ON\n"));
    int readVal = fgetc(m_importFile); // TODO: handle case that we get eof?
    X_CheckFileError(readVal);
    
@@ -646,10 +708,10 @@
 	switch (readVal)
 	  { 
 	   case 14: // underline
-	     m_textAttributes.m_underLine = attributeOn;
+	     m_textAttributes.m_underLine = true;
 	     break;
 	   case 12: // bold
-	     m_textAttributes.m_bold = attributeOn;
+	     m_textAttributes.m_bold = true;
 	     break;
 	   default: // something we don't support yet
 	     break;
@@ -657,16 +719,42 @@
         
  	X_CheckWordPerfectError(_appendCurrentTextProperties());
      }
+      
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_ATTRIBUTE_ON));
+   return UT_OK;
+}
+
+// handles an attribute "off" byte in wordperfect. turns a formatting/style
+// property off.
+UT_Error IE_Imp_WordPerfect::_handleAttributeOff()
+{   
+   UT_DEBUGMSG(("WordPerfect: Handling an attribute OFF\n"));
+   int readVal = fgetc(m_importFile); // TODO: handle case that we get eof?
+   X_CheckFileError(readVal);
    
-   // read the ending byte
-   readVal = fgetc(m_importFile); 
-   if((attributeOn && readVal != WP_TOP_ATTRIBUTE_ON) ||
-      (!attributeOn && readVal != WP_TOP_ATTRIBUTE_OFF))
+   if(!m_undoOn)
      {
-	UT_DEBUGMSG(("WordPerfect: Error! Didn't receive the anticipated closing byte!\n"));
-	return UT_IE_IMPORTERROR;
+	// flush what's come before this change (even if it's nothing, which
+	// IS a case we have to be worried about in case we are writing the first
+	// paragraph)
+	X_CheckWordPerfectError(_flushText());
+
+	switch (readVal)
+	  { 
+	   case 14: // underline
+	     m_textAttributes.m_underLine = false;
+	     break;
+	   case 12: // bold
+	     m_textAttributes.m_bold = false;
+	     break;
+	   default: // something we don't support yet
+	     break;
+	  }
+        
+ 	X_CheckWordPerfectError(_appendCurrentTextProperties());
      }
-   
+      
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_ATTRIBUTE_OFF));
    return UT_OK;
 }
 
@@ -800,7 +888,7 @@
 
    int undoType = fgetc(m_importFile);
    X_CheckFileError(undoType);
-   X_CheckWordPerfectError(_skipGroup(WP_TOP_UNDO));
+   X_CheckWordPerfectError(_skipGroup(WP_TOP_UNDO_GROUP));
    
    //X_CheckWordPerfectError(_flushText()); // flush text before the undo
    
--- ie_imp_WordPerfect.h	Mon Sep 17 03:32:14 2001
+++ /home/apostle/wpdev/ie_imp_WordPerfect.h	Mon Sep 17 03:24:33 2001
@@ -59,10 +59,16 @@
 #define WP_TOP_PARAGRAPH_GROUP 211 // (0xd3)
 #define WP_TOP_CHARACTER_GROUP 212 // (0xd4)
 #define WP_TOP_FOOTENDNOTE_GROUP 215 // (0xd7)
+#define WP_TOP_SET_NUMBER_GROUP 216  // (0xd8)
+#define WP_TOP_NUMBERING_METHOD_GROUP 217 // (0xd9)
+#define WP_TOP_DISPLAY_NUMBER_REFERENCE_GROUP 218 // (0xda)
+#define WP_TOP_INCREMENT_NUMBER_GROUP 219 // (0xdb)
+#define WP_TOP_DECREMENT_NUMBER_GROUP 220 // (0xdc)
 #define WP_TOP_STYLE_GROUP 221 // (0xdd)
+#define WP_TOP_BOX_GROUP 222 // (0xde)
 #define WP_TOP_TAB_GROUP 224 // (0xe0)
 #define WP_TOP_EXTENDED_CHARACTER 240// (0xf0)
-#define WP_TOP_UNDO 241 // (0xf1)
+#define WP_TOP_UNDO_GROUP 241 // (0xf1)
 #define WP_TOP_ATTRIBUTE_ON 242 // (0xf2)
 #define WP_TOP_ATTRIBUTE_OFF 243 // (0xf3)
 
@@ -194,13 +200,21 @@
    UT_Error _parseIndexHeader();
    UT_Error _parseFontDescriptorPacket(int packetID, UT_uint32 dataPacketSize, UT_uint32 dataPointer);
    UT_Error _parseDocument();
+   UT_Error _insertSpace();
+   UT_Error _insertHyphen();
    UT_Error _handleHardEndOfLine();
    UT_Error _handleEndOfLineGroup();
    UT_Error _handlePageGroup();
    UT_Error _handleColumnGroup();
    UT_Error _handleParagraphGroup();
    UT_Error _handleParagraphGroupJustification();
+   UT_Error _handleSetNumberGroup();
+   UT_Error _handleNumberingMethodGroup();
+   UT_Error _handleDisplayNumberReferenceGroup();
+   UT_Error _handleIncrementNumberGroup();
+   UT_Error _handleDecrementNumberGroup();
    UT_Error _handleStyleGroup();
+   UT_Error _handleBoxGroup();
    UT_Error _handleTabGroup();
    UT_Error _handleCharacterGroup();
    UT_Error _handleFootEndNoteGroup();
@@ -208,7 +222,8 @@
    UT_Error _handleFontSizeChange();
    UT_Error _handleExtendedCharacter();
    UT_Error _handleUndo();
-   UT_Error _handleAttribute(bool attributeOn);
+   UT_Error _handleAttributeOn();
+   UT_Error _handleAttributeOff();
    UT_Error _skipGroup(int groupByte);
    UT_Error _appendCurrentTextProperties();
    UT_Error _appendCurrentParagraphProperties();
@@ -225,8 +240,16 @@
    UT_Mbtowc m_Mbtowc;
    UT_GrowBuf m_textBuf;
    UT_Vector m_fontDescriptorList;
+   UT_Vector m_wordPerfectDispatchBytes;
    WordPerfectTextAttributes m_textAttributes;
    WordPerfectParagraphProperties m_paragraphProperties;
 };
+
+struct WordPerfectByteTag
+{
+   WordPerfectByteTag( unsigned char byte, UT_Error (IE_Imp_WordPerfect::*func)() );
+   unsigned char m_byte;
+   UT_Error (IE_Imp_WordPerfect::*m_func) () ;
+}; 
 
 #endif /* IE_IMP_WP_H */

Reply via email to