/*
lpdStr 、即被搜索的文本
dnSize 、即被搜索本文的大小
lpsStr 、指定搜索的内容
snSize 、指定搜索内容的大小
*/
#define MAX_BMAP_SIZE (256U)
#define MAX_BINDEX_SIZE (MAX_BMAP_SIZE + 1U)
static unsigned char g_strChar[MAX_BMAP_SIZE][MAX_BINDEX_SIZE] = { { 0U } };
static int _cdecl al_bm_search(const unsigned char * lpdStr, int dnSize, const unsigned char * lpsStr, int snSize)
{
register int n;
register int i = 0;
do {
if (0U == g_strChar[lpsStr[i]][0]) {
n = 1;
g_strChar[lpsStr[i]][0] = n;
g_strChar[lpsStr[i]][n] = i;
}
else {
n = 2;
do {
if (0U == g_strChar[lpsStr[i]][n]) {
g_strChar[lpsStr[i]][n] = i;
g_strChar[lpsStr[i]][0] = n;
break;
}
} while ((++n) < MAX_BINDEX_SIZE);
}
} while ((++i) < snSize);
for (i = (snSize - 1); i < dnSize; )
{
if (g_strChar[lpdStr[i]][0] != 0U)
{
int nOffset;
register int nIndex;
n = 1; do {
nOffset = i - g_strChar[lpdStr[i]][n];
if (lpdStr[nOffset] == lpsStr[0]) {
nIndex = 1; do {
if (lpdStr[++nOffset] != lpsStr[nIndex]) {
goto GOTONEXT;
}
} while ((++nIndex) < snSize);
nOffset -= (nIndex - 1);
i = 0; do {
if (0U != g_strChar[lpsStr[i]][0]) {
n = 1;
do {
g_strChar[lpsStr[i]][n++] = 0U;
} while (n < g_strChar[lpsStr[i]][0]);
g_strChar[lpsStr[i]][0] = 0U;
}
} while ((++i) < snSize);
return nOffset;
GOTONEXT:
continue;
}
} while ((++n) < (g_strChar[lpdStr[i]][0] + 1));
}
i += snSize;
}
i = 0; do {
if (0U != g_strChar[lpsStr[i]][0]) {
n = 1;
do {
g_strChar[lpsStr[i]][n++] = 0U;
} while (n < g_strChar[lpsStr[i]][0]);
g_strChar[lpsStr[i]][0] = 0U;
}
} while ((++i) < snSize);
return (-1);
}
//也不知道快不快?!