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