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