Bug fixes.
[idzebra-moved-to-github.git] / index / kcompare.c
1 /*
2  * Copyright (C) 1994-1995, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: kcompare.c,v $
7  * Revision 1.14  1995-10-30 15:08:08  adam
8  * Bug fixes.
9  *
10  * Revision 1.13  1995/10/27  14:00:11  adam
11  * Implemented detection of database availability.
12  *
13  * Revision 1.12  1995/10/17  18:02:08  adam
14  * New feature: databases. Implemented as prefix to words in dictionary.
15  *
16  * Revision 1.11  1995/10/06  16:33:37  adam
17  * Use attribute mappings.
18  *
19  * Revision 1.10  1995/09/29  14:01:41  adam
20  * Bug fixes.
21  *
22  * Revision 1.9  1995/09/28  12:10:32  adam
23  * Bug fixes. Field prefix used in queries.
24  *
25  * Revision 1.8  1995/09/28  09:19:42  adam
26  * xfree/xmalloc used everywhere.
27  * Extract/retrieve method seems to work for text records.
28  *
29  * Revision 1.7  1995/09/27  12:22:28  adam
30  * More work on extract in record control.
31  * Field name is not in isam keys but in prefix in dictionary words.
32  *
33  * Revision 1.6  1995/09/14  07:48:23  adam
34  * Record control management.
35  *
36  * Revision 1.5  1995/09/11  13:09:34  adam
37  * More work on relevance feedback.
38  *
39  * Revision 1.4  1995/09/08  14:52:27  adam
40  * Minor changes. Dictionary is lower case now.
41  *
42  * Revision 1.3  1995/09/07  13:58:36  adam
43  * New parameter: result-set file descriptor (RSFD) to support multiple
44  * positions within the same result-set.
45  * Boolean operators: and, or, not implemented.
46  * Result-set references.
47  *
48  * Revision 1.2  1995/09/06  16:11:17  adam
49  * Option: only one word key per file.
50  *
51  * Revision 1.1  1995/09/04  09:10:36  adam
52  * More work on index add/del/update.
53  * Merge sort implemented.
54  * Initial work on z39 server.
55  *
56  */
57
58 #include <stdlib.h>
59 #include <string.h>
60 #include <stdio.h>
61 #include <ctype.h>
62 #include <assert.h>
63
64 #include "index.h"
65
66 void key_logdump (int logmask, const void *p)
67 {
68     struct it_key key;
69
70     memcpy (&key, p, sizeof(key));
71     logf (logmask, "%7d s=%-4d", key.sysno, key.seqno);
72 }
73
74 int key_compare (const void *p1, const void *p2)
75 {
76     struct it_key i1, i2;
77     memcpy (&i1, p1, sizeof(i1));
78     memcpy (&i2, p2, sizeof(i2));
79     if (i1.sysno != i2.sysno)
80     {
81         if (i1.sysno > i2.sysno)
82             return 2;
83         else
84             return -2;
85     }
86 #if IT_KEY_HAVE_SEQNO
87     if (i1.seqno != i2.seqno)
88     {
89         if (i1.seqno > i2.seqno)
90             return 1;
91         else
92             return -1;
93     }
94 #else
95     if (i1.freq != i2.freq)
96     {
97         if (i1.freq > i2.freq)
98             return 1;
99         else
100             return -1;
101     }
102 #endif
103     return 0;
104 }
105
106 int key_qsort_compare (const void *p1, const void *p2)
107 {
108     int r;
109     size_t l;
110     char *cp1 = *(char **) p1;
111     char *cp2 = *(char **) p2;
112  
113     if ((r = strcmp (cp1, cp2)))
114         return r;
115     l = strlen(cp1)+1;
116     if ((r = key_compare (cp1+l+1, cp2+l+1)))
117         return r;
118     return cp1[l] - cp2[l];
119 }
120
121 int index_char_cvt (int c)
122 {
123     return tolower (c);
124 }
125
126 int index_word_prefix (char *string, int attset_ordinal,
127                        int local_attribute,
128                        char *databaseName)
129 {
130     int i;
131     sprintf (string, "%s@%c%04d", databaseName,
132              attset_ordinal + '0', local_attribute);
133     for (i = 0; string[i]; i++)
134         string[i] = index_char_cvt (string[i]);
135     return i;
136 }
137