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