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