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

📄 boyermor.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
字号:
//=============================================================================
// File:       boyermor.cpp
// Contents:   Definitions for BoyerMoore
// Maintainer: Doug Sauder <dwsauder@hunnysoft.com>
// WWW:        http://www.hunnysoft.com/mimepp/
//
// Copyright (c) 1996-1998 Douglas W. Sauder
// All rights reserved.
// 
// IN NO EVENT SHALL DOUGLAS W. SAUDER BE LIABLE TO ANY PARTY FOR DIRECT,
// INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
// THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF DOUGLAS W. SAUDER
// HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// DOUGLAS W. SAUDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
// NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
// BASIS, AND DOUGLAS W. SAUDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
// SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
//
//=============================================================================

#include "StdAfx.h"
#include <string.h>
#include "../Include/boyermor.h"


BoyerMoore::BoyerMoore(const char* aCstr)
{
	mPat	=	NULL;

    size_t len = strlen(aCstr);
    _Assign(aCstr, len);
}

BoyerMoore::~BoyerMoore()
{
	if( mPat )
	{
		delete	mPat;
		mPat	=	NULL;
	}
}

void BoyerMoore::Assign(const char* aCstr)
{
    size_t len = strlen(aCstr);
    _Assign(aCstr, len);
}

void BoyerMoore::_Assign(const char* aPat, size_t aPatLen)
{
    mPatLen = 0;
    mPat = new char[aPatLen+1];
    if (mPat != 0) {
        mPatLen = aPatLen;
        strncpy(mPat, aPat, mPatLen);
        mPat[mPatLen] = 0;
        // Initialize the jump table for Boyer-Moore-Horspool algorithm
        size_t i;
        for (i=0; i < 256; ++i) {
            mSkipAmt[i] = (unsigned char) mPatLen;
        }
        for (i=0; i < mPatLen-1; ++i) {
            mSkipAmt[(unsigned char)mPat[i]] = (unsigned char) (mPatLen - i - 1);
        }
    }
}

size_t BoyerMoore::FindIn(const char * string, size_t length, size_t startpos)
{
	if ( NULL == string || length <= startpos ) {
		return (size_t) -1;
	}
	if (mPat == 0 || mPatLen == 0) {
		return 0;
	}
	size_t bufLen = length - startpos;
	const char* buf = string + startpos;
	size_t i;
	for (i=mPatLen-1; i < bufLen; i += mSkipAmt[(unsigned char)buf[i]]) {
		int iBuf = i;
		int iPat = mPatLen - 1;
		while (iPat >= 0 && buf[iBuf] == mPat[iPat]) {
			--iBuf;
			--iPat;
		}
		if (iPat == -1)
			return startpos + iBuf + 1;
	}
	return (size_t)-1;
}

int BoyerMoore::GetNumStringAfter( const char *string, size_t length, size_t startpos,
								  char * rstring, size_t rmaxlen )
{
	size_t	nPos	=	FindIn( string, length, startpos );
	if( nPos == ((size_t)-1) || nPos >= length || nPos < 0 )
		return 0;

	nPos	+=	mPatLen;
	
	while( isspace( string[nPos] ) && nPos < length )
		nPos	++;

	int	nCount	=	0;
	while( !isdigit(BYTE(string[nPos])) && string[nPos] != '.' && string[nPos] != '-' && string[nPos] != '\n'
				&& nPos < length && nCount < 256 )
	{	nPos	++;	nCount ++;	}

	if( nPos >= length )
		return 0;

	size_t	nStart	=	nPos;
	while( ( isdigit(BYTE(string[nPos])) || string[nPos] == '.' || string[nPos] == '-' )
			&& nPos < length )
		nPos	++;
	size_t	nEnd	=	nPos;
	
	memset( rstring, 0, rmaxlen );
	if( nEnd - nStart > rmaxlen-1 )
		return 0;

	strncpy( rstring, &string[nStart], nEnd-nStart );
	return nEnd - nStart;
}

double BoyerMoore::GetNumberAfter( const char *string, size_t length, size_t startpos )
{
	double	result	=	0.;
	char	rstring[64];
	int rLen = GetNumStringAfter( string, length, startpos, rstring, 64 );
	if( rLen > 0 )
	{
		result	=	atof( rstring );
	}
	return result;
}

DWORD BoyerMoore::GetDateAfter( const char *string, size_t length, size_t startpos )
{
	// Convert to Date as DWORD
	char	rstring[64];
	int rLen = GetNumStringAfter( string, length, startpos, rstring, 64 );
	if( rLen > 0 )
	{
		int	nYear	=	atol( rstring );
		int k;
		for( k=0; k<rLen; k++ )
			if( rstring[k] == '-' )
				break;
		k++;
		int nMonth	=	atol( &(rstring[k]) );
		for( ; k<rLen; k++ )
			if( rstring[k] == '-' )
				break;
		k++;
		int nDay	=	atol( &(rstring[k]) );

		DWORD	result	=	nYear * 10000 + nMonth * 100 + nDay;
		return result;
	}
	return 0;
}

int BoyerMoore::GetPhraseAfter( const char *string, size_t length, size_t startpos,
								  char * rstring, size_t rmaxlen )
{
	size_t	nPos	=	FindIn( string, length, startpos );
	if( nPos == ((size_t)-1) || nPos >= length || nPos < 0 )
		return 0;

	nPos	+=	mPatLen;
	
	if( nPos >= length )
		return 0;

	size_t	nStart	=	nPos;
	while( string[nPos] != '\r' && string[nPos] != '\n'
			&& nPos < length )
		nPos	++;
	size_t	nEnd	=	nPos;
	
	memset( rstring, 0, rmaxlen );
	if( nEnd - nStart > rmaxlen-1 )
		return 0;

	strncpy( rstring, &string[nStart], nEnd-nStart );
	return nEnd - nStart;
}

⌨️ 快捷键说明

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