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