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