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