|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 4218 (0x107a)
Types: TextFile
Names: »soundex.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/quipu/soundex.c«
/* make_keys.c - */
#ifndef lint
static char *rcsid = "$Header: /f/osi/quipu/RCS/soundex.c,v 6.0 89/03/18 23:41:55 mrose Rel $";
#endif
/*
* $Header: /f/osi/quipu/RCS/soundex.c,v 6.0 89/03/18 23:41:55 mrose Rel $
*
*
* $Log: soundex.c,v $
* Revision 6.0 89/03/18 23:41:55 mrose
* Release 5.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.
*
*/
/* Some routines copied from Thorn - then modified */
#include <ctype.h>
#include "quipu/util.h"
#include "quipu/attrvalue.h"
#include "quipu/ds_search.h"
static void make_keys();
static void make_long_keys();
static void make_single_key();
avs_soundex_key (a)
AV_Sequence a;
{
if ( (a->avseq_av->av_syntax != AV_CASEIGNORESTRING) || (a->avseq_av->av_syntax != AV_CASEIGNORESTRING) )
return;
for (; a != NULLAV; a = a -> avseq_next)
make_keys (a->avseq_soundex,a->avseq_av->av_un.av_str);
}
fitem_soundex_key (a)
struct filter_item *a;
{
if ( (a->UNAVA.ava_value->av_syntax != AV_CASEIGNORESTRING) || (a->UNAVA.ava_value->av_syntax != AV_CASEIGNORESTRING) )
a->fi_soundex[0][0] = 0;
make_keys (a->fi_soundex,a->UNAVA.ava_value->av_un.av_str);
}
soundex_cmp (a,b)
Soundex a [MAXSOUNDEXKEYS][SOUNDEXKEYSIZE];
Soundex b [MAXSOUNDEXKEYS][SOUNDEXKEYSIZE];
{
register int j,k,i;
int len;
int result = NOTOK;
for (i=0, k=0; i < MAXSOUNDEXKEYS ; i++) {
if (b[i][0] == 0)
return (result);
if (a[k][0] == 0)
return (NOTOK);
for (j=k; j < MAXSOUNDEXKEYS; j++) {
if (a[j][0] == 0)
return (NOTOK);
for (len=0; len < SOUNDEXKEYSIZE; len++)
if (b[i][len] == 0)
break;
if (strncmp (a[j],b[i],len) == 0) {
k = j + 1;
result = OK;
break;
}
if ( j >= MAXSOUNDEXKEYS )
return (NOTOK);
}
}
return (NOTOK);
}
static void make_keys (buf,str)
Soundex buf [MAXSOUNDEXKEYS][SOUNDEXKEYSIZE];
char *str;
{
register int i = 0;
register char * ptr, sep;
register char * name;
name = str;
ptr = name;
while (*name && (i < MAXSOUNDEXKEYS) ) {
while ( (*ptr != '.') && (*ptr != ' ') && (*ptr != '-') && (*ptr != 0) )
ptr++;
sep = *ptr;
*ptr = 0;
make_single_key (buf [i++],name);
if ((*ptr = sep) == 0)
break;
name = ++ptr;
}
if (i < MAXSOUNDEXKEYS)
buf [i][0] = 0;
if ((i >= MAXSOUNDEXKEYS) && ( *--ptr != 0))
make_long_keys (buf,str);
}
static void make_single_key (buf,name)
Soundex buf [SOUNDEXKEYSIZE];
char *name;
{
register char c, lc, prev ='0';
register int i;
extern char chrcnv[];
for (i=0; (*name) && (i<SOUNDEXKEYSIZE); name++) {
lc = chrcnv[*name];
if (isupper (lc)) {
/* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
c = "abcdabcaacclmmabcrcdabacac" [lc-'A'];
if (i == 0)
buf[i++] = lc;
else if ((c != 'a') && (c != prev))
buf[i++] = c;
prev = c;
} else if (isdigit (lc)) {
buf[i++] = lc;
prev = lc;
}
}
if (i<SOUNDEXKEYSIZE)
buf [i] = 0;
}
/* This is experimental and may/may not be included in the final system
*
* The idea is that if the string contains more than MAXSOUNDEKKEY
* words, we will ignore certain 'gramatical' words,
* so the key is made of only 'important' words.
* This is of course language dependant
*/
#include "cmd_srch.h"
static void make_long_keys (buf,name)
Soundex buf [MAXSOUNDEXKEYS][SOUNDEXKEYSIZE];
register char *name;
{
register int i = 0;
register char * ptr, sep;
static CMD_TABLE cmd_words [] = {
"a", 0,
"i", 0,
"as", 0,
"an", 0,
"is", 0,
"in", 0,
"on", 0,
"of", 0,
"it", 0,
"to", 0,
"the", 0,
"was", 0,
"this", 0,
"that", 0,
0, -1
};
ptr = name;
while (*name && (i < MAXSOUNDEXKEYS) ) {
while ( (*ptr != '.') && (*ptr != ' ') && (*ptr != '-') && (*ptr != 0) )
ptr++;
sep = *ptr;
*ptr = 0;
if (cmd_srch (name,cmd_words) == -1)
make_single_key (buf [i++],name);
if ((*ptr = sep) == 0)
break;
name = ++ptr;
}
if (i < MAXSOUNDEXKEYS)
buf [i][0] = 0;
}