diff options
Diffstat (limited to 'contrib/soundex/soundex.c')
-rw-r--r-- | contrib/soundex/soundex.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/contrib/soundex/soundex.c b/contrib/soundex/soundex.c new file mode 100644 index 00000000000..2ce6ef510f6 --- /dev/null +++ b/contrib/soundex/soundex.c @@ -0,0 +1,83 @@ +/*****************************************************************************/ +/* 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 = '\0'; + return(outstr); +} + |