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