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