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