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