soundex.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
- /*****************************************************************************/
- /* soundex.c */
- /*****************************************************************************/
- #include <string.h>
- #include <stdio.h>
- #include "postgres.h" /* for char16, etc. */
- #include "utils/palloc.h" /* for palloc */
- #include "libpq-fe.h" /* for TUPLE */
- #include <stdio.h>
- #include <ctype.h>
- /* prototype for soundex function */
- char *soundex(char *instr, char *outstr);
- text *
- text_soundex(text *t)
- {
- /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
- char *table = "01230120022455012623010202";
- int count = 0;
- text *new_t;
- char outstr[6 + 1]; /* max length of soundex is 6 */
- char *instr;
- /* make a null-terminated string */
- instr = palloc(VARSIZE(t) + 1);
- memcpy(instr, VARDATA(t), VARSIZE(t) - VARHDRSZ);
- instr[VARSIZE(t) - VARHDRSZ] = (char) 0;
- /* load soundex into outstr */
- soundex(instr, outstr);
- /* Now the outstr contains the soundex of instr */
- /* copy outstr to new_t */
- new_t = (text *) palloc(strlen(outstr) + VARHDRSZ);
- memset(new_t, 0, strlen(outstr) + 1);
- VARSIZE(new_t) = strlen(outstr) + VARHDRSZ;
- memcpy((void *) VARDATA(new_t),
- (void *) outstr,
- strlen(outstr));
- /* free instr */
- pfree(instr);
- return (new_t);
- }
- char *
- soundex(char *instr, char *outstr)
- { /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
- char *table = "01230120022455012623010202";
- int count = 0;
- while (!isalpha(instr[0]) && instr[0])
- ++instr;
- if (!instr[0])
- { /* Hey! Where'd the string go? */
- outstr[0] = (char) 0;
- return outstr;
- }
- if (toupper(instr[0]) == 'P' && toupper(instr[1]) == 'H')
- {
- instr[0] = 'F';
- instr[1] = 'A';
- }
- *outstr++ = (char) toupper(*instr++);
- while (*instr && count < 5)
- {
- if (isalpha(*instr) && *instr != *(instr - 1))
- {
- *outstr = table[toupper(instr[0]) - 'A'];
- if (*outstr != '0')
- {
- ++outstr;
- ++count;
- }
- }
- ++instr;
- }
- *outstr = ' ';
- return (outstr);
- }