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