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