1 #   include	"ind.h"
2 
3 #   define	TNfUSED		1
4 #   define	TNfACCEPTS	2
5 #   define	TNfREAD_ONLY	4
6 
7 #   define	INDMAGIC	0xdfadfadf
8 #   define	INDMAGIC_R	0xdffaaddf
9 
10 #   define	TLsBLOCK	5000
11 #   define	TNsBLOCK	5000
12 
13 #   define	TLgFREE	0xfffffe
14 #   define	TLgUSED	0xffffff
15 
16 typedef struct TrieNode
17     {
18     int			tn_transitions;
19     unsigned short	tn_ntrans;
20     unsigned char	tn_flags;
21     unsigned char	tn_unused;
22     } TrieNode;
23 
24 typedef struct TrieLink
25     {
26     unsigned int		tl_key:16;
27     unsigned int		tl_to:32;
28     } TrieLink;
29 
30 /************************************************************************/
31 /*									*/
32 /*  An 'IND' struct.							*/
33 /*									*/
34 /*  Offsets to the location in the file header are prepended as a	*/
35 /*  comment.								*/
36 /*									*/
37 /************************************************************************/
38 
39 typedef struct IND
40     {
41     /*  0  */	int		ind_magic;	/*  To avoid trouble	*/
42 
43     /*  -  */	int		ind_fd;		/*  For future use.	*/
44 
45     /*  8  */	int		ind_start;
46     /*  -  */	int		ind_readonly;
47 
48     /*  -  */	TrieNode *	ind_nodes;
49     /*  -  */	TrieNode **	indNodePages;
50     /* 24  */	int		indNodeCount;
51     /* 28  */	int		indAllocatedNodes;
52 
53     /*  -  */	TrieLink *	ind_links;
54     /*  -  */	TrieLink **	indLinkPages;
55     /* 40  */	int		indAllocatedLinks;
56 				/****************************************/
57 				/*  Range of free slots to optimize	*/
58 				/*  searches. Actually, the numbers are	*/
59 				/*  candidates: the slot may have been	*/
60 				/*  used for a node.			*/
61 				/****************************************/
62     /* 44  */	int		indFirstFreeLinkSlot;
63     /* 48  */	int		indLastHeadLinkSlot;
64 
65     /* 52  */	unsigned char *	indMmappedFile;
66     /* 56  */	unsigned long	indMmappedSize;
67     } IND;
68 
69 #   define NODE(ind,tn) ((ind)->indNodePages[(tn)/TNsBLOCK]+((tn)%TNsBLOCK))
70 #   define LINK(ind,tl) ((ind)->indLinkPages[(tl)/TLsBLOCK]+((tl)%TLsBLOCK))
71 
72 /************************************************************************/
73 /*									*/
74 /*  Shift modes for producing spell guesses.				*/
75 /*									*/
76 /************************************************************************/
77 
78 #   define	INDhASIS	1	/*  knudde -> knudde		*/
79 #   define	INDhFIRSTUP	2	/*  Knudde -> knudde		*/
80 #   define	INDhIJUP	3	/*  IJsco -> ijsco		*/
81 #   define	INDhALLUP	4	/*  KNUDDE -> knudde		*/
82 #   define	INDhTAILUP	5	/*  EDAM -> Edam		*/
83 #   define	INDhIJTAILUP	6	/*  IJMUIDEN -> IJmuiden	*/
84 
85 /************************************************************************/
86 /*									*/
87 /*  Routine declarations.						*/
88 /*									*/
89 /************************************************************************/
90 
91 extern IND *	indINDmake( int readOnly );
92 extern IND *	indINDread( const char * filename, int readOnly );
93 
94 extern int indINDputUtf8(	IND *			ind,
95 				int			tn,
96 				const char *		key );
97 
98 extern int indINDputUtf16(	IND *			ind,
99 				int			tn,
100 				const unsigned short *	key );
101 
102 extern int indINDforall(	IND *			ind,
103 				int			tn,
104 				void *			through,
105 				IndForAllFun		fun );
106 
107 extern int	indINDforget(	IND *			ind,
108 				const char *		key );
109 
110 extern void	indINDfree(	IND *			ind );
111 
112 extern int	indINDwrite(	IND *			ind,
113 				const char * 		filename );
114 
115 extern int	indTNmake( IND * ind );
116 extern void	indTNfree( IND * ind, int tn );
117 extern int	indTLalloc( IND * ind, int old, int n );
118 extern void	indTLfree( IND * ind, int tl );
119 extern IND *	indINDmini( IND * ind );
120 extern void	indTLprint( IND *, int );
121 extern void	indTNprint( IND *, int );
122 extern void	indINDprint( IND * );
123 
124 extern void indTLprint2(	IND *	ind,
125 				int	from,
126 				int	upto );
127 
128 extern int indINDgetUtf8(	int *				paccept,
129 				IND *				ind,
130 				int				tn,
131 				const char *			key );
132 
133 extern int indINDgetUtf16(	int *				paccept,
134 				IND *				ind,
135 				int				tn,
136 				const unsigned short *		key );
137 
138 extern int	indINDstep(	int *				pTrans,
139 				IND *				ind,
140 				int				tn,
141 				int				sym );
142 
143 extern int indINDguess(		IND *				ind,
144 				const unsigned short *		ucods,
145 				int				len,
146 				SpellGuessContext *		sgc,
147 				int				how );
148 
149 extern int indWRDget(		IND *			ind,
150 				int *			pWhatWasShifted,
151 				const char *		word,
152 				int			asPrefix );
153 
154 extern int indWRDguess(	IND *				ind,
155 			unsigned short *		ucods,
156 			int				ulen,
157 			SpellGuessContext *		sgc );
158 
159 extern IND *	indINDrenumber( IND * ind );
160 
161 extern void indINDcount( IND *	ind );
162 extern int indITwalk( IND *	ind );
163 extern int indTLwalk( IND *	ind );
164 
165 extern int indShiftWord(	char *				target,
166 				const unsigned short *		ucods,
167 				int				ulen,
168 				int				how );
169 
170 extern int indINDaddSuffix(	IND *		ind,
171 				int		tnTo,
172 				int		tnSuf );
173 
174