📄 worddos.c
字号:
/* * worddos.c * Copyright (C) 2002-2005 A.J. van Os; Released under GNU GPL * * Description: * Deal with the DOS 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 BOOLbGetDocumentText(FILE *pFile, long lFilesize, const UCHAR *aucHeader){ text_block_type tTextBlock; ULONG ulTextLen; BOOL bFastSaved; UCHAR ucDocStatus, ucVersion; fail(pFile == NULL); fail(lFilesize < 128); fail(aucHeader == NULL); /* Get the status flags from the header */ ucDocStatus = ucGetByte(0x75, aucHeader); DBG_HEX(ucDocStatus); bFastSaved = (ucDocStatus & BIT(1)) != 0; DBG_MSG_C(bFastSaved, "This document is Fast Saved"); ucVersion = ucGetByte(0x74, aucHeader); DBG_DEC(ucVersion); DBG_MSG_C(ucVersion == 0, "Written by Word 4.0 or earlier"); DBG_MSG_C(ucVersion == 3, "Word 5.0 format, but not written by Word"); DBG_MSG_C(ucVersion == 4, "Written by Word 5.x"); if (bFastSaved) { werr(0, "Word for DOS: autosave documents are not supported"); return FALSE; } /* Get length information */ ulTextLen = ulGetLong(0x0e, aucHeader); DBG_HEX(ulTextLen); ulTextLen -= 128; DBG_DEC(ulTextLen); tTextBlock.ulFileOffset = 128; tTextBlock.ulCharPos = 128; 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 *//* * iInitDocumentDOS - initialize an DOS document * * Returns the version of Word that made the document or -1 */intiInitDocumentDOS(FILE *pFile, long lFilesize){ int iWordVersion; BOOL bSuccess; USHORT usIdent; UCHAR aucHeader[128]; fail(pFile == NULL); if (lFilesize < 128) { return -1; } /* Read the headerblock */ if (!bReadBytes(aucHeader, 128, 0x00, pFile)) { return -1; } /* Get the "magic number" from the header */ usIdent = usGetWord(0x00, aucHeader); DBG_HEX(usIdent); fail(usIdent != 0xbe31); /* Word for DOS */ iWordVersion = iGetVersionNumber(aucHeader); if (iWordVersion != 0) { werr(0, "This file is not from 'Word for DOS'."); return -1; } bSuccess = bGetDocumentText(pFile, lFilesize, aucHeader); if (bSuccess) { vGetPropertyInfo(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); vSetDefaultTabWidth(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); vGetNotesInfo(pFile, NULL, NULL, 0, NULL, 0, aucHeader, iWordVersion); } return bSuccess ? iWordVersion : -1;} /* end of iInitDocumentDOS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -