mf_soundex.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

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