]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/phonetic.c
More for ITS#6815, Unbind and Abandon
[openldap] / servers / slapd / phonetic.c
index 4c7f3537bf57717da9ae0967652562dad582f8f0..efa57106b33db6e7feca33c05e13f6bbe8b9943f 100644 (file)
@@ -1,4 +1,28 @@
 /* phonetic.c - routines to do phonetic matching */
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2011 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
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* 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 "portable.h"
 
 
 #include "slap.h"
 
-#if !defined(METAPHONE) && !defined(SLAPD_PHONETIC)
-#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 ) {
@@ -37,7 +62,7 @@ first_word( char *s )
        return( s );
 }
 
-char *
+static char *
 next_word( char *s )
 {
        if ( s == NULL ) {
@@ -59,7 +84,7 @@ next_word( char *s )
        return( s );
 }
 
-char *
+static char *
 word_dup( char *w )
 {
        char    *s, *ret;
@@ -74,6 +99,7 @@ word_dup( char *w )
 
        return( ret );
 }
+#endif /* 0 */
 
 #ifndef MAXPHONEMELEN
 #define MAXPHONEMELEN  4
@@ -87,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;
@@ -97,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';
 
@@ -157,9 +182,12 @@ phonetic( char *s )
         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
@@ -168,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};
@@ -185,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;
@@ -199,8 +226,8 @@ 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';
@@ -429,5 +456,4 @@ phonetic( char *Word )
        return( ch_strdup( buf ) );
 }
 
-#endif /* metaphone */
-#endif /* SLAPD_PHONETIC */
+#endif /* SLAPD_METAPHONE */