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