1with LATIN_FILE_NAMES; use LATIN_FILE_NAMES; 2with STRINGS_PACKAGE; use STRINGS_PACKAGE; 3with CONFIG; 4with PREFACE; 5package body WORD_SUPPORT_PACKAGE is 6 7 8 function LEN(S : STRING) return INTEGER is 9 begin 10 return TRIM(S)'LENGTH; 11 end LEN; 12 13 function EFF_PART(PART : PART_OF_SPEECH_TYPE) return PART_OF_SPEECH_TYPE is 14 begin 15 if PART = VPAR then 16 return V; 17 elsif PART = SUPINE then 18 return V; 19 else 20 return PART; 21 end if; 22 end EFF_PART; 23 24 function ADJ_COMP_FROM_KEY(KEY : STEM_KEY_TYPE) return COMPARISON_TYPE is 25 begin 26 case KEY is 27 when 0 | 1 | 2 => return POS; 28 when 3 => return COMP; 29 when 4 => return SUPER; 30 when others => return X; 31 end case; 32 end ADJ_COMP_FROM_KEY; 33 34 function ADV_COMP_FROM_KEY(KEY : STEM_KEY_TYPE) return COMPARISON_TYPE is 35 begin 36 case KEY is 37 when 1 => return POS; 38 when 2 => return COMP; 39 when 3 => return SUPER; 40 when others => return X; 41 end case; 42 end ADV_COMP_FROM_KEY; 43 44 function NUM_SORT_FROM_KEY(KEY : STEM_KEY_TYPE) return NUMERAL_SORT_TYPE is 45 begin 46 case KEY is 47 when 1 => return CARD; 48 when 2 => return ORD; 49 when 3 => return DIST; 50 when 4 => return ADVERB; 51 when others => return X; 52 end case; 53 end NUM_SORT_FROM_KEY; 54 55 56 function FIRST_INDEX(INPUT_WORD : STRING; 57 D_K : DICTIONARY_FILE_KIND := DEFAULT_DICTIONARY_FILE_KIND) 58 return STEM_IO.COUNT is 59 WD : constant STRING := TRIM(INPUT_WORD); -- string may not start at 1 60 begin 61 if D_K = LOCAL then 62 return DDLF(WD(WD'FIRST), 'a', D_K); 63 elsif WD'LENGTH < 2 then 64 return 0; -- BDLF(WD(WD'FIRST), ' ', D_K); 65 else 66 return DDLF(WD(WD'FIRST), WD(WD'FIRST+1), D_K); 67 end if; 68 end FIRST_INDEX; 69 70 function LAST_INDEX(INPUT_WORD : STRING; 71 D_K : DICTIONARY_FILE_KIND := DEFAULT_DICTIONARY_FILE_KIND) 72 return STEM_IO.COUNT is 73 WD : constant STRING := TRIM(INPUT_WORD); 74 begin -- remember the string may not start at 1 75 if D_K = LOCAL then 76 return DDLL(WD(WD'FIRST), 'a', D_K); 77 elsif WD'LENGTH < 2 then 78 return 0; -- BDLL(WD(WD'FIRST), ' ', D_K); 79 else 80 return DDLL(WD(WD'FIRST), WD(WD'FIRST+1), D_K); 81 end if; 82 end LAST_INDEX; 83 84--procedure PUT_INDICES(CH : STRING; 85-- D_K : DICTIONARY_KIND) is 86-- WD : STRING(1..2) := CH(1..2); 87-- begin 88-- if CH = " " then 89-- if BBLL(CH(1), CH(2), D_K) >= BBLF(CH(1), CH(2), D_K) then 90-- PUT("CH = ("); PUT(CH); PUT(") index is of range "); 91-- PUT(BBLF(CH(1), CH(2), D_K)); PUT(".."); PUT(BBLL(CH(1), CH(2), D_K)); 92-- PUT(" number "); 93-- PUT(BBLL(CH(1), CH(2), D_K) - BBLF(CH(1), CH(2), D_K) + 1); 94-- end if; 95-- elsif CH(2) = ' ' then 96-- if BDLL(CH(1), CH(2), D_K) >= BDLF(CH(1), CH(2), D_K) then 97-- PUT("CH = ("); PUT(CH); PUT(") index is of range "); 98-- PUT(BDLF(CH(1), CH(2), D_K)); PUT(".."); PUT(BDLL(CH(1), CH(2), D_K)); 99-- PUT(" number "); 100-- PUT(BDLL(CH(1), CH(2), D_K) - BDLF(CH(1), CH(2), D_K) + 1); 101-- end if; 102-- else 103-- if LAST_INDEX(WD, D_K) >= FIRST_INDEX(WD, D_K) then 104-- PUT("CH = ("); PUT(WD); PUT(") index is of range "); 105-- PUT(FIRST_INDEX(WD, D_K)); PUT(".."); PUT(LAST_INDEX(WD, D_K)); 106-- PUT(" number "); 107-- PUT(LAST_INDEX(WD, D_K) - FIRST_INDEX(WD, D_K) + 1); 108-- end if; 109-- end if; 110-- NEW_LINE; 111-- end PUT_INDICES; 112 113 114 procedure LOAD_BDL_FROM_DISK is 115 use STEM_IO; 116 DS : DICTIONARY_STEM; 117 INDEX_FIRST, 118 INDEX_LAST : STEM_IO.COUNT := 0; 119 K : INTEGER := 0; 120 begin 121 122--PUT_LINE("LOADING BDL FROM DISK"); 123if DICTIONARY_AVAILABLE(GENERAL) then 124-- The blanks are on the GENERAL dictionary 125 LOADING_BDL_FROM_DISK: 126 declare 127 D_K : DICTIONARY_KIND := GENERAL; 128 begin 129 if not IS_OPEN(STEM_FILE(D_K)) then 130 --TEXT_IO.PUT_LINE("LOADING_BDL is going to OPEN " & 131 --ADD_FILE_NAME_EXTENSION(STEM_FILE_NAME, 132 --DICTIONARY_KIND'IMAGE(D_K))); 133 OPEN(STEM_FILE(D_K), STEM_IO.IN_FILE, 134 ADD_FILE_NAME_EXTENSION(STEM_FILE_NAME, 135 DICTIONARY_KIND'IMAGE(D_K))); 136 --TEXT_IO.PUT_LINE("OPENing was successful"); 137 end if; 138 --TEXT_IO.PUT_LINE("BDL OPEN"); 139 INDEX_FIRST := BBLF(' ', ' ', DICTIONARY_KIND(D_K)); 140 INDEX_LAST := BBLL(' ', ' ', DICTIONARY_KIND(D_K)); 141 142 SET_INDEX(STEM_FILE(D_K), STEM_IO.POSITIVE_COUNT(INDEX_FIRST)); 143 for J in INDEX_FIRST..INDEX_LAST loop 144 READ(STEM_FILE(D_K), DS); 145 K := K + 1; 146 BDL(K) := DS; 147 end loop; 148 CLOSE(STEM_FILE(D_K)); 149--TEXT_IO.PUT_LINE("BDL LOADED FROM DISK K = " & INTEGER'IMAGE(K)); 150 exception 151 when NAME_ERROR => 152 TEXT_IO.PUT_LINE("LOADING BDL FROM DISK had NAME_ERROR on " & 153 ADD_FILE_NAME_EXTENSION(STEM_FILE_NAME, 154 DICTIONARY_KIND'IMAGE(D_K))); 155 TEXT_IO.PUT_LINE("The will be no blank stems loaded"); 156 when USE_ERROR => 157 TEXT_IO.PUT_LINE("LOADING BDL FROM DISK had USE_ERROR on " & 158 ADD_FILE_NAME_EXTENSION(STEM_FILE_NAME, 159 DICTIONARY_KIND'IMAGE(D_K))); 160 TEXT_IO.PUT_LINE("There will be no blank stems loaded"); 161 end LOADING_BDL_FROM_DISK; 162end if; 163 164 -- Now load the stems of just one letter 165 for D_K in GENERAL..DICTIONARY_KIND'LAST loop 166 if DICTIONARY_AVAILABLE(D_K) then 167 exit when D_K = LOCAL; 168--TEXT_IO.PUT_LINE("OPENING BDL STEMFILE " & EXT(D_K)); 169 if not IS_OPEN(STEM_FILE(D_K)) then 170--PUT_LINE("LOADING_BDL is going to OPEN " & 171--ADD_FILE_NAME_EXTENSION(STEM_FILE_NAME, 172--DICTIONARY_KIND'IMAGE(D_K))); 173 OPEN(STEM_FILE(D_K), STEM_IO.IN_FILE, 174 ADD_FILE_NAME_EXTENSION(STEM_FILE_NAME, 175 DICTIONARY_KIND'IMAGE(D_K))); 176--STEMFILE." & EXT(D_K)); 177--PUT_LINE("OPENing was successful"); 178 end if; 179 for I in CHARACTER range 'a'..'z' loop 180 INDEX_FIRST := BDLF(I, ' ', D_K); 181 INDEX_LAST := BDLL(I, ' ', D_K); 182 if INDEX_FIRST > 0 then 183 SET_INDEX(STEM_FILE(D_K), STEM_IO.POSITIVE_COUNT(INDEX_FIRST)); 184 for J in INDEX_FIRST..INDEX_LAST loop 185 READ(STEM_FILE(D_K), DS); 186 K := K + 1; 187 BDL(K) := DS; 188 end loop; 189 end if; 190 end loop; 191--TEXT_IO.PUT_LINE("Single letters LOADED FROM DISK K = " & INTEGER'IMAGE(K)); 192 CLOSE(STEM_FILE(D_K)); 193 end if; 194 195 end loop; 196 BDL_LAST := K; 197 198--TEXT_IO.PUT("FINISHED LOADING BDL FROM DISK BDL_LAST = "); 199--TEXT_IO.PUT(INTEGER'IMAGE(BDL_LAST)); 200--TEXT_IO.NEW_LINE; 201 202 end LOAD_BDL_FROM_DISK; 203 204 205 206 207 procedure LOAD_INDICES_FROM_INDX_FILE(INDXFILE_NAME : STRING; 208 D_K : DICTIONARY_KIND) is 209 use TEXT_IO; 210 use INFLECTIONS_PACKAGE.INTEGER_IO; 211 use STEM_IO; 212 use COUNT_IO; 213 CH : STRING(1..2); 214 M, N : STEM_IO.COUNT; 215 NUMBER_OF_BLANK_STEMS, 216 NUMBER_OF_NON_BLANK_STEMS : STEM_IO.COUNT := 0; 217 S : STRING(1..100) := (others => ' '); 218 LAST, L : INTEGER := 0; 219 220 function MAX(A, B : STEM_IO.COUNT) return STEM_IO.COUNT is 221 begin 222 if A >= B then return A; end if; return B; 223 end MAX; 224 225 begin 226 OPEN(INDX_FILE(D_K), TEXT_IO.IN_FILE, 227 ADD_FILE_NAME_EXTENSION(INDX_FILE_NAME, 228 DICTIONARY_KIND'IMAGE(D_K))); 229 --"INDXFILE." & EXT(D_K)); -- $$$$$$$$$$$$ 230 231 PREFACE.PUT(DICTIONARY_KIND'IMAGE(D_K)); 232 PREFACE.PUT(" Dictionary loading"); 233 234 if D_K = GENERAL then 235 GET_LINE(INDX_FILE(D_K), S, LAST); 236 CH := S(1..2); 237 GET(S(4..LAST), M, L); 238 BBLF(CH(1), CH(2), D_K) := M; 239 GET(S(L+1..LAST), N, L); 240 BBLL(CH(1), CH(2), D_K) := N; 241 NUMBER_OF_BLANK_STEMS := MAX(NUMBER_OF_BLANK_STEMS, N); 242 end if; 243 244 while not END_OF_FILE(INDX_FILE(D_K)) loop 245 GET_LINE(INDX_FILE(D_K), S, LAST); 246 exit when LAST = 0; 247 CH := S(1..2); 248 GET(S(4..LAST), M, L); 249 if CH(2) = ' ' then 250 BDLF(CH(1), CH(2), D_K) := M; 251 else 252 DDLF(CH(1), CH(2), D_K) := M; 253 end if; 254 GET(S(L+1..LAST), N, L); 255 if CH(2) = ' ' then 256 BDLL(CH(1), CH(2), D_K) := N; 257 NUMBER_OF_BLANK_STEMS := MAX(NUMBER_OF_BLANK_STEMS, N); 258 else 259 DDLL(CH(1), CH(2), D_K) := N; 260 NUMBER_OF_NON_BLANK_STEMS := MAX(NUMBER_OF_NON_BLANK_STEMS, N); 261 end if; 262 end loop; 263 CLOSE(INDX_FILE(D_K)); 264 PREFACE.SET_COL(33); PREFACE.PUT("-- "); 265 if not CONFIG.SUPPRESS_PREFACE then 266 PUT(STEM_IO.COUNT((NUMBER_OF_NON_BLANK_STEMS)), 6); 267 end if; -- Kludge for when TEXT_IO.COUNT too small 268 PREFACE.PUT(" stems"); 269 PREFACE.SET_COL(55); PREFACE.PUT_LINE("-- Loaded correctly"); 270 end LOAD_INDICES_FROM_INDX_FILE; 271 272 273end WORD_SUPPORT_PACKAGE; 274