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