2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.12 1995-10-17 18:02:08 adam
8 * New feature: databases. Implemented as prefix to words in dictionary.
10 * Revision 1.11 1995/10/06 16:33:37 adam
11 * Use attribute mappings.
13 * Revision 1.10 1995/09/29 14:01:41 adam
16 * Revision 1.9 1995/09/28 12:10:32 adam
17 * Bug fixes. Field prefix used in queries.
19 * Revision 1.8 1995/09/28 09:19:42 adam
20 * xfree/xmalloc used everywhere.
21 * Extract/retrieve method seems to work for text records.
23 * Revision 1.7 1995/09/27 12:22:28 adam
24 * More work on extract in record control.
25 * Field name is not in isam keys but in prefix in dictionary words.
27 * Revision 1.6 1995/09/14 07:48:23 adam
28 * Record control management.
30 * Revision 1.5 1995/09/11 13:09:34 adam
31 * More work on relevance feedback.
33 * Revision 1.4 1995/09/08 14:52:27 adam
34 * Minor changes. Dictionary is lower case now.
36 * Revision 1.3 1995/09/07 13:58:36 adam
37 * New parameter: result-set file descriptor (RSFD) to support multiple
38 * positions within the same result-set.
39 * Boolean operators: and, or, not implemented.
40 * Result-set references.
42 * Revision 1.2 1995/09/06 16:11:17 adam
43 * Option: only one word key per file.
45 * Revision 1.1 1995/09/04 09:10:36 adam
46 * More work on index add/del/update.
47 * Merge sort implemented.
48 * Initial work on z39 server.
60 void key_logdump (int logmask, const void *p)
64 memcpy (&key, p, sizeof(key));
65 logf (logmask, "%7d s=%-4d", key.sysno, key.seqno);
68 int key_compare (const void *p1, const void *p2)
70 const struct it_key *i1 = p1, *i2 = p2;
71 if (i1->sysno != i2->sysno)
73 if (i1->sysno > i2->sysno)
79 if (i1->seqno != i2->seqno)
81 if (i1->seqno > i2->seqno)
87 if (i1->freq != i2->freq)
89 if (i1->freq > i2->freq)
98 int key_qsort_compare (const void *p1, const void *p2)
102 char *cp1 = *(char **) p1;
103 char *cp2 = *(char **) p2;
105 if ((r = strcmp (cp1, cp2)))
108 if ((r = key_compare (cp1+l+1, cp2+l+1)))
110 return cp1[l] - cp2[l];
113 int index_char_cvt (int c)
118 int index_word_prefix (char *string, int attset_ordinal,
121 char **databaseNames)
126 sprintf (string, "%c%04d(", attset_ordinal + '0', local_attribute);
127 strcat (string, databaseNames[i]);
128 for (i = 1; i < num_bases; i++)
130 strcat (string, "|");
131 strcat (string, databaseNames[i]);
133 strcat (string, ")@");
136 sprintf (string, "%c%04d%s@", attset_ordinal + '0', local_attribute,
138 for (i = 0; string[i]; i++)
139 string[i] = index_char_cvt (string[i]);