DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T s

⟦cbbec5eb5⟧ TextFile

    Length: 2380 (0x94c)
    Types: TextFile
    Names: »soundex.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/dsap/common/soundex.c« 

TextFile

/* soundex.c - compare a filter and attribute value */

#ifndef lint
static char *rcsid = "$Header: /f/osi/dsap/common/RCS/soundex.c,v 7.0 89/11/23 21:47:46 mrose Rel $";
#endif

/*
 * $Header: /f/osi/dsap/common/RCS/soundex.c,v 7.0 89/11/23 21:47:46 mrose Rel $
 *
 *
 * $Log:	soundex.c,v $
 * Revision 7.0  89/11/23  21:47:46  mrose
 * Release 6.0
 * 
 */

/*
 *                                NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */

#include <ctype.h>
#include "quipu/util.h"
#include "quipu/attrvalue.h"
#include "quipu/ds_search.h"

static char * next_word (ptr)
register char *ptr;
{
	while ( (*ptr != '.') && (*ptr != ' ') && (*ptr != '-') && (*ptr != 0) )
		ptr++;

	if (*ptr)
		return (++ptr);

	return (NULLCP);
}

static char next_char (a,last)
register char ** a;
char last;
{
extern char chrcnv[];
register char lc, c;

	if (**a == 0)
		return (0);

	for (;*++*a;) {
		if ( (**a == '.') || (**a ==' ') || (**a == '-') )
			return (0);
		lc = chrcnv[**a];
		if (isupper (lc)) {
			/*   ABCDEFGHIJKLMNOPQRSTUVWXYZ   */
			c = "abcdabcaacclmmabcrcdabacac" [lc-'A'];
			if ((c != 'a') && (c != last))
				return (c);
		} else if (isdigit (lc)) 
			return (lc);
	}
	return (0);
}


static match_word (a,b)
char *a;
char *b;
{
register char lasta, lastb;

	if ( (lasta = chrcnv[*a]) != (lastb = chrcnv[*b]) )
		return FALSE;

	for (;;) {
		lasta = next_char (&a,lasta);
		lastb = next_char (&b,lastb);

		if (lastb == 0)
			return TRUE;

		if (lasta != lastb)
			return FALSE;

	}
	/* NOTREACHED */
}


soundex_cmp (a,b)
register char *a;
register char *b;
{
char result = FALSE;
register char * ptr;

	for( ; a && b ; b = next_word (b) ) {
		for (ptr=a; ptr; ptr=next_word(ptr) )  {
			if (match_word (ptr,b)) {
				a = next_word (ptr);
				result = TRUE;
				break;
			}
		}
		if (ptr == NULLCP)
			return FALSE;
	}
	if ((a == NULL) && (b != NULL))
		return FALSE;

	return (result);
}


soundex_match (fitem,avs)
    register struct filter_item *fitem;
    register AV_Sequence avs;
{
	for (; avs != NULLAV; avs=avs->avseq_next)
		if (soundex_cmp ((char *)avs->avseq_av.av_struct, (char *)fitem->UNAVA.ava_value->av_struct))
			return (OK);

	return (NOTOK);
}