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

📄 bmsearch.c

📁 字符串搜索
💻 C
字号:
/******************************************************************************
*
* Revision History:
*   Date            Author          Modification
* ---------------------------------------------------------------------
*
*   采用boyer-moore算法最简单的描述实现,没有添加预处理和改进算法,若是英文搜索,区分大小写
*****************************************************************************/
#include "..\..\include\owner\bmsearch.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static D_U8* n_CheckContentInKW(D_U32 lastkeybyteindex,D_U32 cdataend, D_U8* kdata, D_U8* cdata)
{
    D_U32 kindex;
    D_BOOL have = D_FALSE;
    
    for(kindex=0; kindex<lastkeybyteindex; kindex++)
    {
        if(cdata[lastkeybyteindex] != kdata[kindex]) 
            continue;
        else {
            have = D_TRUE;
            break;
        }
    }
    if(((D_U32)(cdata+lastkeybyteindex-kindex) < cdataend)&&have)
        cdata = (cdata+lastkeybyteindex-kindex);
    else if(((D_U32)(cdata+lastkeybyteindex-kindex) < cdataend)&&(!have))
        cdata +=lastkeybyteindex+1;
    else
        cdata = (D_U8*)cdataend;
    return cdata;
}

static D_BOOL n_KWIdentical(D_U32 lastkeybyteindex, D_U8* kdata, D_U8** pcdata)
{
    D_U32 kindex;
    
    for(kindex=0; kindex<lastkeybyteindex; kindex++)
    {
        if((*pcdata)[kindex] != kdata[kindex])
            return D_FALSE;	
    }
    *pcdata = *pcdata+lastkeybyteindex+1;
    return D_TRUE;
}

D_U32 D_BMSearch(const D_BM_KeyWord *pKeyData, const D_BM_ContentData *pContentData, D_U32* numbers, D_U32 index, D_U32* offset)
{
    D_U8* kdata = pKeyData->data;
    D_U32 csize = pContentData->size;
    D_U8* cdata = pContentData->data;
    D_U32 lastkeybyteindex = pKeyData->size-1; /* keyword最后一位的index;*/
    D_U32 lastkeybyteval = kdata[lastkeybyteindex]; /* keyword最后一位的值;*/
    D_U32 cdataend = (D_U32)(cdata + csize);
    
    if(kdata == NULL)              
        return KEYWORD_DATA_IS_NULL;
    if(cdata == NULL)
        return CONTENT_DATA_IS_NULL;
    if(csize == 0)
        return CONTENT_DATA_SIZE_INVALID;
    
    *numbers = 0;
	*offset  = 0;
    while((D_U32)cdata < cdataend)
    {
        if(lastkeybyteval != cdata[lastkeybyteindex])  
            cdata = n_CheckContentInKW(lastkeybyteindex, cdataend, kdata, cdata);
        else
        {
            if(n_KWIdentical(lastkeybyteindex, kdata, &cdata)) 
			{
                (*numbers)++;
				if(*numbers == index)
				{
					*offset = (D_U32)((D_U32)cdata - (D_U32)(pContentData->data) - pKeyData->size);
				}
			}
            else 
                cdata = n_CheckContentInKW(lastkeybyteindex, cdataend, kdata, cdata);
        }
    }
    return D_OK;
}

⌨️ 快捷键说明

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