⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 notes.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * notes.c * Copyright (C) 1998-2005 A.J. van Os; Released under GNU GPL * * Description: * Functions to tell the difference between footnotes and endnotes */#include "antiword.h"/* * Private structures to hide the way the information * is stored from the rest of the program */typedef struct footnote_local_tag {        footnote_block_type	tInfo;        ULONG			ulCharPosStart;        ULONG			ulCharPosNext;        BOOL			bUseful;} footnote_local_type;/* Variables needed to write the Footnote and Endnote information */static ULONG	*aulFootnoteList = NULL;static size_t	tFootnoteListLength = 0;static ULONG	*aulEndnoteList = NULL;static size_t	tEndnoteListLength = 0;/* Variables needed to write the Footnote Text */static footnote_local_type	*pFootnoteText = NULL;static size_t			tFootnoteTextLength = 0;/* * Destroy the lists with footnote and endnote information */voidvDestroyNotesInfoLists(void){	footnote_local_type	*pRecord;	size_t			tFootnote;	TRACE_MSG("vDestroyNotesInfoLists");	/* Free the lists and reset all control variables */	aulEndnoteList = xfree(aulEndnoteList);	aulFootnoteList = xfree(aulFootnoteList);	tEndnoteListLength = 0;	tFootnoteListLength = 0;	for (tFootnote = 0; tFootnote < tFootnoteTextLength; tFootnote++) {		pRecord = pFootnoteText + tFootnote;		pRecord->tInfo.szText = xfree(pRecord->tInfo.szText);	}	pFootnoteText = xfree(pFootnoteText);	tFootnoteTextLength = 0;} /* end of vDestroyNotesInfoLists *//* * Build the list with footnote information for Word for DOS files */static voidvGet0FootnotesInfoAndText(FILE *pFile, const UCHAR *aucHeader){	footnote_local_type	*pCurr;	UCHAR	*aucBuffer;	ULONG	ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo;	ULONG	ulCharPos, ulBeginNextBlock;	size_t	tFootnotes, tFootnoteInfoLen;	size_t	tIndex;	UCHAR   aucTmp[2];	TRACE_MSG("vGet0FootnotesInfoAndText");	fail(pFile == NULL || aucHeader == NULL);	ulBeginOfText = 128;	NO_DBG_HEX(ulBeginOfText);	ulBeginFootnoteInfo =  128 * (ULONG)usGetWord(0x14, aucHeader);	DBG_HEX(ulBeginFootnoteInfo);	ulBeginNextBlock = 128 * (ULONG)usGetWord(0x16, aucHeader);	DBG_HEX(ulBeginNextBlock);	if (ulBeginFootnoteInfo == ulBeginNextBlock) {		DBG_MSG("No Footnotes in this document");		return;	}	/* Read the the number of footnotes + 1 */	if (!bReadBytes(aucTmp, 2, ulBeginFootnoteInfo, pFile)) {		return;	}	tFootnotes = (size_t)usGetWord(0, aucTmp);	if (tFootnotes < 2) {		DBG_MSG("No Footnotes in this document (2)");	}	DBG_DEC(tFootnotes);	tFootnoteInfoLen =  8 * tFootnotes;	aucBuffer = xmalloc(tFootnoteInfoLen);	if (!bReadBytes(aucBuffer,			tFootnoteInfoLen, ulBeginFootnoteInfo + 4, pFile)) {		aucBuffer = xfree(aucBuffer);		return;	}	DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen);	/* Get footnote information */	fail(tFootnoteListLength != 0);	tFootnoteListLength = tFootnotes - 1;	fail(tFootnoteListLength == 0);	fail(aulFootnoteList != NULL);	aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG));	for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {		ulOffset = ulGetLong(tIndex * 8, aucBuffer);		DBG_HEX(ulOffset);		ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);		DBG_HEX(ulFileOffset);		aulFootnoteList[tIndex] = ulFileOffset;	}	/* Get footnote text */	fail(tFootnoteTextLength != 0);	tFootnoteTextLength = tFootnotes - 1;	fail(tFootnoteTextLength == 0);	fail(pFootnoteText != NULL);	pFootnoteText = xcalloc(tFootnoteTextLength,				sizeof(footnote_local_type));	for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) {		pCurr = pFootnoteText + tIndex;		pCurr->tInfo.szText = NULL;		ulOffset = ulGetLong(tIndex * 8 + 4, aucBuffer);		DBG_HEX(ulOffset);		ulCharPos = ulBeginOfText + ulOffset;		DBG_HEX(ulCharPos);		DBG_HEX(ulCharPos2FileOffset(ulCharPos));		pCurr->ulCharPosStart = ulCharPos;		ulOffset = ulGetLong((tIndex + 1) * 8 + 4, aucBuffer);		DBG_HEX(ulOffset);		ulCharPos = ulBeginOfText + ulOffset;		DBG_HEX(ulCharPos);		DBG_HEX(ulCharPos2FileOffset(ulCharPos));		pCurr->ulCharPosNext = ulCharPos;		pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;	}	aucBuffer = xfree(aucBuffer);} /* end of vGet0FootnotesInfoAndText *//* * Build the lists note information for Word for DOS files */static voidvGet0NotesInfo(FILE *pFile, const UCHAR *aucHeader){	TRACE_MSG("vGet0NotesInfo");	vGet0FootnotesInfoAndText(pFile, aucHeader);	/* There are no endnotes in a Word for DOS file */} /* end of vGet0NotesInfo *//* * Build the list with footnote information for WinWord 1/2 files */static voidvGet2FootnotesInfo(FILE *pFile, const UCHAR *aucHeader){	UCHAR	*aucBuffer;	ULONG	ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo;	size_t	tFootnoteInfoLen;	size_t	tIndex;	TRACE_MSG("vGet2FootnotesInfo");	fail(pFile == NULL || aucHeader == NULL);	ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */	NO_DBG_HEX(ulBeginOfText);	ulBeginFootnoteInfo = ulGetLong(0x64, aucHeader); /* fcPlcffndRef */	NO_DBG_HEX(ulBeginFootnoteInfo);	tFootnoteInfoLen = (size_t)usGetWord(0x68, aucHeader); /* cbPlcffndRef */	NO_DBG_DEC(tFootnoteInfoLen);	if (tFootnoteInfoLen < 10) {		DBG_MSG("No Footnotes in this document");		return;	}	aucBuffer = xmalloc(tFootnoteInfoLen);	if (!bReadBytes(aucBuffer,			tFootnoteInfoLen, ulBeginFootnoteInfo, pFile)) {		aucBuffer = xfree(aucBuffer);		return;	}	NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen);	fail(tFootnoteListLength != 0);	tFootnoteListLength = (tFootnoteInfoLen - 4) / 6;	fail(tFootnoteListLength == 0);	fail(aulFootnoteList != NULL);	aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG));	for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {		ulOffset = ulGetLong(tIndex * 4, aucBuffer);		NO_DBG_HEX(ulOffset);		ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);		NO_DBG_HEX(ulFileOffset);		aulFootnoteList[tIndex] = ulFileOffset;	}	aucBuffer = xfree(aucBuffer);} /* end of vGet2FootnotesInfo *//* * Build the list with footnote text information for WinWord 1/2 files */static voidvGet2FootnotesText(FILE *pFile, const UCHAR *aucHeader){	footnote_local_type	*pCurr;	UCHAR	*aucBuffer;	ULONG	ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText;	size_t	tFootnoteTextLen;	size_t	tIndex;	TRACE_MSG("vGet2FootnotesText");	fail(pFile == NULL || aucHeader == NULL);	ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */	ulBeginOfFootnotes += ulGetLong(0x34, aucHeader); /* ccpText */	NO_DBG_HEX(ulBeginOfFootnotes);	ulBeginFootnoteText = ulGetLong(0x6a, aucHeader); /* fcPlcffndTxt */	NO_DBG_HEX(ulBeginFootnoteText);	tFootnoteTextLen =		(size_t)usGetWord(0x6e, aucHeader); /* cbPlcffndTxt */	NO_DBG_DEC(tFootnoteTextLen);	if (tFootnoteTextLen < 12) {		DBG_MSG("No Footnote text in this document");		return;	}	aucBuffer = xmalloc(tFootnoteTextLen);	if (!bReadBytes(aucBuffer,			tFootnoteTextLen, ulBeginFootnoteText, pFile)) {		aucBuffer = xfree(aucBuffer);		return;	}	NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen);	fail(tFootnoteTextLength != 0);	tFootnoteTextLength = tFootnoteTextLen / 4 - 2;	fail(tFootnoteTextLength == 0);	fail(pFootnoteText != NULL);	pFootnoteText = xcalloc(tFootnoteTextLength,				sizeof(footnote_local_type));	for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) {		pCurr = pFootnoteText + tIndex;		pCurr->tInfo.szText = NULL;		ulOffset = ulGetLong(tIndex * 4, aucBuffer);		NO_DBG_HEX(ulOffset);		ulCharPos = ulBeginOfFootnotes + ulOffset;		NO_DBG_HEX(ulCharPos);		NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));		pCurr->ulCharPosStart = ulCharPos;		ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer);		NO_DBG_HEX(ulOffset);		ulCharPos = ulBeginOfFootnotes + ulOffset;		NO_DBG_HEX(ulCharPos);		NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));		pCurr->ulCharPosNext = ulCharPos;		pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;	}	aucBuffer = xfree(aucBuffer);} /* end of vGet2FootnotesText *//* * Build the lists note information for WinWord 1/2 files */static voidvGet2NotesInfo(FILE *pFile, const UCHAR *aucHeader){	TRACE_MSG("vGet2NotesInfo");	vGet2FootnotesInfo(pFile, aucHeader);	vGet2FootnotesText(pFile, aucHeader);	/* There are no endnotes in a WinWord 1/2 file */} /* end of vGet2NotesInfo *//* * Build the list with footnote information for Word 6/7 files */static voidvGet6FootnotesInfo(FILE *pFile, ULONG ulStartBlock,	const ULONG *aulBBD, size_t tBBDLen,	const UCHAR *aucHeader){	UCHAR	*aucBuffer;	ULONG	ulFileOffset, ulBeginOfText, ulOffset, ulBeginFootnoteInfo;	size_t	tFootnoteInfoLen;	size_t	tIndex;	TRACE_MSG("vGet6FootnotesInfo");	fail(pFile == NULL || aucHeader == NULL);	fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);	fail(aulBBD == NULL);	ulBeginOfText = ulGetLong(0x18, aucHeader); /* fcMin */	NO_DBG_HEX(ulBeginOfText);	ulBeginFootnoteInfo = ulGetLong(0x68, aucHeader); /* fcPlcffndRef */	NO_DBG_HEX(ulBeginFootnoteInfo);	tFootnoteInfoLen =		(size_t)ulGetLong(0x6c, aucHeader); /* lcbPlcffndRef */	NO_DBG_DEC(tFootnoteInfoLen);	if (tFootnoteInfoLen < 10) {		DBG_MSG("No Footnotes in this document");		return;	}	aucBuffer = xmalloc(tFootnoteInfoLen);	if (!bReadBuffer(pFile, ulStartBlock,			aulBBD, tBBDLen, BIG_BLOCK_SIZE,			aucBuffer, ulBeginFootnoteInfo, tFootnoteInfoLen)) {		aucBuffer = xfree(aucBuffer);		return;	}	NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteInfoLen);	fail(tFootnoteListLength != 0);	tFootnoteListLength = (tFootnoteInfoLen - 4) / 6;	fail(tFootnoteListLength == 0);	fail(aulFootnoteList != NULL);	aulFootnoteList = xcalloc(tFootnoteListLength, sizeof(ULONG));	for (tIndex = 0; tIndex < tFootnoteListLength; tIndex++) {		ulOffset = ulGetLong(tIndex * 4, aucBuffer);		NO_DBG_HEX(ulOffset);		ulFileOffset = ulCharPos2FileOffset(ulBeginOfText + ulOffset);		NO_DBG_HEX(ulFileOffset);		aulFootnoteList[tIndex] = ulFileOffset;	}	aucBuffer = xfree(aucBuffer);} /* end of vGet6FootnotesInfo *//* * Build the list with footnote text information for Word 6/7 files */static voidvGet6FootnotesText(FILE *pFile, ULONG ulStartBlock,	const ULONG *aulBBD, size_t tBBDLen,	const UCHAR *aucHeader){	footnote_local_type	*pCurr;	UCHAR	*aucBuffer;	ULONG	ulCharPos, ulBeginOfFootnotes, ulOffset, ulBeginFootnoteText;	size_t	tFootnoteTextLen;	size_t	tIndex;	TRACE_MSG("vGet6FootnotesText");	fail(pFile == NULL || aucHeader == NULL);	fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);	fail(aulBBD == NULL);	ulBeginOfFootnotes = ulGetLong(0x18, aucHeader); /* fcMin */	ulBeginOfFootnotes += ulGetLong(0x34, aucHeader); /* ccpText */	NO_DBG_HEX(ulBeginOfFootnotes);	ulBeginFootnoteText = ulGetLong(0x70, aucHeader); /* fcPlcffndTxt */	NO_DBG_HEX(ulBeginFootnoteText);	tFootnoteTextLen =		(size_t)ulGetLong(0x74, aucHeader); /* lcbPlcffndTxt */	NO_DBG_DEC(tFootnoteTextLen);	if (tFootnoteTextLen < 12) {		DBG_MSG("No Footnote text in this document");		return;	}	aucBuffer = xmalloc(tFootnoteTextLen);	if (!bReadBuffer(pFile, ulStartBlock,			aulBBD, tBBDLen, BIG_BLOCK_SIZE,			aucBuffer, ulBeginFootnoteText, tFootnoteTextLen)) {		aucBuffer = xfree(aucBuffer);		return;	}	NO_DBG_PRINT_BLOCK(aucBuffer, tFootnoteTextLen);	fail(tFootnoteTextLength != 0);	tFootnoteTextLength = tFootnoteTextLen / 4 - 2;	fail(tFootnoteTextLength == 0);	fail(pFootnoteText != NULL);	pFootnoteText = xcalloc(tFootnoteTextLength,				sizeof(footnote_local_type));	for (tIndex = 0; tIndex < tFootnoteTextLength; tIndex++) {		pCurr = pFootnoteText + tIndex;		pCurr->tInfo.szText = NULL;		ulOffset = ulGetLong(tIndex * 4, aucBuffer);		NO_DBG_HEX(ulOffset);		ulCharPos = ulBeginOfFootnotes + ulOffset;		NO_DBG_HEX(ulCharPos);		NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));		pCurr->ulCharPosStart = ulCharPos;		ulOffset = ulGetLong(tIndex * 4 + 4, aucBuffer);		NO_DBG_HEX(ulOffset);		ulCharPos = ulBeginOfFootnotes + ulOffset;		NO_DBG_HEX(ulCharPos);		NO_DBG_HEX(ulCharPos2FileOffset(ulCharPos));		pCurr->ulCharPosNext = ulCharPos;		pCurr->bUseful = pCurr->ulCharPosStart != pCurr->ulCharPosNext;	}	aucBuffer = xfree(aucBuffer);} /* end of vGet6FootnotesText *//* * Build the list with endnote information for Word 6/7 files */static voidvGet6EndnotesInfo(FILE *pFile, ULONG ulStartBlock,	const ULONG *aulBBD, size_t tBBDLen,	const UCHAR *aucHeader){	UCHAR	*aucBuffer;	ULONG	ulFileOffset, ulBeginOfText, ulOffset, ulBeginEndnoteInfo;	size_t	tEndnoteInfoLen;	size_t	tIndex;	TRACE_MSG("vGet6EndnotesInfo");	fail(pFile == NULL || aucHeader == NULL);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -