// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   dictionary.java

package boggle.server;

import boggle.settings;
import java.io.*;

// Referenced classes of package boggle.server:
//            dictionaryException

class dictionary
{

    dictionary(File file)
        throws dictionaryException
    {
        alphaStart = new long[26];
        language = file;
        try
        {
            dictionary = new BufferedReader(new FileReader(language));
        }
        catch(FileNotFoundException _ex)
        {
            panic(1);
        }
        if(dictionary.markSupported())
        {
            try
            {
                dictionary.mark(0x61a80);
            }
            catch(IOException _ex)
            {
                panic(4);
            }
            hardReset = false;
        } else
        {
            hardReset = true;
        }
        findAlphaStart();
    }

    private void findAlphaStart()
        throws dictionaryException
    {
        char c = 'z';
        long l = 0L;
        boolean flag = false;
        for(int i = 0; i < 26;)
        {
            try
            {
                c = (char)dictionary.read();
            }
            catch(IOException _ex)
            {
                panic(3);
            }
            if(c == '[')
                alphaStart[i++] = l;
            l++;
        }

        reset();
    }

    private void reset()
        throws dictionaryException
    {
        if(hardReset)
        {
            hardReset();
            return;
        }
        try
        {
            dictionary.reset();
            return;
        }
        catch(IOException _ex)
        {
            panic(2);
        }
    }

    private void hardReset()
        throws dictionaryException
    {
        try
        {
            dictionary.close();
            dictionary = new BufferedReader(new FileReader(language));
            return;
        }
        catch(Exception _ex)
        {
            panic(2);
        }
    }

    private void findSectionStart(char c)
        throws dictionaryException
    {
        long l = 0L;
        String s = "abcdefghijklmnopqrstuvwxyz";
        try
        {
            l = dictionary.skip(alphaStart[s.indexOf(c)]);
        }
        catch(IOException _ex)
        {
            panic(5);
        }
        if(l != alphaStart[s.indexOf(c)])
        {
            throw new dictionaryException("findSectionStart: can't jump the correct amount!");
        } else
        {
            readWord();
            return;
        }
    }

    public boolean validWord(String s)
        throws dictionaryException
    {
        String s1 = s.toLowerCase();
        findSectionStart(s1.charAt(0));
        String s2;
        do
        {
            s2 = readWord();
            if(s1.equals(s2))
            {
                reset();
                return true;
            }
        } while(s2.charAt(0) != '[');
        reset();
        return false;
    }

    public boolean validStart(String s, int i)
        throws dictionaryException
    {
        String s1 = s.toLowerCase();
        findSectionStart(s1.charAt(0));
        String s2;
        do
        {
            s2 = readWord();
            if(i <= s2.length() && s1.substring(0, i).equals(s2.substring(0, i)))
            {
                reset();
                return true;
            }
        } while(s2.charAt(0) != '[');
        reset();
        return false;
    }

    private String readWord()
        throws dictionaryException
    {
        String s = "";
        try
        {
            s = dictionary.readLine();
        }
        catch(IOException _ex)
        {
            panic(3);
        }
        return s;
    }

    private void panic(int i)
        throws dictionaryException
    {
        String s = "Dictionary.class: IOException in ";
        s = s + language + "\n\t\t";
        if(i == 1)
            s = s + "File Not Found Exception.";
        else
        if(i == 2)
        {
            if(hardReset)
            {
                s = s + "File would not reset.";
            } else
            {
                System.out.println("dictionary: attempting reset recovery");
                hardReset = true;
                hardReset();
                return;
            }
        } else
        if(i == 3)
            s = s + "Could not read character.";
        else
        if(i == 4)
        {
            if(hardReset)
            {
                s = s + "Could not set mark.";
            } else
            {
                hardReset = true;
                hardReset();
                return;
            }
        } else
        if(i == 5)
            s = s + "Could not jump into file.";
        else
            s = s + "Unknown error.";
        throw new dictionaryException(s);
    }

    public static void main(String args[])
        throws dictionaryException
    {
        System.out.println("This is the test function of Dictionary class on " + settings.getLanguages()[0]);
        dictionary dictionary1 = new dictionary(new File(new File(settings.getGameDirectory()), settings.getLanguages()[0]));
        System.out.println("zoo " + dictionary1.validWord("zoo"));
        System.out.println("bill " + dictionary1.validWord("bill"));
        System.out.println("kill " + dictionary1.validWord("kill"));
        System.out.println("balle " + dictionary1.validWord("balle"));
        System.out.println("papa " + dictionary1.validWord("papa"));
        System.out.println("victory " + dictionary1.validWord("victory"));
        System.out.println("xray " + dictionary1.validWord("xray"));
        System.out.println("zulu " + dictionary1.validWord("zulu"));
        System.out.println("End of test case\n");
    }

    private BufferedReader dictionary;
    private long alphaStart[];
    private boolean hardReset;
    private File language;
}
