SMHRK.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  S M H P S . C
  3.  *  
  4.  *  Sample mail handling sub-string search functions
  5.  *  Uses Rabin/Karp algorythms to find sub-strings
  6.  *  Copyright 1992-95 Microsoft Corporation.  All Rights Reserved.
  7.  */
  8. #include "_pch.h"
  9. #include "smhnls.h"
  10. #define ulPrime ((ULONG) 0x00FF00F1)
  11. #define ulBase  ((ULONG) 0x00000100)
  12. BOOL
  13. FRKFindSubpb (LPBYTE pbTarget,
  14.     ULONG cbTarget,
  15.     LPBYTE pbPattern,
  16.     ULONG cbPattern)
  17. {
  18.     UINT    i;
  19.     LPBYTE  pbTargetMax = pbTarget + cbTarget;
  20.     LPBYTE  pbPatternMax = pbPattern + cbPattern;
  21.     ULONG   ulBaseToPowerMod = 1;
  22.     ULONG   ulHashPattern = 0;
  23.     ULONG   ulHashTarget = 0;
  24.     if (cbPattern > cbTarget)
  25.         return FALSE;
  26.     // Compute the power of the left most character in base ulBase
  27.     for (i = 1; i < cbPattern; i++)
  28.         ulBaseToPowerMod = (ulBase * ulBaseToPowerMod) % ulPrime;
  29.     // Calculate the hash function for the src (and the first dst)
  30.     while (pbPattern < pbPatternMax)
  31.     {
  32.         ulHashPattern = (ulHashPattern*ulBase+*pbPattern) % ulPrime;
  33.         ulHashTarget = (ulHashTarget*ulBase+*pbTarget) % ulPrime;
  34.         pbPattern++;
  35.         pbTarget++;
  36.     }
  37.     // Dynamically produce hash values for the string as we go
  38.     for ( ;; )
  39.     {
  40.         // Remember to do the memcmp for the off-chance it doesn't work
  41.         // according to probability
  42.         if (    ulHashPattern == ulHashTarget
  43.             && !memcmp(pbPattern-cbPattern, pbTarget-cbPattern,
  44.             (UINT)cbPattern))
  45.             return TRUE;
  46.         // Assert because this is very unprobable
  47. #ifdef DEBUG
  48.         if (ulHashPattern == ulHashTarget)
  49.             DebugTrace("This is very unprobable!n");
  50. #endif
  51.         if (pbTarget == pbTargetMax)
  52.             return FALSE;
  53.         ulHashTarget = (ulHashTarget+ulBase*ulPrime-
  54.             *(pbTarget-cbPattern)*ulBaseToPowerMod) % ulPrime;
  55.         ulHashTarget = (ulHashTarget*ulBase+*pbTarget) % ulPrime;
  56.         pbTarget++;
  57.     }
  58. }
  59. BOOL
  60. FRKFindSubpsz (LPSTR pszTarget,
  61.     ULONG cbTarget,
  62.     LPSTR pszPattern,
  63.     ULONG cbPattern,
  64.     ULONG ulFuzzyLevel)
  65. {
  66.     UINT    i;
  67.     ULONG   ulBaseToPowerMod = 1;
  68.     ULONG   ulHashPattern = 0;
  69.     ULONG   ulHashTarget = 0;
  70.     LCID    lcid = GetUserDefaultLCID();
  71.     LPBYTE  pbTarget;
  72.     LPBYTE  pbPattern;
  73.     LPBYTE  pbTargetMax;
  74.     LPBYTE  pbPatternMax;
  75.     BOOL    fResult = FALSE;
  76.     CHAR    *rgchHash;
  77.     // Validate parameters
  78.     switch (ulFuzzyLevel & (FL_IGNORECASE | FL_IGNORENONSPACE))
  79.     {
  80.       case 0:       
  81.       default:
  82.         rgchHash = rgchCsds;
  83.         break;
  84.         
  85.       case FL_IGNORECASE:
  86.         rgchHash = rgchCids;
  87.         break;
  88.         
  89.       case FL_IGNORENONSPACE:
  90.         rgchHash = rgchCsdi;
  91.         break;
  92.         
  93.       case FL_IGNORECASE | FL_IGNORENONSPACE:
  94.         rgchHash = rgchCidi;
  95.         break;
  96.     }
  97.     if (ulFuzzyLevel & FL_LOOSE)
  98.         rgchHash = rgchCids;
  99.     pbTarget = (LPBYTE) pszTarget;
  100.     pbPattern = (LPBYTE) pszPattern;
  101.     pbTargetMax = pbTarget + cbTarget;
  102.     pbPatternMax = pbPattern + cbPattern;
  103.     if (cbPattern > cbTarget)
  104.         goto end;
  105.     // Compute the power of the left most character in base ulBase
  106.     for (i = 1; i < cbPattern; i++)
  107.         ulBaseToPowerMod = (ulBase * ulBaseToPowerMod) % ulPrime;
  108.     // Calculate the hash function for the src (and the first dst)
  109.     while (pbPattern < pbPatternMax)
  110.     {
  111.         ulHashPattern = (ulHashPattern*ulBase+rgchHash[*pbPattern]) % ulPrime;
  112.         ulHashTarget = (ulHashTarget*ulBase+rgchHash[*pbTarget]) % ulPrime;
  113.         pbPattern++;
  114.         pbTarget++;
  115.     }
  116.     // Dynamically produce hash values for the string as we go
  117.     for ( ;; )
  118.     {
  119.         if (ulHashPattern == ulHashTarget)
  120.         {
  121.             if (CompareStringA(lcid,
  122.                 ((ulFuzzyLevel & FL_IGNORECASE) ? NORM_IGNORECASE : 0) |
  123.                 ((ulFuzzyLevel & FL_LOOSE) ? NORM_IGNORECASE : 0) |
  124.                 ((ulFuzzyLevel & FL_IGNORENONSPACE) ? NORM_IGNORENONSPACE : 0),
  125.                 pbPattern-cbPattern, (UINT)cbPattern,
  126.                 pbTarget-cbPattern, (UINT)cbPattern) == 2)
  127.             {
  128.                 fResult = TRUE;
  129.                 goto end;
  130.             }
  131.         }
  132. #ifdef DEBUG
  133.         if (ulHashPattern == ulHashTarget)
  134.             DebugTrace ("This is very unprobable, unless you are doing "
  135.                 "FL_EXACT and an case insensitive match came up "
  136.                 "(or you are on DBCS)n");
  137. #endif
  138.         if (pbTarget == pbTargetMax)
  139.             goto end;
  140.         ulHashTarget = (ulHashTarget+ulBase*ulPrime-
  141.             rgchHash[*(pbTarget-cbPattern)]*ulBaseToPowerMod) % ulPrime;
  142.         ulHashTarget = (ulHashTarget*ulBase+rgchHash[*pbTarget]) % ulPrime;
  143.         pbTarget++;
  144.     }
  145. end:
  146.     return fResult;
  147. }