with TEXT_IO; with STRINGS_PACKAGE; use STRINGS_PACKAGE; with INFLECTIONS_PACKAGE; use INFLECTIONS_PACKAGE; with DICTIONARY_PACKAGE; use DICTIONARY_PACKAGE; function DICTIONARY_FORM(DE : DICTIONARY_ENTRY) return STRING is NULL_OX : constant STRING(1..24) := (others => ' '); OX : array (1..4) of STRING (1..24) := (others => NULL_OX); FORM : STRING(1..100) := (others => ' '); FST: array (WHICH_TYPE range 1..5) of STRING(1..3) := ("1st", "2nd", "3rd", "4th", "5th"); NOT_FOUND : exception; function ADD(STEM, INFL : STRING) return STRING is begin return HEAD(TRIM(STEM) & TRIM(INFL), 24); end ADD; procedure ADD_UP(FACTOR : STRING) is begin FORM := HEAD(TRIM(FORM) & TRIM(FACTOR), 100); end ADD_UP; procedure ADD_TO(FACTOR : STRING) is begin FORM := HEAD(TRIM(FORM) & FACTOR, 100); end ADD_TO; begin --DICTIONARY_ENTRY_IO.PUT(DE); -- So I can call with a NULL_DICTIONARY_ENTRY and not bomb if DE = NULL_DICTIONARY_ENTRY then return ""; end if; if (DE.PART.POFS = PREP) then return TRIM(DE.STEMS(1)) & " " & PART_OF_SPEECH_TYPE'IMAGE(DE.PART.POFS) & " " & CASE_TYPE'IMAGE(DE.PART.PREP.OBJ); end if; if DE.STEMS(2) = NULL_STEM_TYPE and DE.STEMS(3) = NULL_STEM_TYPE and DE.STEMS(4) = NULL_STEM_TYPE and not (((DE.PART.POFS = N) and then (DE.PART.N.DECL.WHICH = 9)) or ((DE.PART.POFS = ADJ) and then ((DE.PART.ADJ.DECL.WHICH = 9) or (DE.PART.ADJ.CO = COMP or DE.PART.ADJ.CO = SUPER)) ) or ((DE.PART.POFS = V) and then (DE.PART.V.CON = (9, 8))) or ((DE.PART.POFS = V) and then (DE.PART.V.CON = (9, 9)))) then return TRIM(DE.STEMS(1)) & " " & PART_OF_SPEECH_TYPE'IMAGE(DE.PART.POFS); -- For UNIQUES, CONJ, INTERJ, ... end if; if DE.PART.POFS = N then if DE.PART.N.DECL.WHICH = 1 then if DE.PART.N.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "a"); OX(2) := ADD(DE.STEMS(2), "ae"); elsif DE.PART.N.DECL.VAR = 6 then OX(1) := ADD(DE.STEMS(1), "e"); OX(2) := ADD(DE.STEMS(2), "es"); elsif DE.PART.N.DECL.VAR = 7 then OX(1) := ADD(DE.STEMS(1), "es"); OX(2) := ADD(DE.STEMS(2), "ae"); elsif DE.PART.N.DECL.VAR = 8 then OX(1) := ADD(DE.STEMS(1), "as"); OX(2) := ADD(DE.STEMS(2), "ae"); end if; elsif DE.PART.N.DECL.WHICH = 2 then if DE.PART.N.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "i"); elsif DE.PART.N.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "um"); OX(2) := ADD(DE.STEMS(2), "i"); elsif DE.PART.N.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "i"); elsif DE.PART.N.DECL.VAR = 4 then if DE.PART.N.GENDER = N then OX(1) := ADD(DE.STEMS(1), "um"); else OX(1) := ADD(DE.STEMS(1), "us"); end if; OX(2) := ADD(DE.STEMS(2), "(i)"); elsif DE.PART.N.DECL.VAR = 5 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), ""); elsif DE.PART.N.DECL.VAR = 6 then OX(1) := ADD(DE.STEMS(1), "os"); OX(2) := ADD(DE.STEMS(2), "i"); elsif DE.PART.N.DECL.VAR = 7 then OX(1) := ADD(DE.STEMS(1), "os"); OX(2) := ADD(DE.STEMS(2), "i"); elsif DE.PART.N.DECL.VAR = 8 then OX(1) := ADD(DE.STEMS(1), "on"); OX(2) := ADD(DE.STEMS(2), "i"); elsif DE.PART.N.DECL.VAR = 9 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "i"); end if; elsif DE.PART.N.DECL.WHICH = 3 then OX(1) := ADD(DE.STEMS(1), ""); if (DE.PART.N.DECL.VAR = 7) or (DE.PART.N.DECL.VAR = 9) then OX(2) := ADD(DE.STEMS(2), "os/is"); else OX(2) := ADD(DE.STEMS(2), "is"); end if; elsif DE.PART.N.DECL.WHICH = 4 then if DE.PART.N.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "us"); elsif DE.PART.N.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "u"); OX(2) := ADD(DE.STEMS(2), "us"); elsif DE.PART.N.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "u"); end if; elsif DE.PART.N.DECL.WHICH = 5 then OX(1) := ADD(DE.STEMS(1), "es"); OX(2) := ADD(DE.STEMS(2), "ei"); elsif DE.PART.N.DECL = (9, 8) then OX(1) := ADD(DE.STEMS(1), "."); OX(2) := ADD(NULL_OX, "abb."); elsif DE.PART.N.DECL = (9, 9) then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(NULL_OX, "undeclined"); else raise NOT_FOUND; end if; -- N elsif DE.PART.POFS = PRON then if DE.PART.PRON.DECL.WHICH = 1 then raise NOT_FOUND; elsif DE.PART.PRON.DECL.WHICH = 3 then OX(1) := ADD(DE.STEMS(1), "ic"); OX(2) := ADD(DE.STEMS(1), "aec"); if DE.PART.PRON.DECL.VAR = 1 then OX(3) := ADD(DE.STEMS(1), "oc"); elsif DE.PART.PRON.DECL.VAR = 2 then OX(3) := ADD(DE.STEMS(1), "uc"); end if; elsif DE.PART.PRON.DECL.WHICH = 4 then if DE.PART.PRON.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "s"); OX(2) := ADD(DE.STEMS(2), "a"); OX(3) := ADD(DE.STEMS(1), "d"); elsif DE.PART.PRON.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "dem"); OX(2) := ADD(DE.STEMS(2), "adem"); OX(3) := ADD(DE.STEMS(1), "dem"); end if; elsif DE.PART.PRON.DECL.WHICH = 6 then OX(1) := ADD(DE.STEMS(1), "e"); OX(2) := ADD(DE.STEMS(1), "a"); if DE.PART.PRON.DECL.VAR = 1 then OX(3) := ADD(DE.STEMS(1), "ud"); elsif DE.PART.PRON.DECL.VAR = 2 then OX(3) := ADD(DE.STEMS(1), "um"); end if; elsif DE.PART.ADJ.DECL = (9, 8) then OX(1) := ADD(DE.STEMS(1), "."); OX(2) := ADD(NULL_OX, "abb."); elsif DE.PART.PRON.DECL = (9, 9) then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(NULL_OX, "undeclined"); else raise NOT_FOUND; end if; -- PRON elsif DE.PART.POFS = ADJ then --TEXT_IO.NEW_LINE; --DICTIONARY_ENTRY_IO.PUT(DE); --TEXT_IO.NEW_LINE; if DE.PART.ADJ.CO = COMP then OX(1) := ADD(DE.STEMS(1), "or"); OX(2) := ADD(DE.STEMS(1), "or"); OX(3) := ADD(DE.STEMS(1), "us"); elsif DE.PART.ADJ.CO = SUPER then OX(1) := ADD(DE.STEMS(1), "mus"); OX(2) := ADD(DE.STEMS(1), "ma"); OX(3) := ADD(DE.STEMS(1), "mum"); elsif DE.PART.ADJ.CO = POS then if DE.PART.ADJ.DECL.WHICH = 1 then if DE.PART.ADJ.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "a"); OX(3) := ADD(DE.STEMS(2), "um"); elsif DE.PART.ADJ.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "a"); OX(3) := ADD(DE.STEMS(2), "um"); elsif DE.PART.ADJ.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "a"); OX(3) := ADD(DE.STEMS(2), "um (gen -ius)"); elsif DE.PART.ADJ.DECL.VAR = 4 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "a"); OX(3) := ADD(DE.STEMS(2), "um"); elsif DE.PART.ADJ.DECL.VAR = 5 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "a"); OX(3) := ADD(DE.STEMS(2), "ud"); else raise NOT_FOUND; end if; elsif DE.PART.ADJ.DECL.WHICH = 2 then if DE.PART.ADJ.DECL.VAR = 1 then OX(1) := ADD(NULL_OX, "-"); OX(2) := ADD(DE.STEMS(1), "e"); OX(3) := ADD(NULL_OX, "-"); elsif DE.PART.ADJ.DECL.VAR = 2 then OX(1) := ADD(NULL_OX, "-"); OX(2) := ADD(NULL_OX, "a"); OX(3) := ADD(NULL_OX, "-"); elsif DE.PART.ADJ.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), "es"); OX(2) := ADD(DE.STEMS(1), "es"); OX(3) := ADD(DE.STEMS(1), "es"); elsif DE.PART.ADJ.DECL.VAR = 6 then OX(1) := ADD(DE.STEMS(1), "os"); OX(2) := ADD(DE.STEMS(1), "os"); OX(3) := ADD(NULL_OX, "-"); elsif DE.PART.ADJ.DECL.VAR = 7 then OX(1) := ADD(DE.STEMS(1), "os"); OX(2) := ADD(NULL_OX, "-"); OX(3) := ADD(NULL_OX, "-"); elsif DE.PART.ADJ.DECL.VAR = 8 then OX(1) := ADD(NULL_OX, "-"); OX(2) := ADD(NULL_OX, "-"); OX(3) := ADD(DE.STEMS(2), "on"); end if; elsif DE.PART.ADJ.DECL.WHICH = 3 then if DE.PART.ADJ.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(NULL_OX, "(gen.)"); OX(3) := ADD(DE.STEMS(2), "is"); elsif DE.PART.ADJ.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "is"); OX(2) := ADD(DE.STEMS(2), "is"); OX(3) := ADD(DE.STEMS(2), "e"); elsif DE.PART.ADJ.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "is"); OX(3) := ADD(DE.STEMS(2), "e"); elsif DE.PART.ADJ.DECL.VAR = 6 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(NULL_OX, "(gen.)"); OX(3) := ADD(DE.STEMS(2), "os"); end if; elsif DE.PART.ADJ.DECL = (9, 8) then OX(1) := ADD(DE.STEMS(1), "."); OX(2) := ADD(NULL_OX, "abb."); elsif DE.PART.ADJ.DECL = (9, 9) then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(NULL_OX, "undeclined"); else raise NOT_FOUND; end if; elsif DE.PART.ADJ.CO = X then if DE.PART.ADJ.DECL.WHICH = 1 then if DE.PART.ADJ.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(2), "a -um"); OX(3) := ADD(DE.STEMS(3), "or -or -us"); OX(4) := ADD(DE.STEMS(4), "mus -a -um"); elsif DE.PART.ADJ.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "a -um"); OX(3) := ADD(DE.STEMS(3), "or -or -us"); OX(4) := ADD(DE.STEMS(4), "mus -a -um"); end if; elsif DE.PART.ADJ.DECL.WHICH = 3 then if DE.PART.ADJ.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "is (gen.)"); OX(3) := ADD(DE.STEMS(3), "or -or -us"); OX(4) := ADD(DE.STEMS(4), "mus -a -um"); elsif DE.PART.ADJ.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "is"); OX(2) := ADD(DE.STEMS(2), "e"); OX(3) := ADD(DE.STEMS(3), "or -or -us"); OX(4) := ADD(DE.STEMS(4), "mus -a -um"); elsif DE.PART.ADJ.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "is -e"); OX(3) := ADD(DE.STEMS(3), "or -or -us"); OX(4) := ADD(DE.STEMS(4), "mus -a -um"); end if; elsif DE.PART.ADJ.DECL.WHICH = 9 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(NULL_OX, "undeclined"); OX(3) := ADD(DE.STEMS(3), "or -or -us"); OX(4) := ADD(DE.STEMS(4), "mus -a -um"); else raise NOT_FOUND; end if; else raise NOT_FOUND; end if; elsif (DE.PART.POFS = ADV) and then (DE.PART.ADV.CO = X) then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), ""); OX(3) := ADD(DE.STEMS(3), ""); elsif DE.PART.POFS = V then if DE.PART.V.KIND = DEP then -- all DEP OX(3) := ADD(NULL_OX, "DEP"); -- Flag for later use OX(4) := ADD(DE.STEMS(4), "us sum"); if DE.PART.V.CON.WHICH = 1 then OX(1) := ADD(DE.STEMS(1), "or"); OX(2) := ADD(DE.STEMS(2), "ari"); elsif DE.PART.V.CON.WHICH = 2 then OX(1) := ADD(DE.STEMS(1), "eor"); OX(2) := ADD(DE.STEMS(2), "eri"); elsif DE.PART.V.CON.WHICH = 3 then OX(1) := ADD(DE.STEMS(1), "or"); -- Would be wrong for 3 3, but no 3 3 DEP if DE.PART.V.CON.VAR = 4 then OX(2) := ADD(DE.STEMS(2), "iri"); else OX(2) := ADD(DE.STEMS(2), "i"); end if; -- elsif DE.PART.V.CON.WHICH = 4 then -- 4th amy be 3,4 or 4,1 -- OX(1) := ADD(DE.STEMS(1), "or"); -- depending on where in code -- OX(2) := ADD(DE.STEMS(2), "iri"); -- In practice there is no problem else raise NOT_FOUND; end if; -- all DEP handled elsif DE.PART.V.KIND = PERFDEF then -- all PERFDEF handled OX(1) := ADD(DE.STEMS(3), "i"); OX(2) := ADD(DE.STEMS(3), "isse"); OX(3) := ADD(DE.STEMS(4), "us"); OX(4) := NULL_OX; -- Flag for later use elsif DE.PART.V.KIND = IMPERS and then ((DE.STEMS(1)(1..3) = "zzz") and -- Recognize as PERFDEF IMPERS (DE.STEMS(2)(1..3) = "zzz")) then OX(1) := ADD(DE.STEMS(3), "it"); OX(2) := ADD(DE.STEMS(3), "isse"); OX(3) := ADD(DE.STEMS(4), "us est"); -- OX(4) := ADD(NULL_OX, "PERFDEF"); else -- Not DEP/PERFDEF/IMPERS if DE.PART.V.KIND = IMPERS then if DE.PART.V.CON.WHICH = 1 then OX(1) := ADD(DE.STEMS(1), "at"); elsif DE.PART.V.CON.WHICH = 2 then OX(1) := ADD(DE.STEMS(1), "et"); elsif DE.PART.V.CON.WHICH = 3 then if DE.PART.V.CON.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "t"); else if DE.STEMS(1)(TRIM(DE.STEMS(1))'LAST) = 'i' then OX(1) := ADD(DE.STEMS(1), "t"); else OX(1) := ADD(DE.STEMS(1), "it"); end if; end if; elsif DE.PART.V.CON.WHICH = 5 then if DE.PART.V.CON.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "est"); end if; elsif DE.PART.V.CON.WHICH = 7 then if DE.PART.V.CON.VAR = 1 or DE.PART.V.CON.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "t"); end if; end if; else -- OX 1 if DE.PART.V.CON.WHICH = 2 then OX(1) := ADD(DE.STEMS(1), "eo"); elsif DE.PART.V.CON.WHICH = 5 then OX(1) := ADD(DE.STEMS(1), "um"); elsif DE.PART.V.CON = (7, 2) then OX(1) := ADD(DE.STEMS(1), "am"); else OX(1) := ADD(DE.STEMS(1), "o"); end if; -- /= IMPERS handled --end if; -- OX(1) handled end if; -- OX 2 if DE.PART.V.CON.WHICH = 1 then OX(2) := ADD(DE.STEMS(2), "are"); elsif DE.PART.V.CON.WHICH = 2 then OX(2) := ADD(DE.STEMS(2), "ere"); elsif DE.PART.V.CON.WHICH = 3 then if DE.PART.V.CON.VAR = 2 then OX(2) := ADD(DE.STEMS(2), "re"); elsif DE.PART.V.CON.VAR = 3 then OX(2) := ADD(DE.STEMS(2), "eri"); elsif DE.PART.V.CON.VAR = 4 then OX(2) := ADD(DE.STEMS(2), "ire"); else OX(2) := ADD(DE.STEMS(2), "ere"); end if; -- elsif DE.PART.V.CON.WHICH = 4 then -- OX(2) := ADD(DE.STEMS(2), "ire"); elsif DE.PART.V.CON.WHICH = 5 then if DE.PART.V.CON.VAR = 1 then OX(2) := ADD(DE.STEMS(2), "esse"); elsif DE.PART.V.CON.VAR = 2 then OX(2) := ADD(DE.STEMS(1), "e"); -- tricky, but it is 1 end if; elsif DE.PART.V.CON.WHICH = 6 then if DE.PART.V.CON.VAR = 1 then OX(2) := ADD(DE.STEMS(2), "re"); elsif DE.PART.V.CON.VAR = 2 then OX(2) := ADD(DE.STEMS(2), "le"); end if; elsif DE.PART.V.CON.WHICH = 7 then if DE.PART.V.CON.VAR = 3 then OX(2) := ADD(DE.STEMS(2), "se"); end if; elsif DE.PART.V.CON.WHICH = 8 then if DE.PART.V.CON.VAR = 1 then OX(2) := ADD(DE.STEMS(2), "are"); elsif DE.PART.V.CON.VAR = 2 then OX(2) := ADD(DE.STEMS(2), "ere"); elsif DE.PART.V.CON.VAR = 3 then OX(2) := ADD(DE.STEMS(2), "ere"); elsif DE.PART.V.CON.VAR = 4 then OX(2) := ADD(DE.STEMS(2), "ire"); else OX(2) := ADD(DE.STEMS(2), "ere"); end if; elsif DE.PART.V.CON = (9, 8) then OX(1) := ADD(DE.STEMS(1), "."); OX(2) := ADD(NULL_OX, "abb."); elsif DE.PART.V.CON = (9, 9) then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(NULL_OX, "undeclined"); end if; -- OX(2) handled -- OX 3 & 4 if DE.PART.V.KIND = IMPERS then if (OX(3)(1..7) /= "PERFDEF") then OX(3) := ADD(DE.STEMS(3), "it"); end if; OX(4) := ADD(DE.STEMS(4), "us est"); elsif DE.PART.V.KIND = SEMIDEP then -- Finalization correction OX(4) := ADD(DE.STEMS(4), "us sum"); elsif DE.PART.V.CON = (5, 1) then OX(3) := ADD(DE.STEMS(3), "i"); OX(4) := ADD(DE.STEMS(4), "urus"); elsif DE.PART.V.CON.WHICH = 8 then OX(3) := ADD("", "additional"); OX(4) := ADD("", "forms"); elsif DE.PART.V.CON.WHICH = 9 then OX(3) := ADD(NULL_OX, "BLANK"); -- Flag for later use OX(4) := ADD(NULL_OX, "BLANK"); -- Flag for later use else OX(3) := ADD(DE.STEMS(3), "i"); OX(4) := ADD(DE.STEMS(4), "us"); end if; -- OX(3 & 4) handled end if; -- On V KIND if DE.PART.V.CON = (6, 1) then -- Finalization correction OX(3) := ADD(OX(3), " (ii)"); end if; elsif (DE.PART.POFS = NUM) and then (DE.PART.NUM.SORT = X) then if DE.PART.NUM.DECL.WHICH = 1 then if DE.PART.NUM.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "us -a -um"); OX(2) := ADD(DE.STEMS(2), "us -a -um"); OX(3) := ADD(DE.STEMS(3), "i -ae -a"); OX(4) := ADD(DE.STEMS(4), ""); elsif DE.PART.NUM.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "o -ae o"); OX(2) := ADD(DE.STEMS(2), "us -a -um"); OX(3) := ADD(DE.STEMS(3), "i -ae -a"); OX(4) := ADD(DE.STEMS(4), ""); elsif DE.PART.NUM.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), "es -es -ia"); OX(2) := ADD(DE.STEMS(2), "us -a -um"); OX(3) := ADD(DE.STEMS(3), "i -ae -a"); OX(4) := ADD(DE.STEMS(4), ""); elsif DE.PART.NUM.DECL.VAR = 4 then OX(1) := ADD(DE.STEMS(1), "i -ae -a"); OX(2) := ADD(DE.STEMS(2), "us -a -um"); OX(3) := ADD(DE.STEMS(3), "i -ae -a"); OX(4) := ADD(DE.STEMS(4), "ie(n)s"); end if; elsif DE.PART.NUM.DECL.WHICH = 2 then OX(1) := ADD(DE.STEMS(1), ""); OX(2) := ADD(DE.STEMS(2), "us -a -um"); OX(3) := ADD(DE.STEMS(3), "i -ae -a"); OX(4) := ADD(DE.STEMS(4), "ie(n)s"); end if; elsif (DE.PART.POFS = NUM) and then (DE.PART.NUM.SORT = CARD) then if DE.PART.NUM.DECL.WHICH = 1 then if DE.PART.NUM.DECL.VAR = 1 then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(1), "a"); OX(3) := ADD(DE.STEMS(1), "um"); elsif DE.PART.NUM.DECL.VAR = 2 then OX(1) := ADD(DE.STEMS(1), "o"); OX(2) := ADD(DE.STEMS(1), "ae"); OX(3) := ADD(DE.STEMS(1), "o"); elsif DE.PART.NUM.DECL.VAR = 3 then OX(1) := ADD(DE.STEMS(1), "es"); OX(2) := ADD(DE.STEMS(1), "es"); OX(3) := ADD(DE.STEMS(1), "ia"); elsif DE.PART.NUM.DECL.VAR = 4 then OX(1) := ADD(DE.STEMS(1), "i"); OX(2) := ADD(DE.STEMS(1), "ae"); OX(3) := ADD(DE.STEMS(1), "a"); end if; elsif DE.PART.NUM.DECL.WHICH = 2 then OX(1) := ADD(DE.STEMS(1), ""); end if; elsif (DE.PART.POFS = NUM) and then (DE.PART.NUM.SORT = ORD) then OX(1) := ADD(DE.STEMS(1), "us"); OX(2) := ADD(DE.STEMS(1), "a"); OX(3) := ADD(DE.STEMS(1), "um"); elsif (DE.PART.POFS = NUM) and then (DE.PART.NUM.SORT = DIST) then OX(1) := ADD(DE.STEMS(1), "i"); OX(2) := ADD(DE.STEMS(1), "ae"); OX(3) := ADD(DE.STEMS(1), "a"); else OX(1) := ADD(DE.STEMS(1), ""); end if; -- On PART --TEXT_IO.PUT_LINE(OX(1) & "+" & OX(2) & "+" & OX(3) & "+" & OX(4)); -- Now clean up and output -- Several flags have been set which modify OX's if OX(1)(1..3) = "zzz" then ADD_UP(" - "); elsif OX(1) /= NULL_OX then ADD_UP(TRIM(OX(1))); end if; if OX(2)(1..3) = "zzz" then ADD_UP(", - "); elsif OX(2) /= NULL_OX then ADD_UP(", " & TRIM(OX(2))); end if; if OX(3)(1..3) = "zzz" then ADD_UP(", - "); elsif OX(3)(1..3) = "DEP" then null; elsif OX(3)(1..7) = "PERFDEF" then null; elsif OX(3)(1..5) = "BLANK" then null; elsif OX(3) /= NULL_OX then ADD_UP(", " & TRIM(OX(3))); end if; if OX(4)(1..3) = "zzz" then ADD_UP(", - "); elsif OX(4)(1..5) = "BLANK" then null; elsif OX(4) /= NULL_OX then ADD_UP(", " & TRIM(OX(4))); end if; ADD_TO(" " & PART_OF_SPEECH_TYPE'IMAGE(DE.PART.POFS)& " "); if DE.PART.POFS = N then -- For DICTPAGE if DE.PART.N.DECL.WHICH in 1..5 and DE.PART.N.DECL.VAR in 1..5 then ADD_TO(" (" & FST(DE.PART.N.DECL.WHICH) & ")"); end if; ADD_TO(" " & GENDER_TYPE'IMAGE(DE.PART.N.GENDER) & " "); end if; if (DE.PART.POFS = V) then -- For DICTPAGE if DE.PART.V.CON.WHICH in 1..3 then if DE.PART.V.CON.VAR = 1 then ADD_TO(" (" & FST(DE.PART.V.CON.WHICH) & ")"); elsif DE.PART.V.CON = (3, 4) then ADD_TO(" (" & FST(4) & ")"); end if; end if; if (DE.PART.V.KIND in GEN..PERFDEF) then ADD_TO(" " & VERB_KIND_TYPE'IMAGE(DE.PART.V.KIND) & " "); end if; end if; --TEXT_IO.PUT_LINE(">>>>" & TRIM(FORM)); return TRIM(FORM); exception when NOT_FOUND => return ""; when others => return ""; end DICTIONARY_FORM;