davsearch.c
来自「FDI Intel开发的FLASH文件系统,功能很强大」· C语言 代码 · 共 1,358 行 · 第 1/4 页
C
1,358 行
/* Copyright (c) 1995-2004 Intel Corporation */
/* Intel Confidential */
/* ###########################################################################
### DAV
###
### Module: davsearch.c - Low Level Header Search Module
###
### $Workfile: davsearch.c $
### $Revision: 8 $
###
### $NoKeywords: $
########################################################################### */
/*
*****************************************************************
* NOTICE OF LICENSE AGREEMENT
*
* This code is provided by Intel Corp., and the use is governed
* under the terms of a license agreement. See license agreement
* for complete terms of license.
*
* YOU MAY ONLY USE THE SOFTWARE WITH INTEL FLASH PRODUCTS. YOUR
* USE OF THE SOFTWARE WITH ANY OTHER FLASH PRODUCTS IS EXPRESSLY
* PROHIBITED UNLESS AND UNTIL YOU APPLY FOR, AND ARE GRANTED IN
* INTEL'S SOLE DISCRETION, A SEPARATE WRITTEN SOFTWARE LICENSE
* FROM INTEL LICENSING ANY SUCH USE.
*****************************************************************
*/
/*### Include Files
#########################*/
#include "DavLib.h"
#if (DIRECT_ACCESS_VOLUME == TRUE)
#include "davsearch.h"
#include "davext.h"
/*### Local Declarations
#########################*/
static ERR_CODE IsFound(SEARCH_SearchInfoPtr aSrchInfoPtr,
SEARCH_SearchMethodEnum aCompareMethod,
SEARCH_CompareInfoPtr aCompareInfoPtr,
UINT8* aFoundValPtr,
BOOLEAN restart);
/*### Global Declarations
#########################*/
SEARCH_SearchInfo FDI_SearchInfo;
HDR_Header FDI_SearchHeader;
/*### Local Functions
#########################*/
#define ExitOnError(status) \
if (status != ERR_NONE) \
{ return status; }
/*#################################################################
### IsFound
###
### DESCRIPTION:
### This function is used to locate an object based on the
### method of searching. By adding a comparison to this
### function and the SEARCH_SearchMethod enum, the GetNextHeader
### function can be extended without modifying the rest
### of the search code.
###
### PARAMETERS:
### aSrchInfoPtr - Structure containing search information.
### IN: - Must contain valid object information in order
### to carry out the requested search.
### - HeaderPtr points to a valid header for temporary
### use.
###
### OUT: - On a search by SEARCH_ByName or SEARCH_ByNameType
###
### aCompareMethod - Search for the next object with the
### desired qualities.
### compare_value - Value to use to compare search depending
### on the type of search.
###
### RETURNS:
### TRUE - If object info matches the requested method.
### FALSE - If not!
###*/
static ERR_CODE IsFound(SEARCH_SearchInfoPtr aSrchInfoPtr,
SEARCH_SearchMethodEnum aCompareMethod,
SEARCH_CompareInfoPtr aCompareInfoPtr,
UINT8* aFoundValPtr,
BOOLEAN restart)
{
UINT32 ii;
UINT8 found = 0;
ERR_CODE status = ERR_NONE;
BOOLEAN objHeaderRead = FALSE;
FDI_HT_ObjectTypeEnum type;
/* first, does the header point to anything? if not, this is not a match */
if (FHDR_GetAbsorbStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) != HDR_ABSORBED)
{
/* if this header represents a WIP or valid object in either page or para space */
if(
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_VALID) ||
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_WRITE_IN_PROGRESS)
)
{
/* Read in the full object header (with or without name */
/* depending on if the object is a page space object) */
if(OHDR_ReadObjectHeader(FHDR_CalcObjectHandle(
&(aSrchInfoPtr->HeaderPtr->FHdr)),
&(aSrchInfoPtr->HeaderPtr->OHdr),
FHDR_IsPageObject(&(aSrchInfoPtr->HeaderPtr->FHdr))) == ERR_NONE)
{
objHeaderRead = TRUE;
}
}
switch (aCompareMethod)
{
case SEARCH_ByPartialAllocFixedHdrComplete:
/*
* We want to find a header where the object data was not written, however,
* the header was marked as valid.
*/
if (FHDR_IsParaObject(&(aSrchInfoPtr->HeaderPtr->FHdr)))
{
if (
((UINT32)FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) == aCompareInfoPtr->CompareValue) &&
((UINT32)FHDR_GetHeaderIndexOffset(&(aSrchInfoPtr->HeaderPtr->FHdr)) == aCompareInfoPtr->CompareValue2)
)
{
/* Our key values match, however, is this the correct state? */
if(
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_WRITE_IN_PROGRESS) &&
(FHDR_GetHeaderStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_HEADER_VALID)
)
{
found = 1;
}
}
}
else
{
type = (aCompareInfoPtr->CompareValue > FDI_HT_NormalObject) ? FDI_HT_NormalObject : aCompareInfoPtr->CompareValue;
/* for a partially allocated page object, only match the type to the type in the fixed header */
if (
(FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) == type) &&
((UINT32)FHDR_GetHeaderIndexOffset(&(aSrchInfoPtr->HeaderPtr->FHdr)) == aCompareInfoPtr->CompareValue2)
)
{
/* Our key values match, however, is this the correct state? */
if(
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_WRITE_IN_PROGRESS) &&
(FHDR_GetHeaderStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_HEADER_VALID)
)
{
found = 1;
}
}
}
break;
case SEARCH_ByValidType:
if (
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_VALID)
)
{
if (FHDR_IsParaObject(&(aSrchInfoPtr->HeaderPtr->FHdr)))
{
if((UINT32)FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) == aCompareInfoPtr->CompareValue)
{
found = 1;
}
}
else
{
if (objHeaderRead)
{
if (aSrchInfoPtr->HeaderPtr->OHdr.Type == aCompareInfoPtr->CompareValue)
{
found = 1;
}
}
}
}
break;
case SEARCH_ByFreeOrWIPType:
if (
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_EMPTY) ||
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_WRITE_IN_PROGRESS)
)
{
if (FHDR_IsParaObject(&(aSrchInfoPtr->HeaderPtr->FHdr)))
{
if((UINT32)FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) == aCompareInfoPtr->CompareValue)
{
found = 1;
}
}
else
{
if (objHeaderRead)
{
if (aSrchInfoPtr->HeaderPtr->OHdr.Type == aCompareInfoPtr->CompareValue)
{
found = 1;
}
}
}
}
break;
case SEARCH_ByTypeOnly:
if (FHDR_IsParaObject(&(aSrchInfoPtr->HeaderPtr->FHdr)))
{
if((UINT32)FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) == aCompareInfoPtr->CompareValue)
{
found = 1;
}
}
else
{
if (objHeaderRead)
{
if (aSrchInfoPtr->HeaderPtr->OHdr.Type == aCompareInfoPtr->CompareValue)
{
found = 1;
}
}
}
break;
case SEARCH_ByHeaderAddress:
if (aSrchInfoPtr->CurrObj.HeaderAddress == aCompareInfoPtr->CompareValue)
{
found = 1;
}
break;
case SEARCH_ByNextObject:
found = 1;
break;
case SEARCH_ByNextWriteInProgressObject:
if (FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_WRITE_IN_PROGRESS)
{
found = 1;
}
break;
case SEARCH_ByNextInvalidPageObject:
if ((FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_INVALID) &&
(FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) != FDI_HT_RecoveredHeader) &&
(FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) != FDI_HT_NormalObject))
{
found = 1;
}
break;
case SEARCH_ByNextValidObject:
if ((FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_VALID) &&
(FHDR_GetHeaderStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_HEADER_VALID))
{
if (FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) == FDI_HT_NormalObject)
{
found = 1;
}
else
{
found = 1;
}
}
break;
case SEARCH_ByNextPageObject:
if (
(FHDR_GetHeaderStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_HEADER_VALID) &&
(FHDR_IsPageObject(&(aSrchInfoPtr->HeaderPtr->FHdr)))
)
{
found = 1;
}
break;
case SEARCH_ByNextValidPageObject:
if (
(FHDR_GetHeaderStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_HEADER_VALID) &&
(FHDR_IsPageObject(&(aSrchInfoPtr->HeaderPtr->FHdr))) &&
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_VALID)
)
{
found = 1;
}
break;
case SEARCH_ByNameType:
/* Check for matching type and non-invalid object before */
/* checking the name. */
if (FHDR_IsParaObject(&(aSrchInfoPtr->HeaderPtr->FHdr)))
{
if (
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) != HDR_ALLOC_INVALID) &&
((UINT32)FHDR_GetType(&(aSrchInfoPtr->HeaderPtr->FHdr)) == aCompareInfoPtr->CompareValue)
)
{
found = 1;
break; /* no name for para objects, so don't try to match */
}
}
else
{
if (objHeaderRead)
{
if (
(FHDR_GetAllocationStatus(&(aSrchInfoPtr->HeaderPtr->FHdr)) == HDR_ALLOC_INVALID) ||
(aSrchInfoPtr->HeaderPtr->OHdr.Type != aCompareInfoPtr->CompareValue)
)
{
found = 0;
break; /* don't bother checking the name; this isn't a match */
}
}
else
{
found = 0;
/* don't bother checking the name; this object doesn't have an object header */
break;
}
}
/*lint -fallthrough*/
case SEARCH_ByName:
/* If the name lengths don't match obviously the names themselves */
/* cannot match. This prevents the problem of a name with */
/* aaaa matching with a name of aaaaa. */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?