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