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