mirror of
https://github.com/simon987/antiword.git
synced 2025-04-10 13:06:41 +00:00
109 lines
2.6 KiB
C
109 lines
2.6 KiB
C
/*
|
|
* 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 */
|