|
|
1.1 root 1: /* soundex.c - compare a filter and attribute value */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/soundex.c,v 7.0 89/11/23 21:47:46 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/dsap/common/RCS/soundex.c,v 7.0 89/11/23 21:47:46 mrose Rel $
9: *
10: *
11: * $Log: soundex.c,v $
12: * Revision 7.0 89/11/23 21:47:46 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27: #include <ctype.h>
28: #include "quipu/util.h"
29: #include "quipu/attrvalue.h"
30: #include "quipu/ds_search.h"
31:
32: static char * next_word (ptr)
33: register char *ptr;
34: {
35: while ( (*ptr != '.') && (*ptr != ' ') && (*ptr != '-') && (*ptr != 0) )
36: ptr++;
37:
38: if (*ptr)
39: return (++ptr);
40:
41: return (NULLCP);
42: }
43:
44: static char next_char (a,last)
45: register char ** a;
46: char last;
47: {
48: extern char chrcnv[];
49: register char lc, c;
50:
51: if (**a == 0)
52: return (0);
53:
54: for (;*++*a;) {
55: if ( (**a == '.') || (**a ==' ') || (**a == '-') )
56: return (0);
57: lc = chrcnv[**a];
58: if (isupper (lc)) {
59: /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */
60: c = "abcdabcaacclmmabcrcdabacac" [lc-'A'];
61: if ((c != 'a') && (c != last))
62: return (c);
63: } else if (isdigit (lc))
64: return (lc);
65: }
66: return (0);
67: }
68:
69:
70: static match_word (a,b)
71: char *a;
72: char *b;
73: {
74: register char lasta, lastb;
75:
76: if ( (lasta = chrcnv[*a]) != (lastb = chrcnv[*b]) )
77: return FALSE;
78:
79: for (;;) {
80: lasta = next_char (&a,lasta);
81: lastb = next_char (&b,lastb);
82:
83: if (lastb == 0)
84: return TRUE;
85:
86: if (lasta != lastb)
87: return FALSE;
88:
89: }
90: /* NOTREACHED */
91: }
92:
93:
94: soundex_cmp (a,b)
95: register char *a;
96: register char *b;
97: {
98: char result = FALSE;
99: register char * ptr;
100:
101: for( ; a && b ; b = next_word (b) ) {
102: for (ptr=a; ptr; ptr=next_word(ptr) ) {
103: if (match_word (ptr,b)) {
104: a = next_word (ptr);
105: result = TRUE;
106: break;
107: }
108: }
109: if (ptr == NULLCP)
110: return FALSE;
111: }
112: if ((a == NULL) && (b != NULL))
113: return FALSE;
114:
115: return (result);
116: }
117:
118:
119: soundex_match (fitem,avs)
120: register struct filter_item *fitem;
121: register AV_Sequence avs;
122: {
123: for (; avs != NULLAV; avs=avs->avseq_next)
124: if (soundex_cmp ((char *)avs->avseq_av.av_struct, (char *)fitem->UNAVA.ava_value->av_struct))
125: return (OK);
126:
127: return (NOTOK);
128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.