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