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