/*
* wordmac.c
* Copyright (C) 2002-2004 A.J. van Os; Released under GNU GPL
*
* Description:
* Deal with the MAC internals of a MS Word file
*/

#include "antiword.h"


/*
* bGetDocumentText - make a list of the text blocks of a Word document
*
* Return TRUE when succesful, otherwise FALSE
*/
static BOOL
bGetDocumentText(FILE *pFile, const UCHAR *aucHeader)
{
       text_block_type tTextBlock;
       ULONG   ulBeginOfText, ulEndOfText;
       ULONG   ulTextLen;
       UCHAR   ucDocStatus;
       BOOL    bFastSaved;

       fail(pFile == NULL);
       fail(aucHeader == NULL);

       DBG_MSG("bGetDocumentText");

       NO_DBG_PRINT_BLOCK(aucHeader, 0x20);

       /* Get the status flags from the header */
       ucDocStatus = ucGetByte(0x0a, aucHeader);
       DBG_HEX(ucDocStatus);
       bFastSaved = (ucDocStatus & BIT(5)) != 0;
       DBG_MSG_C(bFastSaved, "This document is Fast Saved");
       if (bFastSaved) {
               werr(0, "MacWord: fast saved documents are not supported yet");
               return FALSE;
       }

       /* Get length information */
       ulBeginOfText = ulGetLongBE(0x14, aucHeader);
       DBG_HEX(ulBeginOfText);
       ulEndOfText = ulGetLongBE(0x18, aucHeader);
       DBG_HEX(ulEndOfText);
       ulTextLen = ulEndOfText - ulBeginOfText;
       DBG_DEC(ulTextLen);
       tTextBlock.ulFileOffset = ulBeginOfText;
       tTextBlock.ulCharPos = ulBeginOfText;
       tTextBlock.ulLength = ulTextLen;
       tTextBlock.bUsesUnicode = FALSE;
       tTextBlock.usPropMod = IGNORE_PROPMOD;
       if (!bAdd2TextBlockList(&tTextBlock)) {
               DBG_HEX(tTextBlock.ulFileOffset);
               DBG_HEX(tTextBlock.ulCharPos);
               DBG_DEC(tTextBlock.ulLength);
               DBG_DEC(tTextBlock.bUsesUnicode);
               DBG_DEC(tTextBlock.usPropMod);
               return FALSE;
       }
       return TRUE;
} /* end of bGetDocumentText */

/*
* iInitDocumentMAC - initialize an MAC document
*
* Returns the version of Word that made the document or -1
*/
int
iInitDocumentMAC(FILE *pFile, long lFilesize)
{
       int     iWordVersion;
       BOOL    bSuccess;
       USHORT  usIdent;
       UCHAR   aucHeader[256];

       fail(pFile == NULL);

       if (lFilesize < 256) {
               return -1;
       }

       /* Read the headerblock */
       if (!bReadBytes(aucHeader, 256, 0x00, pFile)) {
               return -1;
       }
       /* Get the "magic number" from the header */
       usIdent = usGetWord(0x00, aucHeader);
       DBG_HEX(usIdent);
       fail(usIdent != 0x37fe);        /* MacWord 4 and 5 */
       iWordVersion = iGetVersionNumber(aucHeader);
       if (iWordVersion != 4 && iWordVersion != 5) {
               werr(0, "This file is not from ''Mac Word 4 or 5'.");
               return -1;
       }
       bSuccess = bGetDocumentText(pFile, aucHeader);
       if (bSuccess) {
               vGetPropertyInfo(pFile, NULL,
                               NULL, 0, NULL, 0,
                               aucHeader, iWordVersion);
               vSetDefaultTabWidth(pFile, NULL,
                               NULL, 0, NULL, 0,
                               aucHeader, iWordVersion);
       }
       return bSuccess ? iWordVersion : -1;
} /* end of iInitDocumentMAC */