Boyermor.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:5k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //=============================================================================
  2. // File:       boyermor.cpp
  3. // Contents:   Definitions for BoyerMoore
  4. // Maintainer: Doug Sauder <dwsauder@hunnysoft.com>
  5. // WWW:        http://www.hunnysoft.com/mimepp/
  6. //
  7. // Copyright (c) 1996-1998 Douglas W. Sauder
  8. // All rights reserved.
  9. // 
  10. // IN NO EVENT SHALL DOUGLAS W. SAUDER BE LIABLE TO ANY PARTY FOR DIRECT,
  11. // INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
  12. // THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF DOUGLAS W. SAUDER
  13. // HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14. //
  15. // DOUGLAS W. SAUDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
  16. // NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  17. // PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
  18. // BASIS, AND DOUGLAS W. SAUDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
  19. // SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20. //
  21. //=============================================================================
  22. #include "StdAfx.h"
  23. #include <string.h>
  24. #include "../Include/boyermor.h"
  25. BoyerMoore::BoyerMoore(const char* aCstr)
  26. {
  27. mPat = NULL;
  28.     size_t len = strlen(aCstr);
  29.     _Assign(aCstr, len);
  30. }
  31. BoyerMoore::~BoyerMoore()
  32. {
  33. if( mPat )
  34. {
  35. delete mPat;
  36. mPat = NULL;
  37. }
  38. }
  39. void BoyerMoore::Assign(const char* aCstr)
  40. {
  41.     size_t len = strlen(aCstr);
  42.     _Assign(aCstr, len);
  43. }
  44. void BoyerMoore::_Assign(const char* aPat, size_t aPatLen)
  45. {
  46.     mPatLen = 0;
  47.     mPat = new char[aPatLen+1];
  48.     if (mPat != 0) {
  49.         mPatLen = aPatLen;
  50.         strncpy(mPat, aPat, mPatLen);
  51.         mPat[mPatLen] = 0;
  52.         // Initialize the jump table for Boyer-Moore-Horspool algorithm
  53.         size_t i;
  54.         for (i=0; i < 256; ++i) {
  55.             mSkipAmt[i] = (unsigned char) mPatLen;
  56.         }
  57.         for (i=0; i < mPatLen-1; ++i) {
  58.             mSkipAmt[(unsigned char)mPat[i]] = (unsigned char) (mPatLen - i - 1);
  59.         }
  60.     }
  61. }
  62. size_t BoyerMoore::FindIn(const char * string, size_t length, size_t startpos)
  63. {
  64. if ( NULL == string || length <= startpos ) {
  65. return (size_t) -1;
  66. }
  67. if (mPat == 0 || mPatLen == 0) {
  68. return 0;
  69. }
  70. size_t bufLen = length - startpos;
  71. const char* buf = string + startpos;
  72. size_t i;
  73. for (i=mPatLen-1; i < bufLen; i += mSkipAmt[(unsigned char)buf[i]]) {
  74. int iBuf = i;
  75. int iPat = mPatLen - 1;
  76. while (iPat >= 0 && buf[iBuf] == mPat[iPat]) {
  77. --iBuf;
  78. --iPat;
  79. }
  80. if (iPat == -1)
  81. return startpos + iBuf + 1;
  82. }
  83. return (size_t)-1;
  84. }
  85. int BoyerMoore::GetNumStringAfter( const char *string, size_t length, size_t startpos,
  86.   char * rstring, size_t rmaxlen )
  87. {
  88. size_t nPos = FindIn( string, length, startpos );
  89. if( nPos == ((size_t)-1) || nPos >= length || nPos < 0 )
  90. return 0;
  91. nPos += mPatLen;
  92. while( isspace( string[nPos] ) && nPos < length )
  93. nPos ++;
  94. int nCount = 0;
  95. while( !isdigit(BYTE(string[nPos])) && string[nPos] != '.' && string[nPos] != '-' && string[nPos] != 'n'
  96. && nPos < length && nCount < 256 )
  97. { nPos ++; nCount ++; }
  98. if( nPos >= length )
  99. return 0;
  100. size_t nStart = nPos;
  101. while( ( isdigit(BYTE(string[nPos])) || string[nPos] == '.' || string[nPos] == '-' )
  102. && nPos < length )
  103. nPos ++;
  104. size_t nEnd = nPos;
  105. memset( rstring, 0, rmaxlen );
  106. if( nEnd - nStart > rmaxlen-1 )
  107. return 0;
  108. strncpy( rstring, &string[nStart], nEnd-nStart );
  109. return nEnd - nStart;
  110. }
  111. double BoyerMoore::GetNumberAfter( const char *string, size_t length, size_t startpos )
  112. {
  113. double result = 0.;
  114. char rstring[64];
  115. int rLen = GetNumStringAfter( string, length, startpos, rstring, 64 );
  116. if( rLen > 0 )
  117. {
  118. result = atof( rstring );
  119. }
  120. return result;
  121. }
  122. DWORD BoyerMoore::GetDateAfter( const char *string, size_t length, size_t startpos )
  123. {
  124. // Convert to Date as DWORD
  125. char rstring[64];
  126. int rLen = GetNumStringAfter( string, length, startpos, rstring, 64 );
  127. if( rLen > 0 )
  128. {
  129. int nYear = atol( rstring );
  130. for( int k=0; k<rLen; k++ )
  131. if( rstring[k] == '-' )
  132. break;
  133. k++;
  134. int nMonth = atol( &(rstring[k]) );
  135. for( ; k<rLen; k++ )
  136. if( rstring[k] == '-' )
  137. break;
  138. k++;
  139. int nDay = atol( &(rstring[k]) );
  140. DWORD result = nYear * 10000 + nMonth * 100 + nDay;
  141. return result;
  142. }
  143. return 0;
  144. }
  145. int BoyerMoore::GetPhraseAfter( const char *string, size_t length, size_t startpos,
  146.   char * rstring, size_t rmaxlen )
  147. {
  148. size_t nPos = FindIn( string, length, startpos );
  149. if( nPos == ((size_t)-1) || nPos >= length || nPos < 0 )
  150. return 0;
  151. nPos += mPatLen;
  152. if( nPos >= length )
  153. return 0;
  154. size_t nStart = nPos;
  155. while( string[nPos] != 'r' && string[nPos] != 'n'
  156. && nPos < length )
  157. nPos ++;
  158. size_t nEnd = nPos;
  159. memset( rstring, 0, rmaxlen );
  160. if( nEnd - nStart > rmaxlen-1 )
  161. return 0;
  162. strncpy( rstring, &string[nStart], nEnd-nStart );
  163. return nEnd - nStart;
  164. }