Directive s=pw sets structure to phrase if term includes blank(s).
[yaz-moved-to-github.git] / util / matchstr.c
1 /*
2  * Copyright (c) 1995-2000, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: matchstr.c,v $
7  * Revision 1.5  2000-02-29 13:44:55  adam
8  * Check for config.h (currently not generated).
9  *
10  * Revision 1.4  1999/11/30 13:47:12  adam
11  * Improved installation. Moved header files to include/yaz.
12  *
13  * Revision 1.3  1999/10/19 12:35:42  adam
14  * Minor bug fix (bug introduced by previous commit).
15  *
16  * Revision 1.2  1999/10/15 11:35:41  adam
17  * Character '.' matches any single character.
18  *
19  * Revision 1.1  1999/06/08 10:10:16  adam
20  * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
21  *
22  * Revision 1.7  1997/09/30 11:47:47  adam
23  * Added function 'cause checkergcc doesn't include assert handler.
24  *
25  * Revision 1.6  1997/09/04 07:54:34  adam
26  * Right hande side operand of yaz_matchstr may include a ? in
27  * which case it returns "match ok".
28  *
29  * Revision 1.5  1997/07/21 12:48:11  adam
30  * Removed windows DLL stubs.
31  *
32  * Revision 1.4  1997/05/01 15:07:55  adam
33  * Added DLL entry point routines.
34  *
35  * Revision 1.3  1996/10/29 13:36:28  adam
36  * Added header.
37  *
38  * Revision 1.2  1996/02/20 17:58:42  adam
39  * Added const to yaz_matchstr.
40  *
41  * Revision 1.1  1996/02/20  16:33:06  quinn
42  * Moved matchstr to global util
43  *
44  * Revision 1.1  1995/11/01  11:56:08  quinn
45  * Added Retrieval (data management) functions en masse.
46  *
47  *
48  */
49 #if HAVE_CONFIG_H
50 #include <config.h>
51 #endif
52
53 #include <stdio.h>
54 #include <assert.h>
55 #include <ctype.h>
56 #include <yaz/yaz-util.h>
57
58 /*
59  * Match strings, independently of case and occurences of '-'.
60  * fairly inefficient - will be replaced with an indexing scheme for
61  * the various subsystems if we get a bottleneck here.
62  */
63
64 int yaz_matchstr(const char *s1, const char *s2)
65 {
66     while (*s1 && *s2)
67     {
68         char c1 = *s1;
69         char c2 = *s2;
70
71         if (c2 == '?')
72             return 0;
73         if (c1 == '-')
74             c1 = *++s1;
75         if (c2 == '-')
76             c2 = *++s2;
77         if (!c1 || !c2)
78             break;
79         if (c2 != '.')
80         {
81             if (isupper(c1))
82                 c1 = tolower(c1);
83             if (isupper(c2))
84                 c2 = tolower(c2);
85             if (c1 != c2)
86                 break;
87         }
88         s1++;
89         s2++;
90     }
91     return *s1 || *s2;
92 }
93
94 #ifdef __GNUC__
95 #ifdef __CHECKER__
96 void __assert_fail (const char *assertion, const char *file, 
97                     unsigned int line, const char *function)
98 {
99     fprintf (stderr, "%s in file %s line %d func %s\n",
100              assertion, file, line, function);
101     abort ();
102 }
103 #endif
104 #endif