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