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

📄 depot.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
/* * depot.c * Copyright (C) 1998-2002 A.J. van Os; Released under GPL * * Description: * Functions to compute the depot offset */#include "antiword.h"#define SIZE_RATIO	(BIG_BLOCK_SIZE/SMALL_BLOCK_SIZE)static ULONG	*aulSmallBlockList = NULL;static size_t	tSmallBlockListLen = 0;/* * vDestroySmallBlockList - destroy the small block list */voidvDestroySmallBlockList(void){	DBG_MSG("vDestroySmallBlockList");	aulSmallBlockList = xfree(aulSmallBlockList);	tSmallBlockListLen = 0;} /* end of vDestroySmalBlockList *//* * vCreateSmallBlockList - create the small block list * * returns: TRUE when successful, otherwise FALSE */BOOLbCreateSmallBlockList(ULONG ulStartblock, const ULONG *aulBBD, size_t tBBDLen){	ULONG	ulTmp;	size_t	tSize;	int	iIndex;	fail(aulSmallBlockList != NULL);	fail(tSmallBlockListLen != 0);	fail(ulStartblock > MAX_BLOCKNUMBER && ulStartblock != END_OF_CHAIN);	fail(aulBBD == NULL);	fail(tBBDLen == 0);	/* Find the length of the small block list */	for (tSmallBlockListLen = 0, ulTmp = ulStartblock;	     tSmallBlockListLen < tBBDLen && ulTmp != END_OF_CHAIN;	     tSmallBlockListLen++, ulTmp = aulBBD[ulTmp]) {		if (ulTmp >= (ULONG)tBBDLen) {			DBG_DEC(ulTmp);			DBG_DEC(tBBDLen);			werr(1, "The Big Block Depot is damaged");		}	}	DBG_DEC(tSmallBlockListLen);	if (tSmallBlockListLen == 0) {		/* There is no small block list */		fail(ulStartblock != END_OF_CHAIN);		aulSmallBlockList = NULL;		return TRUE;	}	/* Create the small block list */	tSize = tSmallBlockListLen * sizeof(ULONG);	aulSmallBlockList = xmalloc(tSize);	for (iIndex = 0, ulTmp = ulStartblock;	     iIndex < (int)tBBDLen && ulTmp != END_OF_CHAIN;	     iIndex++, ulTmp = aulBBD[ulTmp]) {		if (ulTmp >= (ULONG)tBBDLen) {			DBG_DEC(ulTmp);			DBG_DEC(tBBDLen);			werr(1, "The Big Block Depot is damaged");		}		aulSmallBlockList[iIndex] = ulTmp;		NO_DBG_DEC(aulSmallBlockList[iIndex]);	}	return TRUE;} /* end of bCreateSmallBlockList *//* * ulDepotOffset - get the depot offset the block list */ULONGulDepotOffset(ULONG ulIndex, size_t tBlockSize){	ULONG	ulTmp;	size_t	tTmp;	fail(ulIndex >= ULONG_MAX / BIG_BLOCK_SIZE);	switch (tBlockSize) {	case BIG_BLOCK_SIZE:		return (ulIndex + 1) * BIG_BLOCK_SIZE;	case SMALL_BLOCK_SIZE:		tTmp = (size_t)(ulIndex / SIZE_RATIO);		ulTmp = ulIndex % SIZE_RATIO;		if (aulSmallBlockList == NULL ||		    tTmp >= tSmallBlockListLen) {			DBG_HEX(aulSmallBlockList);			DBG_DEC(tSmallBlockListLen);			DBG_DEC(tTmp);			return 0;		}		return ((aulSmallBlockList[tTmp] + 1) * SIZE_RATIO +				ulTmp) * SMALL_BLOCK_SIZE;	default:		DBG_DEC(tBlockSize);		DBG_FIXME();		return 0;	}} /* end of ulDepotOffset */

⌨️ 快捷键说明

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