mf_soundex.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. /****************************************************************
  18. * SOUNDEX ALGORITHM in C *
  19. * *
  20. * The basic Algorithm source is taken from EDN Nov. *
  21. * 14, 1985 pg. 36. *
  22. * *
  23. * As a test Those in Illinois will find that the *
  24. * first group of numbers in their drivers license *
  25. * number is the soundex number for their last name. *
  26. * *
  27. * RHW  PC-IBBS ID. #1230 *
  28. * *
  29. * As an extension if remove_garbage is set then all non- *
  30. * alpha characters are skipped *
  31. ****************************************************************/
  32. #include "mysys_priv.h"
  33. #include <m_ctype.h>
  34. #include "my_static.h"
  35. static char get_scode(char **ptr,pbool remove_garbage);
  36. /* outputed string is 4 byte long */
  37. /* out_pntr can be == in_pntr */
  38. void soundex(register my_string out_pntr, my_string in_pntr,
  39.      pbool remove_garbage)
  40. {
  41.   char ch,last_ch;
  42.   reg3 my_string end;
  43.   if (remove_garbage)
  44.   {
  45.     while (*in_pntr && isspace(*in_pntr)) /* Skipp pre-space */
  46.       in_pntr++;
  47.   }
  48.   *out_pntr++ = toupper(*in_pntr); /* Copy first letter  */
  49.   last_ch = get_scode(&in_pntr,0); /* code of the first letter  */
  50. /* for the first 'double-letter  */
  51. /* check.  */
  52.   end=out_pntr+3; /* Loop on input letters until  */
  53. /* end of input (null) or output */
  54. /* letter code count = 3  */
  55.   in_pntr++;
  56.   while (out_pntr < end && (ch = get_scode(&in_pntr,remove_garbage)) != 0)
  57.   {
  58.     in_pntr++;
  59.     if ((ch != '0') && (ch != last_ch)) /* if not skipped or double */
  60.     {
  61.       *out_pntr++ = ch; /* letter, copy to output */
  62.     } /* for next double-letter check */
  63.     last_ch = ch; /* save code of last input letter */
  64.   }
  65.   while (out_pntr < end)
  66.     *out_pntr++ = '0';
  67.   *out_pntr=0; /* end string */
  68.   return;
  69. } /* soundex */
  70.   /*
  71.     If alpha, map input letter to soundex code.
  72.     If not alpha and remove_garbage is set then skipp to next char
  73.     else return 0
  74.     */
  75. static char get_scode(char **ptr, pbool remove_garbage)
  76. {
  77.   uchar ch;
  78.   if (remove_garbage)
  79.   {
  80.     while (**ptr && !isalpha(**ptr))
  81.       (*ptr)++;
  82.   }
  83.   ch=toupper(**ptr);
  84.   if (ch < 'A' || ch > 'Z')
  85.   {
  86.     if (isalpha(ch)) /* If exetended alfa (country spec) */
  87.       return '0'; /* threat as vokal */
  88.     return 0; /* Can't map */
  89.   }
  90.   return(soundex_map[ch-'A']);
  91. } /* get_scode */