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

📄 prop6.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * prop6.c * Copyright (C) 1998-2005 A.J. van Os; Released under GPL * * Description: * Read the property information from a MS Word 6 or 7 file */#include <stdlib.h>#include <string.h>#include "antiword.h"/* * iGet6InfoLength - the length of the information for Word 6/7 files */static intiGet6InfoLength(int iByteNbr, const UCHAR *aucGrpprl){	int	iTmp, iDel, iAdd;	switch (ucGetByte(iByteNbr, aucGrpprl)) {	case   2: case  16: case  17: case  18: case  19: case  21: case  22:	case  26: case  27: case  28: case  30: case  31: case  32: case  33:	case  34: case  35: case  36: case  38: case  39: case  40: case  41:	case  42: case  43: case  45: case  46: case  47: case  48: case  49:	case  69: case  72: case  80: case  93: case  96: case  97: case  99:	case 101: case 105: case 106: case 107: case 109: case 110: case 121:	case 122: case 123: case 124: case 140: case 141: case 144: case 145:	case 148: case 149: case 154: case 155: case 156: case 157: case 160:	case 161: case 164: case 165: case 166: case 167: case 168: case 169:	case 170: case 171: case 182: case 183: case 184: case 189: case 195:	case 197: case 198:		return 1 + 2;	case   3: case  12: case  15: case  81: case 103: case 108: case 188:	case 190: case 191:		return 2 + (int)ucGetByte(iByteNbr + 1, aucGrpprl);	case  20: case  70: case  74: case 192: case 194: case 196: case 200:		return 1 + 4;	case  23:		iTmp = (int)ucGetByte(iByteNbr + 1, aucGrpprl);		if (iTmp == 255) {			iDel = (int)ucGetByte(iByteNbr + 2, aucGrpprl);			iAdd = (int)ucGetByte(					iByteNbr + 3 + iDel * 4, aucGrpprl);			iTmp = 2 + iDel * 4 + iAdd * 3;		}		return 2 + iTmp;	case  68: case 193: case 199:		return 1 + 5;	case  73: case  95: case 136: case 137:		return 1 + 3;	case 120: case 187:		return 1 + 12;	default:		return 1 + 1;	}} /* end of iGet6InfoLength *//* * Build the lists with Document Property Information for Word 6/7 files */voidvGet6DopInfo(FILE *pFile, ULONG ulStartBlock,	const ULONG *aulBBD, size_t tBBDLen,	const UCHAR *aucHeader){	document_block_type	tDocument;	UCHAR	*aucBuffer;	ULONG	ulBeginDocpInfo, ulTmp;	size_t	tDocpInfoLen;	USHORT	usTmp;	ulBeginDocpInfo = ulGetLong(0x150, aucHeader); /* fcDop */	DBG_HEX(ulBeginDocpInfo);	tDocpInfoLen = (size_t)ulGetLong(0x154, aucHeader); /* lcbDop */	DBG_DEC(tDocpInfoLen);	if (tDocpInfoLen < 28) {		DBG_MSG("No Document information");		return;	}	aucBuffer = xmalloc(tDocpInfoLen);	if (!bReadBuffer(pFile, ulStartBlock,			aulBBD, tBBDLen, BIG_BLOCK_SIZE,			aucBuffer, ulBeginDocpInfo, tDocpInfoLen)) {		aucBuffer = xfree(aucBuffer);		return;	}	usTmp = usGetWord(0x00, aucBuffer);	tDocument.ucHdrFtrSpecification = (UCHAR)(usTmp >> 8); /* grpfIhdt */	tDocument.usDefaultTabWidth = usGetWord(0x0a, aucBuffer); /* dxaTab */	ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */	tDocument.tCreateDate = tConvertDTTM(ulTmp);	ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */	tDocument.tRevisedDate = tConvertDTTM(ulTmp);	vCreateDocumentInfoList(&tDocument);	aucBuffer = xfree(aucBuffer);} /* end of vGet6DopInfo *//* * Fill the section information block with information * from a Word 6/7 file. */static voidvGet6SectionInfo(const UCHAR *aucGrpprl, size_t tBytes,		section_block_type *pSection){	UINT	uiIndex;	int	iFodoOff, iInfoLen, iSize, iTmp;	USHORT	usCcol;	UCHAR	ucTmp;	fail(aucGrpprl == NULL || pSection == NULL);	iFodoOff = 0;	while (tBytes >= (size_t)iFodoOff + 1) {		iInfoLen = 0;		switch (ucGetByte(iFodoOff, aucGrpprl)) {		case 133:	/* olstAnm */			iSize = (int)ucGetByte(iFodoOff + 1, aucGrpprl);			DBG_DEC_C(iSize != 212, iSize);			for (uiIndex = 0, iTmp = iFodoOff + 2;			     uiIndex < 9 && iTmp < iFodoOff + 2 + iSize - 15;			     uiIndex++, iTmp += 16) {				pSection->aucNFC[uiIndex] =						ucGetByte(iTmp, aucGrpprl);				NO_DBG_DEC(pSection->aucNFC[uiIndex]);				ucTmp = ucGetByte(iTmp + 3, aucGrpprl);				NO_DBG_HEX(ucTmp);				if ((ucTmp & BIT(2)) != 0) {					pSection->usNeedPrevLvl |=							(USHORT)BIT(uiIndex);				}				if ((ucTmp & BIT(3)) != 0) {					pSection->usHangingIndent |=							(USHORT)BIT(uiIndex);				}			}			DBG_HEX(pSection->usNeedPrevLvl);			DBG_HEX(pSection->usHangingIndent);			break;		case 142:	/* bkc */			ucTmp = ucGetByte(iFodoOff + 1, aucGrpprl);			DBG_DEC(ucTmp);			pSection->bNewPage = ucTmp != 0 && ucTmp != 1;			break;		case 144:	/* ccolM1 */			usCcol = 1 + usGetWord(iFodoOff + 1, aucGrpprl);			DBG_DEC(usCcol);			break;		case 153:	/* grpfIhdt */			pSection->ucHdrFtrSpecification =					ucGetByte(iFodoOff + 1, aucGrpprl);			break;		default:			break;		}		if (iInfoLen <= 0) {			iInfoLen = iGet6InfoLength(iFodoOff, aucGrpprl);			fail(iInfoLen <= 0);		}		iFodoOff += iInfoLen;	}} /* end of vGet6SectionInfo *//* * Build the lists with Section Property Information for Word 6/7 files */voidvGet6SepInfo(FILE *pFile, ULONG ulStartBlock,	const ULONG *aulBBD, size_t tBBDLen,	const UCHAR *aucHeader){	section_block_type	tSection;	ULONG		*aulSectPage, *aulCharPos;	UCHAR	*aucBuffer, *aucFpage;	ULONG	ulBeginOfText, ulTextOffset, ulBeginSectInfo;	size_t	tSectInfoLen, tIndex, tOffset, tLen, tBytes;	UCHAR	aucTmp[2];	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);	ulBeginSectInfo = ulGetLong(0x88, aucHeader); /* fcPlcfsed */	DBG_HEX(ulBeginSectInfo);	tSectInfoLen = (size_t)ulGetLong(0x8c, aucHeader); /* lcbPlcfsed */	DBG_DEC(tSectInfoLen);	if (tSectInfoLen < 4) {		DBG_DEC(tSectInfoLen);		return;	}	aucBuffer = xmalloc(tSectInfoLen);	if (!bReadBuffer(pFile, ulStartBlock,			aulBBD, tBBDLen, BIG_BLOCK_SIZE,			aucBuffer, ulBeginSectInfo, tSectInfoLen)) {		aucBuffer = xfree(aucBuffer);		return;	}	NO_DBG_PRINT_BLOCK(aucBuffer, tSectInfoLen);	/* Read the Section Descriptors */	tLen = (tSectInfoLen - 4) / 16;	/* Save the section offsets */	aulCharPos = xcalloc(tLen, sizeof(ULONG));	for (tIndex = 0, tOffset = 0; tIndex < tLen; tIndex++, tOffset += 4) {		ulTextOffset = ulGetLong(tOffset, aucBuffer);		NO_DBG_HEX(ulTextOffset);		aulCharPos[tIndex] = ulBeginOfText + ulTextOffset;		NO_DBG_HEX(aulCharPos[tIndex]);	}	/* Save the Sepx offsets */	aulSectPage = xcalloc(tLen, sizeof(ULONG));	for (tIndex = 0, tOffset = (tLen + 1) * 4;	     tIndex < tLen;	     tIndex++, tOffset += 12) {		aulSectPage[tIndex] = ulGetLong(tOffset + 2, aucBuffer);		NO_DBG_HEX(aulSectPage[tIndex]); /* fcSepx */	}	aucBuffer = xfree(aucBuffer);	/* Read the Section Properties */	for (tIndex = 0; tIndex < tLen; tIndex++) {		if (aulSectPage[tIndex] == FC_INVALID) {			vDefault2SectionInfoList(aulCharPos[tIndex]);			continue;		}		/* Get the number of bytes to read */		if (!bReadBuffer(pFile, ulStartBlock,				aulBBD, tBBDLen, BIG_BLOCK_SIZE,				aucTmp, aulSectPage[tIndex], 2)) {			continue;		}		tBytes = 2 + (size_t)usGetWord(0, aucTmp);		NO_DBG_DEC(tBytes);		/* Read the bytes */		aucFpage = xmalloc(tBytes);		if (!bReadBuffer(pFile, ulStartBlock,				aulBBD, tBBDLen, BIG_BLOCK_SIZE,				aucFpage, aulSectPage[tIndex], tBytes)) {			aucFpage = xfree(aucFpage);			continue;		}		NO_DBG_PRINT_BLOCK(aucFpage, tBytes);		/* Process the bytes */		vGetDefaultSection(&tSection);		vGet6SectionInfo(aucFpage + 2, tBytes - 2, &tSection);		vAdd2SectionInfoList(&tSection, aulCharPos[tIndex]);		aucFpage = xfree(aucFpage);	}	aulCharPos = xfree(aulCharPos);	aulSectPage = xfree(aulSectPage);} /* end of vGet6SepInfo *//* * Build the list with Header/Footer Information for Word 6/7 files */voidvGet6HdrFtrInfo(FILE *pFile, ULONG ulStartBlock,	const ULONG *aulBBD, size_t tBBDLen,	const UCHAR *aucHeader){	ULONG	*aulCharPos;	UCHAR	*aucBuffer;	ULONG	ulHdrFtrOffset, ulBeginHdrFtrInfo;	size_t	tHdrFtrInfoLen, tIndex, tOffset, tLen;	fail(pFile == NULL || aucHeader == NULL);	fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);	fail(aulBBD == NULL);	ulBeginHdrFtrInfo = ulGetLong(0xb0, aucHeader); /* fcPlcfhdd */	NO_DBG_HEX(ulBeginHdrFtrInfo);	tHdrFtrInfoLen = (size_t)ulGetLong(0xb4, aucHeader); /* lcbPlcfhdd */	NO_DBG_DEC(tHdrFtrInfoLen);	if (tHdrFtrInfoLen < 8) {		DBG_DEC_C(tHdrFtrInfoLen != 0, tHdrFtrInfoLen);		return;	}	aucBuffer = xmalloc(tHdrFtrInfoLen);	if (!bReadBuffer(pFile, ulStartBlock,			aulBBD, tBBDLen, BIG_BLOCK_SIZE,			aucBuffer, ulBeginHdrFtrInfo, tHdrFtrInfoLen)) {		aucBuffer = xfree(aucBuffer);		return;	}	NO_DBG_PRINT_BLOCK(aucBuffer, tHdrFtrInfoLen);	tLen = tHdrFtrInfoLen / 4 - 1;	/* Save the header/footer offsets */	aulCharPos = xcalloc(tLen, sizeof(ULONG));	for (tIndex = 0, tOffset = 0;	     tIndex < tLen;	     tIndex++, tOffset += 4) {		ulHdrFtrOffset = ulGetLong(tOffset, aucBuffer);		NO_DBG_HEX(ulHdrFtrOffset);		aulCharPos[tIndex] = ulHdrFtrOffset2CharPos(ulHdrFtrOffset);		NO_DBG_HEX(aulCharPos[tIndex]);	}	vCreat6HdrFtrInfoList(aulCharPos, tLen);	aulCharPos = xfree(aulCharPos);	aucBuffer = xfree(aucBuffer);} /* end of vGet6HdrFtrInfo *//* * Translate the rowinfo to a member of the row_info enumeration */row_info_enumeGet6RowInfo(int iFodo,	const UCHAR *aucGrpprl, int iBytes, row_block_type *pRow){	int	iFodoOff, iInfoLen;	int	iIndex, iSize, iCol;	int	iPosCurr, iPosPrev;	USHORT	usTmp;	BOOL	bFound24_0, bFound24_1, bFound25_0, bFound25_1, bFound190;	fail(iFodo < 0 || aucGrpprl == NULL || pRow == NULL);	iFodoOff = 0;	bFound24_0 = FALSE;	bFound24_1 = FALSE;	bFound25_0 = FALSE;	bFound25_1 = FALSE;	bFound190 = FALSE;	while (iBytes >= iFodoOff + 1) {		iInfoLen = 0;		switch (ucGetByte(iFodo + iFodoOff, aucGrpprl)) {		case  24:	/* fInTable */			if (odd(ucGetByte(iFodo + iFodoOff + 1, aucGrpprl))) {				bFound24_1 = TRUE;			} else {				bFound24_0 = TRUE;			}			break;		case  25:	/* fTtp */			if (odd(ucGetByte(iFodo + iFodoOff + 1, aucGrpprl))) {				bFound25_1 = TRUE;			} else {				bFound25_0 = TRUE;			}			break;		case 38:	/* brcTop */			usTmp = usGetWord(iFodo + iFodoOff + 1, aucGrpprl);			usTmp &= 0x0018;			NO_DBG_DEC(usTmp >> 3);			if (usTmp == 0) {				pRow->ucBorderInfo &= ~TABLE_BORDER_TOP;			} else {				pRow->ucBorderInfo |= TABLE_BORDER_TOP;			}			break;		case 39:	/* brcLeft */			usTmp = usGetWord(iFodo + iFodoOff + 1, aucGrpprl);			usTmp &= 0x0018;			NO_DBG_DEC(usTmp >> 3);			if (usTmp == 0) {				pRow->ucBorderInfo &= ~TABLE_BORDER_LEFT;			} else {				pRow->ucBorderInfo |= TABLE_BORDER_LEFT;			}			break;		case 40:	/* brcBottom */			usTmp = usGetWord(iFodo + iFodoOff + 1, aucGrpprl);			usTmp &= 0x0018;			NO_DBG_DEC(usTmp >> 3);			if (usTmp == 0) {				pRow->ucBorderInfo &= ~TABLE_BORDER_BOTTOM;			} else {				pRow->ucBorderInfo |= TABLE_BORDER_BOTTOM;			}			break;		case 41:	/* brcRight */			usTmp = usGetWord(iFodo + iFodoOff + 1, aucGrpprl);			usTmp &= 0x0018;			NO_DBG_DEC(usTmp >> 3);			if (usTmp == 0) {				pRow->ucBorderInfo &= ~TABLE_BORDER_RIGHT;			} else {				pRow->ucBorderInfo |= TABLE_BORDER_RIGHT;			}			break;		case 188:	/* cDefTable10 */			DBG_MSG("188: sprmTDefTable10");			iSize = (int)usGetWord(iFodo + iFodoOff + 1, aucGrpprl);			DBG_DEC(iSize);			break;		case 190:	/* cDefTable */			iSize = (int)usGetWord(iFodo + iFodoOff + 1, aucGrpprl);			if (iSize < 6 || iBytes < iFodoOff + 7) {				DBG_DEC(iSize);				DBG_DEC(iFodoOff);				iInfoLen = 1;				break;			}			iCol = (int)ucGetByte(iFodo + iFodoOff + 3, aucGrpprl);			if (iCol < 1 ||			    iBytes < iFodoOff + 3 + (iCol + 1) * 2) {				DBG_DEC(iCol);				DBG_DEC(iFodoOff);				iInfoLen = 1;				break;			}			if (iCol >= (int)elementsof(pRow->asColumnWidth)) {				DBG_DEC(iCol);				werr(1, "The number of columns is corrupt");			}			pRow->ucNumberOfColumns = (UCHAR)iCol;			iPosPrev = (int)(short)usGetWord(					iFodo + iFodoOff + 4,					aucGrpprl);			for (iIndex = 0; iIndex < iCol; iIndex++) {				iPosCurr = (int)(short)usGetWord(					iFodo + iFodoOff + 6 + iIndex * 2,					aucGrpprl);				pRow->asColumnWidth[iIndex] =						(short)(iPosCurr - iPosPrev);				iPosPrev = iPosCurr;			}			bFound190 = TRUE;			break;		default:			break;		}		if (iInfoLen <= 0) {			iInfoLen =				iGet6InfoLength(iFodo + iFodoOff, aucGrpprl);			fail(iInfoLen <= 0);		}		iFodoOff += iInfoLen;	}	if (bFound25_1 && bFound190) {		return found_end_of_row;	}	if (bFound25_0 && !bFound190) {		return found_not_end_of_row;	}	if (bFound24_1) {		return found_a_cell;	}	if (bFound24_0) {		return found_not_a_cell;	}	return found_nothing;} /* end of eGet6RowInfo *//* * Fill the style information block with information * from a Word 6/7 file. */voidvGet6StyleInfo(int iFodo,	const UCHAR *aucGrpprl, int iBytes, style_block_type *pStyle){	int	iFodoOff, iInfoLen;	int	iTmp, iDel, iAdd, iBefore;	short	sTmp;	UCHAR	ucTmp;	fail(iFodo < 0 || aucGrpprl == NULL || pStyle == NULL);	NO_DBG_DEC(pStyle->usIstd);	iFodoOff = 0;	while (iBytes >= iFodoOff + 1) {		iInfoLen = 0;		switch (ucGetByte(iFodo + iFodoOff, aucGrpprl)) {		case   2:	/* istd */			sTmp = (short)ucGetByte(					iFodo + iFodoOff + 1, aucGrpprl);			NO_DBG_DEC(sTmp);			break;		case   5:	/* jc */			pStyle->ucAlignment = ucGetByte(					iFodo + iFodoOff + 1, aucGrpprl);			break;		case  12:	/* anld */			iTmp = (int)ucGetByte(					iFodo + iFodoOff + 1, aucGrpprl);			DBG_DEC_C(iTmp < 52, iTmp);			if (iTmp >= 1) {				pStyle->ucNFC = ucGetByte(					iFodo + iFodoOff + 2, aucGrpprl);			}			if (pStyle->ucNFC != LIST_BULLETS && iTmp >= 2) {				iBefore = (int)ucGetByte(					iFodo + iFodoOff + 3, aucGrpprl);			} else {				iBefore = 0;			}			if (iTmp >= 12) {				pStyle->usStartAt = usGetWord(					iFodo + iFodoOff + 12, aucGrpprl);			}			if (iTmp >= iBefore + 21) {				pStyle->usListChar = (USHORT)ucGetByte(					iFodo + iFodoOff + iBefore + 22,					aucGrpprl);				NO_DBG_HEX(pStyle->usListChar);			}			break;		case  13:	/* nLvlAnm */			ucTmp = ucGetByte(iFodo + iFodoOff + 1, aucGrpprl);			pStyle->ucNumLevel = ucTmp;			pStyle->bNumPause =				eGetNumType(ucTmp) == level_type_pause;			break;		case  15:	/* ChgTabsPapx */		case  23:	/* ChgTabs */			iTmp = (int)ucGetByte(iFodo + iFodoOff + 1, aucGrpprl);			if (iTmp < 2) {				iInfoLen = 1;				break;			}			NO_DBG_DEC(iTmp);			iDel = (int)ucGetByte(iFodo + iFodoOff + 2, aucGrpprl);			if (iTmp < 2 + 2 * iDel) {				iInfoLen = 1;				break;			}			NO_DBG_DEC(iDel);			iAdd = (int)ucGetByte(				iFodo + iFodoOff + 3 + 2 * iDel, aucGrpprl);			if (iTmp < 2 + 2 * iDel + 2 * iAdd) {				iInfoLen = 1;				break;			}			NO_DBG_DEC(iAdd);			break;		case  16:	/* dxaRight */			pStyle->sRightIndent = (short)usGetWord(					iFodo + iFodoOff + 1, aucGrpprl);			NO_DBG_DEC(pStyle->sRightIndent);			break;		case  17:	/* dxaLeft */			pStyle->sLeftIndent = (short)usGetWord(					iFodo + iFodoOff + 1, aucGrpprl);			NO_DBG_DEC(pStyle->sLeftIndent);			break;		case  18:	/* Nest dxaLeft */			sTmp = (short)usGetWord(					iFodo + iFodoOff + 1, aucGrpprl);			pStyle->sLeftIndent += sTmp;			if (pStyle->sLeftIndent < 0) {				pStyle->sLeftIndent = 0;			}			NO_DBG_DEC(sTmp);			NO_DBG_DEC(pStyle->sLeftIndent);			break;		case  19:	/* dxaLeft1 */			pStyle->sLeftIndent1 = (short)usGetWord(					iFodo + iFodoOff + 1, aucGrpprl);			NO_DBG_DEC(pStyle->sLeftIndent1);			break;		case  21:	/* dyaBefore */			pStyle->usBeforeIndent = usGetWord(					iFodo + iFodoOff + 1, aucGrpprl);			NO_DBG_DEC(pStyle->usBeforeIndent);			break;		case  22:	/* dyaAfter */			pStyle->usAfterIndent = usGetWord(					iFodo + iFodoOff + 1, aucGrpprl);			NO_DBG_DEC(pStyle->usAfterIndent);

⌨️ 快捷键说明

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