Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * 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 */