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