soundex.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*****************************************************************************/
  2. /* soundex.c */
  3. /*****************************************************************************/
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include "postgres.h" /* for char16, etc. */
  7. #include "utils/palloc.h" /* for palloc */
  8. #include "libpq-fe.h" /* for TUPLE */
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. /* prototype for soundex function */
  12. char    *soundex(char *instr, char *outstr);
  13. text *
  14. text_soundex(text *t)
  15. {
  16. /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
  17. char    *table = "01230120022455012623010202";
  18. int count = 0;
  19. text    *new_t;
  20. char outstr[6 + 1]; /* max length of soundex is 6 */
  21. char    *instr;
  22. /* make a null-terminated string */
  23. instr = palloc(VARSIZE(t) + 1);
  24. memcpy(instr, VARDATA(t), VARSIZE(t) - VARHDRSZ);
  25. instr[VARSIZE(t) - VARHDRSZ] = (char) 0;
  26. /* load soundex into outstr */
  27. soundex(instr, outstr);
  28. /* Now the outstr contains the soundex of instr */
  29. /* copy outstr to new_t */
  30. new_t = (text *) palloc(strlen(outstr) + VARHDRSZ);
  31. memset(new_t, 0, strlen(outstr) + 1);
  32. VARSIZE(new_t) = strlen(outstr) + VARHDRSZ;
  33. memcpy((void *) VARDATA(new_t),
  34.    (void *) outstr,
  35.    strlen(outstr));
  36. /* free instr */
  37. pfree(instr);
  38. return (new_t);
  39. }
  40. char *
  41. soundex(char *instr, char *outstr)
  42. { /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
  43. char    *table = "01230120022455012623010202";
  44. int count = 0;
  45. while (!isalpha(instr[0]) && instr[0])
  46. ++instr;
  47. if (!instr[0])
  48. { /* Hey!  Where'd the string go? */
  49. outstr[0] = (char) 0;
  50. return outstr;
  51. }
  52. if (toupper(instr[0]) == 'P' && toupper(instr[1]) == 'H')
  53. {
  54. instr[0] = 'F';
  55. instr[1] = 'A';
  56. }
  57. *outstr++ = (char) toupper(*instr++);
  58. while (*instr && count < 5)
  59. {
  60. if (isalpha(*instr) && *instr != *(instr - 1))
  61. {
  62. *outstr = table[toupper(instr[0]) - 'A'];
  63. if (*outstr != '0')
  64. {
  65. ++outstr;
  66. ++count;
  67. }
  68. }
  69. ++instr;
  70. }
  71. *outstr = '';
  72. return (outstr);
  73. }