Uses stat and not lstat so that file traversal follows symbolic links.
[idzebra-moved-to-github.git] / include / dict.h
1 /*
2  * Copyright (C) 1994-1997, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: dict.h,v $
7  * Revision 1.26  1997-09-18 08:59:18  adam
8  * Extra generic handle for the character mapping routines.
9  *
10  * Revision 1.25  1997/09/17 12:19:09  adam
11  * Zebra version corresponds to YAZ version 1.4.
12  * Changed Zebra server so that it doesn't depend on global common_resource.
13  *
14  * Revision 1.24  1997/09/05 15:30:00  adam
15  * Changed prototype for chr_map_input - added const.
16  * Added support for C++, headers uses extern "C" for public definitions.
17  *
18  * Revision 1.23  1996/10/29 13:45:33  adam
19  * Changed definition of DICT_DEFAULT_PAGESIZE.
20  *
21  * Revision 1.22  1996/06/04 10:20:10  adam
22  * Added support for character mapping.
23  *
24  * Revision 1.21  1996/05/24  14:46:07  adam
25  * Added dict_grep_cmap function to define user-mapping in grep lookups.
26  *
27  * Revision 1.20  1996/03/20  09:35:23  adam
28  * Function dict_lookup_grep got extra parameter, init_pos, which marks
29  * from which position in pattern approximate pattern matching should occur.
30  *
31  * Revision 1.19  1996/02/02  13:43:54  adam
32  * The public functions simply use char instead of Dict_char to represent
33  * search strings. Dict_char is used internally only.
34  *
35  * Revision 1.18  1996/02/01  20:41:06  adam
36  * Bug fix: insert didn't work on 8-bit characters due to unsigned char
37  * compares in dict_strcmp (strcmp) and signed Dict_char. Dict_char is
38  * unsigned now.
39  *
40  * Revision 1.17  1995/12/07  11:47:04  adam
41  * Default pagesize is 4k instead of 8k.
42  *
43  * Revision 1.16  1995/12/06  14:41:13  adam
44  * New function: dict_delete.
45  *
46  * Revision 1.15  1995/10/27  13:59:17  adam
47  * Function dict_look_grep got extra parameter max_pos that upon return
48  * hold length of longest prefix that matches pattern.
49  *
50  * Revision 1.14  1995/10/09  16:18:35  adam
51  * Function dict_lookup_grep got extra client data parameter.
52  *
53  * Revision 1.13  1995/10/06  09:03:51  adam
54  * First version of scan.
55  *
56  * Revision 1.12  1995/09/14  11:53:02  adam
57  * Grep handle function parameter info is const now.
58  *
59  * Revision 1.11  1995/09/04  09:09:51  adam
60  * String arg in dict lookup is const.
61  * Minor changes.
62  *
63  * Revision 1.10  1994/10/05  12:16:58  adam
64  * Pagesize is a resource now.
65  *
66  * Revision 1.9  1994/10/04  12:08:19  adam
67  * Minor changes.
68  *
69  * Revision 1.8  1994/10/03  17:23:11  adam
70  * First version of dictionary lookup with regular expressions and errors.
71  *
72  * Revision 1.7  1994/09/22  10:44:47  adam
73  * Don't remember what changed!!
74  *
75  * Revision 1.6  1994/09/16  15:39:21  adam
76  * Initial code of lookup - not tested yet.
77  *
78  * Revision 1.5  1994/09/06  13:05:29  adam
79  * Further development of insertion. Some special cases are
80  * not properly handled yet! assert(0) are put here. The
81  * binary search in each page definitely reduce usr CPU.
82  *
83  * Revision 1.4  1994/09/01  17:44:40  adam
84  * Work on insertion in dictionary. Not finished yet.
85  *
86  * Revision 1.3  1994/08/18  12:41:12  adam
87  * Some development of dictionary. Not finished at all!
88  *
89  * Revision 1.2  1994/08/17  13:32:33  adam
90  * Use cache in dict - not in bfile.
91  *
92  * Revision 1.1  1994/08/16  16:26:53  adam
93  * Added dict.
94  *
95  */
96
97 #ifndef DICT_H
98 #define DICT_H
99
100 #include <bfile.h>
101 #include <log.h>
102
103 #ifdef __cplusplus
104 extern "C" {
105 #endif
106
107 typedef unsigned Dict_ptr;
108 typedef unsigned char Dict_char;
109
110 struct Dict_head {
111     char magic_str[8];
112     int page_size;
113     Dict_ptr free_list, last;
114 };
115
116 struct Dict_file_block
117 {
118     struct Dict_file_block *h_next, **h_prev;
119     struct Dict_file_block *lru_next, *lru_prev;
120     void *data;
121     int dirty;
122     int no;
123 };
124
125 typedef struct Dict_file_struct
126 {
127     int cache;
128     BFile bf;
129     
130     struct Dict_file_block *all_blocks;
131     struct Dict_file_block *free_list;
132     struct Dict_file_block **hash_array;
133     
134     struct Dict_file_block *lru_back, *lru_front;
135     int hash_size;
136     void *all_data;
137     
138     int  block_size;
139     int  hits;
140     int  misses;
141 } *Dict_BFile;
142
143 typedef struct Dict_struct {
144     int rw;
145     Dict_BFile dbf;
146     const char **(*grep_cmap)(void *vp, const char **from, int len);
147     void *grep_cmap_data;
148     struct Dict_head head;
149 } *Dict;
150
151 #define DICT_MAGIC "dict00"
152
153 #define DICT_DEFAULT_PAGESIZE 4096
154
155 int        dict_bf_readp (Dict_BFile bf, int no, void **bufp);
156 int        dict_bf_newp (Dict_BFile bf, int no, void **bufp);
157 int        dict_bf_touch (Dict_BFile bf, int no);
158 void       dict_bf_flush_blocks (Dict_BFile bf, int no_to_flush);
159 Dict_BFile dict_bf_open (BFiles bfs, const char *name, int block_size,
160                          int cache, int rw);
161 int        dict_bf_close (Dict_BFile dbf);
162      
163 Dict       dict_open (BFiles bfs, const char *name, int cache, int rw);
164 int        dict_close (Dict dict);
165 int        dict_insert (Dict dict, const char *p, int userlen, void *userinfo);
166 int        dict_delete (Dict dict, const char *p);
167 char      *dict_lookup (Dict dict, const char *p);
168 int        dict_lookup_ec (Dict dict, char *p, int range,
169                            int (*f)(char *name));
170 int        dict_lookup_grep (Dict dict, const char *p, int range, void *client,
171                              int *max_pos, int init_pos,
172                              int (*f)(char *name, const char *info,
173                                       void *client));
174 int        dict_strcmp (const Dict_char *s1, const Dict_char *s2);
175 int        dict_strlen (const Dict_char *s);
176 int        dict_scan (Dict dict, char *str, 
177                       int *before, int *after, void *client,
178                       int (*f)(char *name, const char *info, int pos,
179                                void *client));
180
181 void       dict_grep_cmap (Dict dict, void *vp,
182                            const char **(*cmap)(void *vp,
183                                                 const char **from, int len));
184
185
186 #define DICT_EOS        0
187 #define DICT_type(x)    0[(Dict_ptr*) x]
188 #define DICT_backptr(x) 1[(Dict_ptr*) x]
189 #define DICT_nextptr(x) 2[(Dict_ptr*) x]
190 #define DICT_nodir(x)   0[(short*)((char*)(x)+3*sizeof(Dict_ptr))]
191 #define DICT_size(x)    1[(short*)((char*)(x)+3*sizeof(Dict_ptr))]
192 #define DICT_infoffset  (3*sizeof(Dict_ptr)+2*sizeof(short))
193 #define DICT_pagesize(x) ((x)->head.page_size)
194
195 #define DICT_to_str(x)  sizeof(Dict_info)+sizeof(Dict_ptr)
196
197 /*
198    type            type of page
199    backptr         pointer to parent
200    nextptr         pointer to next page (if any)
201    nodir           no of words
202    size            size of strings,info,ptr entries
203
204    dir[0..nodir-1]
205    ptr,info,string
206  */
207 #ifdef __cplusplus
208 }
209 #endif
210
211    
212 #endif