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