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