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