00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "antiword.h"
00010
00011
00012
00013
00014
00015
00016
00017 static BOOL
00018 bGetDocumentText(FILE *pFile, long lFilesize, const UCHAR *aucHeader)
00019 {
00020 text_block_type tTextBlock;
00021 ULONG ulTextLen;
00022 BOOL bFastSaved;
00023 UCHAR ucDocStatus, ucVersion;
00024
00025 fail(pFile == NULL);
00026 fail(lFilesize < 128);
00027 fail(aucHeader == NULL);
00028
00029
00030 ucDocStatus = ucGetByte(0x75, aucHeader);
00031 DBG_HEX(ucDocStatus);
00032 bFastSaved = (ucDocStatus & BIT(1)) != 0;
00033 DBG_MSG_C(bFastSaved, "This document is Fast Saved");
00034 ucVersion = ucGetByte(0x74, aucHeader);
00035 DBG_DEC(ucVersion);
00036 DBG_MSG_C(ucVersion == 0, "Written by Word 4.0 or earlier");
00037 DBG_MSG_C(ucVersion == 3, "Word 5.0 format, but not written by Word");
00038 DBG_MSG_C(ucVersion == 4, "Written by Word 5.x");
00039 if (bFastSaved) {
00040 werr(0, "Word for DOS: autosave documents are not supported");
00041 return FALSE;
00042 }
00043
00044
00045 ulTextLen = ulGetLong(0x0e, aucHeader);
00046 DBG_HEX(ulTextLen);
00047 ulTextLen -= 128;
00048 DBG_DEC(ulTextLen);
00049 tTextBlock.ulFileOffset = 128;
00050 tTextBlock.ulCharPos = 128;
00051 tTextBlock.ulLength = ulTextLen;
00052 tTextBlock.bUsesUnicode = FALSE;
00053 tTextBlock.usPropMod = IGNORE_PROPMOD;
00054 if (!bAdd2TextBlockList(&tTextBlock)) {
00055 DBG_HEX(tTextBlock.ulFileOffset);
00056 DBG_HEX(tTextBlock.ulCharPos);
00057 DBG_DEC(tTextBlock.ulLength);
00058 DBG_DEC(tTextBlock.bUsesUnicode);
00059 DBG_DEC(tTextBlock.usPropMod);
00060 return FALSE;
00061 }
00062 return TRUE;
00063 }
00064
00065
00066
00067
00068
00069
00070 int
00071 iInitDocumentDOS(FILE *pFile, long lFilesize)
00072 {
00073 int iWordVersion;
00074 BOOL bSuccess;
00075 USHORT usIdent;
00076 UCHAR aucHeader[128];
00077
00078 fail(pFile == NULL);
00079
00080 if (lFilesize < 128) {
00081 return -1;
00082 }
00083
00084
00085 if (!bReadBytes(aucHeader, 128, 0x00, pFile)) {
00086 return -1;
00087 }
00088
00089 usIdent = usGetWord(0x00, aucHeader);
00090 DBG_HEX(usIdent);
00091 fail(usIdent != 0xbe31);
00092 iWordVersion = iGetVersionNumber(aucHeader);
00093 if (iWordVersion != 0) {
00094 werr(0, "This file is not from 'Word for DOS'.");
00095 return -1;
00096 }
00097 bSuccess = bGetDocumentText(pFile, lFilesize, aucHeader);
00098 if (bSuccess) {
00099 vGetPropertyInfo(pFile, NULL,
00100 NULL, 0, NULL, 0,
00101 aucHeader, iWordVersion);
00102 vSetDefaultTabWidth(pFile, NULL,
00103 NULL, 0, NULL, 0,
00104 aucHeader, iWordVersion);
00105 vGetNotesInfo(pFile, NULL,
00106 NULL, 0, NULL, 0,
00107 aucHeader, iWordVersion);
00108 }
00109 return bSuccess ? iWordVersion : -1;
00110 }