Improved installation. Updated for inclusion of YAZ header files.
[idzebra-moved-to-github.git] / include / dict.h
1 /*
2  * Copyright (C) 1994-1999, Index Data
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: dict.h,v $
7  * Revision 1.30  1999-11-30 13:48:03  adam
8  * Improved installation. Updated for inclusion of YAZ header files.
9  *
10  * Revision 1.29  1999/05/15 14:36:37  adam
11  * Updated dictionary. Implemented "compression" of dictionary.
12  *
13  * Revision 1.28  1999/03/09 13:07:06  adam
14  * Work on dict_compact routine.
15  *
16  * Revision 1.27  1999/02/02 14:50:32  adam
17  * Updated WIN32 code specific sections. Changed header.
18  *
19  * Revision 1.26  1997/09/18 08:59:18  adam
20  * Extra generic handle for the character mapping routines.
21  *
22  * Revision 1.25  1997/09/17 12:19:09  adam
23  * Zebra version corresponds to YAZ version 1.4.
24  * Changed Zebra server so that it doesn't depend on global common_resource.
25  *
26  * Revision 1.24  1997/09/05 15:30:00  adam
27  * Changed prototype for chr_map_input - added const.
28  * Added support for C++, headers uses extern "C" for public definitions.
29  *
30  * Revision 1.23  1996/10/29 13:45:33  adam
31  * Changed definition of DICT_DEFAULT_PAGESIZE.
32  *
33  * Revision 1.22  1996/06/04 10:20:10  adam
34  * Added support for character mapping.
35  *
36  * Revision 1.21  1996/05/24  14:46:07  adam
37  * Added dict_grep_cmap function to define user-mapping in grep lookups.
38  *
39  * Revision 1.20  1996/03/20  09:35:23  adam
40  * Function dict_lookup_grep got extra parameter, init_pos, which marks
41  * from which position in pattern approximate pattern matching should occur.
42  *
43  * Revision 1.19  1996/02/02  13:43:54  adam
44  * The public functions simply use char instead of Dict_char to represent
45  * search strings. Dict_char is used internally only.
46  *
47  * Revision 1.18  1996/02/01  20:41:06  adam
48  * Bug fix: insert didn't work on 8-bit characters due to unsigned char
49  * compares in dict_strcmp (strcmp) and signed Dict_char. Dict_char is
50  * unsigned now.
51  *
52  * Revision 1.17  1995/12/07  11:47:04  adam
53  * Default pagesize is 4k instead of 8k.
54  *
55  * Revision 1.16  1995/12/06  14:41:13  adam
56  * New function: dict_delete.
57  *
58  * Revision 1.15  1995/10/27  13:59:17  adam
59  * Function dict_look_grep got extra parameter max_pos that upon return
60  * hold length of longest prefix that matches pattern.
61  *
62  * Revision 1.14  1995/10/09  16:18:35  adam
63  * Function dict_lookup_grep got extra client data parameter.
64  *
65  * Revision 1.13  1995/10/06  09:03:51  adam
66  * First version of scan.
67  *
68  * Revision 1.12  1995/09/14  11:53:02  adam
69  * Grep handle function parameter info is const now.
70  *
71  * Revision 1.11  1995/09/04  09:09:51  adam
72  * String arg in dict lookup is const.
73  * Minor changes.
74  *
75  * Revision 1.10  1994/10/05  12:16:58  adam
76  * Pagesize is a resource now.
77  *
78  * Revision 1.9  1994/10/04  12:08:19  adam
79  * Minor changes.
80  *
81  * Revision 1.8  1994/10/03  17:23:11  adam
82  * First version of dictionary lookup with regular expressions and errors.
83  *
84  * Revision 1.7  1994/09/22  10:44:47  adam
85  * Don't remember what changed!!
86  *
87  * Revision 1.6  1994/09/16  15:39:21  adam
88  * Initial code of lookup - not tested yet.
89  *
90  * Revision 1.5  1994/09/06  13:05:29  adam
91  * Further development of insertion. Some special cases are
92  * not properly handled yet! assert(0) are put here. The
93  * binary search in each page definitely reduce usr CPU.
94  *
95  * Revision 1.4  1994/09/01  17:44:40  adam
96  * Work on insertion in dictionary. Not finished yet.
97  *
98  * Revision 1.3  1994/08/18  12:41:12  adam
99  * Some development of dictionary. Not finished at all!
100  *
101  * Revision 1.2  1994/08/17  13:32:33  adam
102  * Use cache in dict - not in bfile.
103  *
104  * Revision 1.1  1994/08/16  16:26:53  adam
105  * Added dict.
106  *
107  */
108
109 #ifndef DICT_H
110 #define DICT_H
111
112 #include <bfile.h>
113 #include <yaz/log.h>
114
115 #ifdef __cplusplus
116 extern "C" {
117 #endif
118
119 typedef unsigned Dict_ptr;
120 typedef unsigned char Dict_char;
121
122 struct Dict_head {
123     char magic_str[8];
124     int page_size;
125     int compact_flag;
126     Dict_ptr root, last, freelist;
127 };
128
129 struct Dict_file_block
130 {
131     struct Dict_file_block *h_next, **h_prev;
132     struct Dict_file_block *lru_next, *lru_prev;
133     void *data;
134     int dirty;
135     int no;
136     int nbytes;
137 };
138
139 typedef struct Dict_file_struct
140 {
141     int cache;
142     BFile bf;
143     
144     struct Dict_file_block *all_blocks;
145     struct Dict_file_block *free_list;
146     struct Dict_file_block **hash_array;
147     
148     struct Dict_file_block *lru_back, *lru_front;
149     int hash_size;
150     void *all_data;
151     
152     int  block_size;
153     int  hits;
154     int  misses;
155     int  compact_flag;
156 } *Dict_BFile;
157
158 typedef struct Dict_struct {
159     int rw;
160     Dict_BFile dbf;
161     const char **(*grep_cmap)(void *vp, const char **from, int len);
162     void *grep_cmap_data;
163     struct Dict_head head;
164 } *Dict;
165
166 #define DICT_MAGIC "dict01"
167
168 #define DICT_DEFAULT_PAGESIZE 4096
169
170 int        dict_bf_readp (Dict_BFile bf, int no, void **bufp);
171 int        dict_bf_newp (Dict_BFile bf, int no, void **bufp, int nbytes);
172 int        dict_bf_touch (Dict_BFile bf, int no);
173 void       dict_bf_flush_blocks (Dict_BFile bf, int no_to_flush);
174 Dict_BFile dict_bf_open (BFiles bfs, const char *name, int block_size,
175                          int cache, int rw);
176 int        dict_bf_close (Dict_BFile dbf);
177 void       dict_bf_compact (Dict_BFile dbf);
178      
179 Dict       dict_open (BFiles bfs, const char *name, int cache, int rw,
180                       int compact_flag);
181 int        dict_close (Dict dict);
182 int        dict_insert (Dict dict, const char *p, int userlen, void *userinfo);
183 int        dict_delete (Dict dict, const char *p);
184 char      *dict_lookup (Dict dict, const char *p);
185 int        dict_lookup_ec (Dict dict, char *p, int range,
186                            int (*f)(char *name));
187 int        dict_lookup_grep (Dict dict, const char *p, int range, void *client,
188                              int *max_pos, int init_pos,
189                              int (*f)(char *name, const char *info,
190                                       void *client));
191 int        dict_strcmp (const Dict_char *s1, const Dict_char *s2);
192 int        dict_strlen (const Dict_char *s);
193 int        dict_scan (Dict dict, char *str, 
194                       int *before, int *after, void *client,
195                       int (*f)(char *name, const char *info, int pos,
196                                void *client));
197
198 void       dict_grep_cmap (Dict dict, void *vp,
199                            const char **(*cmap)(void *vp,
200                                                 const char **from, int len));
201 int        dict_copy_compact (BFiles bfs, const char *from, const char *to);
202
203
204 #define DICT_EOS        0
205 #define DICT_type(x)    0[(Dict_ptr*) x]
206 #define DICT_backptr(x) 1[(Dict_ptr*) x]
207 #define DICT_bsize(x)   2[(short*)((char*)(x)+2*sizeof(Dict_ptr))]
208 #define DICT_nodir(x)   0[(short*)((char*)(x)+2*sizeof(Dict_ptr))]
209 #define DICT_size(x)    1[(short*)((char*)(x)+2*sizeof(Dict_ptr))]
210 #define DICT_infoffset  (2*sizeof(Dict_ptr)+3*sizeof(short))
211 #define DICT_xxxxpagesize(x) ((x)->head.page_size)
212
213 #define DICT_to_str(x)  sizeof(Dict_info)+sizeof(Dict_ptr)
214
215 /*
216    type            type of page
217    backptr         pointer to parent
218    nextptr         pointer to next page (if any)
219    nodir           no of words
220    size            size of strings,info,ptr entries
221
222    dir[0..nodir-1]
223    ptr,info,string
224  */
225 #ifdef __cplusplus
226 }
227 #endif
228
229    
230 #endif