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