X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fphonetic.c;h=6a03fa28194e26266daefa31dcf025f1b0d6c503;hb=6273df07da2d23bea3f79ce630f8778e1881b3a7;hp=959e06e1e332479aeae05f92dcd4d8c2ce8f4f13;hpb=42e0d83cb3a1a1c5b25183f1ab74ce7edbe25de7;p=openldap
diff --git a/servers/slapd/phonetic.c b/servers/slapd/phonetic.c
index 959e06e1e3..6a03fa2819 100644
--- a/servers/slapd/phonetic.c
+++ b/servers/slapd/phonetic.c
@@ -1,23 +1,50 @@
/* phonetic.c - routines to do phonetic matching */
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software .
+ *
+ * Copyright 1998-2010 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * .
+ */
+/* Portions Copyright (c) 1995 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
-#include
-#include
-#include
-#include
-#include
-#include
#include "portable.h"
+
+#include
+
+#include
+#include
+#include
+#include
+
#include "slap.h"
-#if !defined(METAPHONE) && !defined(SOUNDEX)
-#define METAPHONE
+#if !defined(SLAPD_METAPHONE) && !defined(SLAPD_PHONETIC)
+#define SLAPD_METAPHONE
#endif
#define iswordbreak(x) (!isascii(x) || isspace((unsigned char) (x)) || \
ispunct((unsigned char) (x)) || \
- isdigit((unsigned char) (x)) || x == '\0')
+ isdigit((unsigned char) (x)) || (x) == '\0')
-char *
+#if 0
+static char *
first_word( char *s )
{
if ( s == NULL ) {
@@ -35,7 +62,7 @@ first_word( char *s )
return( s );
}
-char *
+static char *
next_word( char *s )
{
if ( s == NULL ) {
@@ -57,7 +84,7 @@ next_word( char *s )
return( s );
}
-char *
+static char *
word_dup( char *w )
{
char *s, *ret;
@@ -67,17 +94,18 @@ word_dup( char *w )
; /* NULL */
save = *s;
*s = '\0';
- ret = strdup( w );
+ ret = ch_strdup( w );
*s = save;
return( ret );
}
+#endif /* 0 */
#ifndef MAXPHONEMELEN
#define MAXPHONEMELEN 4
#endif
-#if defined(SOUNDEX)
+#if defined(SLAPD_PHONETIC)
/* lifted from isode-8.0 */
char *
@@ -85,8 +113,7 @@ phonetic( char *s )
{
char code, adjacent, ch;
char *p;
- char **c;
- int i, cmax;
+ int i;
char phoneme[MAXPHONEMELEN + 1];
p = s;
@@ -95,11 +122,11 @@ phonetic( char *s )
}
adjacent = '0';
- phoneme[0] = TOUPPER(*p);
+ phoneme[0] = TOUPPER((unsigned char)*p);
phoneme[1] = '\0';
for ( i = 0; i < 99 && (! iswordbreak(*p)); p++ ) {
- ch = TOUPPER (*p);
+ ch = TOUPPER ((unsigned char)*p);
code = '0';
@@ -152,12 +179,15 @@ phonetic( char *s )
if ( i > 0 )
phoneme[i] = '\0';
- return( strdup( phoneme ) );
+ return( ch_strdup( phoneme ) );
}
-#else
-#if defined(METAPHONE)
+#elif defined(SLAPD_METAPHONE)
+/*
+ * Metaphone was originally developed by Lawrence Philips and
+ * published in the "Computer Language" magazine in 1990.
+ */
/*
* Metaphone copied from C Gazette, June/July 1991, pp 56-57,
* author Gary A. Parker, with changes by Bernard Tiffany of the
@@ -166,7 +196,7 @@ phonetic( char *s )
*/
/* Character coding array */
-static char vsvfn[26] = {
+static const char vsvfn[26] = {
1, 16, 4, 16, 9, 2, 4, 16, 9, 2, 0, 2, 2,
/* A B C D E F G H I J K L M */
2, 1, 4, 0, 2, 4, 4, 1, 0, 0, 0, 8, 0};
@@ -183,9 +213,8 @@ char *
phonetic( char *Word )
{
char *n, *n_start, *n_end; /* pointers to string */
- char *metaph, *metaph_end; /* pointers to metaph */
+ char *metaph_end; /* pointers to metaph */
char ntrans[40]; /* word with uppercase letters */
- char newm[8];/* new metaph for comparison */
int KSflag; /* state flag for X -> KS */
char buf[MAXPHONEMELEN + 2];
char *Metaph;
@@ -197,13 +226,13 @@ phonetic( char *Word )
for (n = ntrans + 4, n_end = ntrans + 35; !iswordbreak( *Word ) &&
n < n_end; Word++) {
- if (isalpha(*Word))
- *n++ = TOUPPER(*Word);
+ if (isalpha((unsigned char)*Word))
+ *n++ = TOUPPER((unsigned char)*Word);
}
Metaph = buf;
*Metaph = '\0';
if (n == ntrans + 4) {
- return( strdup( buf ) ); /* Return if null */
+ return( ch_strdup( buf ) ); /* Return if null */
}
n_end = n; /* Set n_end to end of string */
@@ -424,8 +453,7 @@ phonetic( char *Word )
}
*Metaph = 0; /* Null terminate */
- return( strdup( buf ) );
+ return( ch_strdup( buf ) );
}
-#endif /* metaphone */
-#endif /* soundex */
+#endif /* SLAPD_METAPHONE */