with ada.text_io; use ada.text_io; 
with ada.integer_text_io; use ada.integer_text_io; 
 
-- Print list of unique words and their frequencies
-- A word is a line of data
procedure wf is
    MaxWordLen: Constant Natural := 80;
    MaxWordCount: Constant Natural := 1000;
 
    type word is record
        letters: String(1..MaxWordLen);
        len: Natural := 0;
        freq: Natural := 0;
    end record;
 
    type WordArray is array(Natural range <>) of Word;
 
    type WordList is record
        theWords: WordArray(1..MaxWordCount);
        size: Natural := 0;
    end record;

    -- Define equality for words
    function "="(left, right: word) return boolean is
    begin
        return left.letters(1 .. left.len) = right.letters(1 .. right.len);
    end "=";

    -- Process a word by counting it or adding it to the array
    procedure processWord(w: in word; l: in out wordlist) is
        found: boolean := false;
        location: Natural;
        -- tempword: Word;
    begin
        for i in 1 .. l.size loop
            -- if "="(l.theWords(i), w) then  -- prefix
            -- if l.theWords(i)(1..l.thewords(i).len) = w(1..w.len) then

            if l.theWords(i) = w then      -- infix
                found := true;
                location := i;
            end if;
        end loop;
        if found then 
            -- tempword := l.thewords(i);
            -- tempword.freq := tempword.freq + 1;
            -- l.thewords(i) := tempword;

            l.thewords(location).freq := l.thewords(location).freq + 1;
        else
            -- put(l.size);-- We don't need this anymore
            l.size := l.size + 1;
            l.thewords(l.size) := w;
            l.thewords(l.size).freq := 1;
        end if;
            
    end processWord;

 
    -- Input and count all of the words
    procedure getwords(l: out wordlist) is
        w: Word;
    begin
        -- i := 0; -- We don't need this any more
        loop
            exit when end_of_file;
            get_line(w.letters, w.len);
            -- exit when w.len = 0;  -- This was a mistake

            processWord(w, l);

            -- From the earlier version:
            -- i := i + 1;
            -- l.thewords(i) := w;
        end loop;
        -- l.size := i; -- This caused the error
    end getwords;
 
    procedure putwordsandfreq(l: wordlist) is
        w: Word;
    begin
        -- put(l.size);-- We don't need this any more
        for i in 1 .. l.size loop
            w := l.thewords(i);
            put(w.letters(1 .. w.len));
            put(w.freq);
            new_line;
        end loop;
    end putwordsandfreq;
    l: wordlist;
begin
    getwords(l);
    -- put(l.size);-- We don't need this anymore
    putwordsandfreq(l);
end wf;