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