// 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:   WordBank.java

import java.io.*;
import java.util.StringTokenizer;
import java.util.Vector;

public class WordBank
    implements Serializable
{

    public WordBank(int i)
    {
        tree = new WordTreeNode();
        maxlen = 8;
        for(int j = 0; j < 27; j++)
            tree.branch[j] = null;

        maxlen = i;
    }

    public WordBank()
    {
        this(6);
    }

    public boolean add(String s)
    {
        s = stripEnds(s.toUpperCase());
        if(!isAllLetters(s))
            return false;
        if(s.length() > maxlen)
            return false;
        s = reduceQU(s);
        char ac[] = s.toCharArray();
        WordTreeNode wordtreenode = tree;
        boolean flag = false;
        for(int j = 0; j < ac.length; j++)
        {
            int i = ac[j] - 64;
            if(wordtreenode.branch[i] == null)
                wordtreenode.branch[i] = new WordTreeNode();
            wordtreenode = wordtreenode.branch[i];
        }

        if(wordtreenode.branch[0] == null)
        {
            wordtreenode.branch[0] = new WordTreeNode();
            wordnum++;
        }
        return true;
    }

    public void remove(String s)
    {
        s = stripEnds(s.toUpperCase());
        if(!isAllLetters(s))
            return;
        if(s.length() > maxlen)
        {
            return;
        } else
        {
            s = reduceQU(s);
            char ac[] = s.toCharArray();
            backRecursiveRemove(ac, 0, tree);
            return;
        }
    }

    public boolean exists(String s)
    {
        s = stripEnds(s.toUpperCase());
        if(!isAllLetters(s))
            return false;
        if(s.length() > maxlen)
            return false;
        s = reduceQU(s);
        boolean flag = false;
        WordTreeNode wordtreenode = tree;
        char ac[] = s.toCharArray();
        for(int j = 0; j < ac.length; j++)
        {
            int i = ac[j] - 64;
            if(i > 26 || i < 1)
                return false;
            if(wordtreenode.branch[i] == null)
                return false;
            wordtreenode = wordtreenode.branch[i];
        }

        return wordtreenode.branch[0] != null;
    }

    public Vector makeList(String s)
    {
        s = stripEnds(s.toUpperCase());
        if(s.length() > maxlen)
            return new Vector();
        char ac[] = s.toCharArray();
        WordTreeNode wordtreenode = tree;
        boolean flag = false;
        for(int j = 0; j < ac.length; j++)
        {
            int i = ac[j] - 64;
            if(i > 26 || i < 1)
                return new Vector();
            if(wordtreenode.branch[i] == null)
                return new Vector();
            wordtreenode = wordtreenode.branch[i];
        }

        Vector vector = new Vector();
        words(s, wordtreenode, vector);
        return vector;
    }

    public Vector makeList()
    {
        Vector vector = new Vector();
        words("", tree, vector);
        return vector;
    }

    public int size()
    {
        return wordnum;
    }

    public int getMaxLength()
    {
        return maxlen;
    }

    public WordTreeNode getTree()
    {
        return tree;
    }

    public void save(String s)
        throws IOException
    {
        if(!s.endsWith(".bank"))
            s = s + ".bank";
        PrintWriter printwriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(s))));
        printwriter.print("# WordBank file - a DFS stream of Trie\n");
        printwriter.print(maxlen + "\n");
        trieDFSStreamOut(tree, printwriter);
        printwriter.flush();
        printwriter.close();
        printwriter = null;
        System.gc();
    }

    public synchronized void load(String s)
        throws FileNotFoundException, IOException
    {
        wordnum = 0;
        File file = new File(s);
        int i = (int)file.length();
        BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        String s1 = bufferedreader.readLine();
        i -= s1.length() + 1;
        s1 = bufferedreader.readLine();
        i -= s1.length() + 1;
        maxlen = Integer.parseInt(s1);
        stream = new char[i];
        int j = 0;
        int k = 0;
        for(; j < i; j += k)
        {
            k += bufferedreader.read(stream, j, i - j);
            if(k == -1)
                break;
        }

        bufferedreader.close();
        bufferedreader = null;
        System.gc();
        trieDFSStreamIn(tree);
        stream = null;
        System.gc();
    }

    public void saveWords(String s, String s1)
        throws IOException
    {
        if(!s1.endsWith(".list"))
            s1 = s1 + ".list";
        s = stripEnds(s.toUpperCase());
        s = reduceQU(s);
        char ac[] = s.toCharArray();
        WordTreeNode wordtreenode = tree;
        boolean flag = false;
        for(int j = 0; j < ac.length; j++)
        {
            int i = ac[j] - 64;
            if(i > 26 || i < 1)
                return;
            if(wordtreenode.branch[i] == null)
                return;
            wordtreenode = wordtreenode.branch[i];
        }

        Vector vector = new Vector();
        words(s, wordtreenode, vector);
        PrintWriter printwriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(s1))));
        String s2 = "";
        int k = vector.size();
        for(int l = 0; l < k; l++)
        {
            s2 = s2 + (String)vector.elementAt(l) + " ";
            if(l % 5 == 0 || l - 1 == k)
            {
                printwriter.println(s2);
                s2 = "";
            }
        }

        printwriter.flush();
        printwriter.close();
        printwriter = null;
        vector = null;
        System.gc();
    }

    public void saveWords(String s)
        throws IOException
    {
        saveWords("", s);
    }

    public void loadWords(String s)
        throws FileNotFoundException, IOException
    {
        BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(new FileInputStream(s)));
        String s1 = "";
        Object obj = null;
        Object obj2 = null;
        while(s1 != null) 
        {
            s1 = bufferedreader.readLine();
            if(s1 != null)
            {
                String s2;
                for(StringTokenizer stringtokenizer = new StringTokenizer(s1); stringtokenizer.hasMoreTokens(); add(s2))
                    s2 = stringtokenizer.nextToken();

                Object obj1 = null;
                Object obj3 = null;
            }
        }
        bufferedreader.close();
        bufferedreader = null;
        System.gc();
    }

    public static void main(String args[])
    {
        String s = null;
        String s1 = null;
        String s2 = null;
        String s3 = null;
        int i = 6;
        int j = 0;
        int k = 0;
        int l = 0;
        if(args.length < 1)
        {
            System.out.println("Usage:\njava\t-DDBANK=<destination .bank>\n\t-DSBANK=<source .bank>\n\t-DDLIST=<destination .list>\n\t-DMAXLEN=<max length of words allowed>\n\tWordBank <file(s) to be included>\n");
            System.exit(0);
        }
        s = System.getProperty("DBANK");
        s1 = System.getProperty("SBANK");
        s2 = System.getProperty("DLIST");
        s3 = System.getProperty("MAXLEN");
        if(s == null)
            s = "default.bank";
        if(!s.endsWith(".bank"))
            s = s + ".bank";
        if(s1 != null && !s1.endsWith(".bank"))
            s1 = s1 + ".bank";
        if(s2 != null && !s2.endsWith(".list"))
            s2 = s2 + ".list";
        if(s3 != null)
            i = Integer.parseInt(s3);
        System.out.println("- - - - - - - - - - - - - - - - - - - - - - ");
        System.out.println("\n\nWordBank Document Inclusion");
        System.out.println("by JunoWhoIM@aol.com, 1998.05.27");
        WordBank wordbank = null;
        if(s1 == null)
        {
            System.out.println("\nCreating new word bank " + s + " with " + i + "-letter word capacity");
            wordbank = new WordBank(i);
        } else
        {
            wordbank = new WordBank();
            try
            {
                System.out.println("\nLoading up existing word bank " + s1 + "... (could take some time)");
                wordbank.load(s1);
            }
            catch(Exception exception)
            {
                System.out.println("Error while trying to load " + s1 + "! Exiting...");
                exception.printStackTrace();
                System.exit(0);
            }
        }
        j = wordbank.size();
        System.out.println("\nInitial word bank contains " + j + " words");
        l = j;
        for(int i1 = 0; i1 < args.length; i1++)
        {
            System.out.print("Including words from document " + args[i1] + " ... ");
            try
            {
                wordbank.loadWords(args[i1]);
            }
            catch(Exception _ex)
            {
                System.out.println("Error while loading " + args[i1] + "!");
            }
            k = wordbank.size();
            System.out.println((k - l) + " words added.\nTotal words: " + k + "\n");
            l = k;
        }

        System.out.println("Finished including documents.\n" + (k - j) + " words were added.\n");
        System.out.println("Saving word bank " + s);
        try
        {
            wordbank.save(s);
        }
        catch(IOException _ex)
        {
            System.out.println("Error while saving " + s + "\nExiting...");
            System.exit(0);
        }
        if(s2 != null)
        {
            System.out.println("Saving word list " + s2);
            try
            {
                wordbank.saveWords(s2);
            }
            catch(Exception _ex)
            {
                System.out.println("Error while saving " + s2 + "\nExiting...");
                System.exit(0);
            }
        }
        System.out.println("\n\nDONE!\n");
    }

    private String stripEnds(String s)
    {
        char ac[] = s.toCharArray();
        int i = 0;
        int j;
        for(j = ac.length; i < j; i++)
            if(Character.isLetterOrDigit(ac[i]))
                break;

        for(; j > i; j--)
            if(Character.isLetterOrDigit(ac[j - 1]))
                break;

        if(i == j)
            return "";
        else
            return s;
    }

    private String reduceQU(String s)
    {
        char ac[] = s.toCharArray();
        s = "";
        for(int i = 0; i < ac.length; i++)
        {
            s = s + "" + ac[i];
            if(ac[i] == 'Q' && i + 1 < ac.length && ac[i + 1] == 'U')
                i++;
        }

        return s;
    }

    private boolean isAllLetters(String s)
    {
        if(s == null || s.length() < 1)
            return false;
        char ac[] = s.toCharArray();
        for(int i = 0; i < ac.length; i++)
            if(!Character.isLetter(ac[i]))
                return false;

        return true;
    }

    private boolean backRecursiveRemove(char ac[], int i, WordTreeNode wordtreenode)
    {
        int j = 0;
        j = ac[i] - 64;
        WordTreeNode wordtreenode1 = wordtreenode.branch[j];
        if(wordtreenode1 == null)
            return true;
        boolean flag = true;
        if(i + 1 != ac.length)
        {
            flag = backRecursiveRemove(ac, i + 1, wordtreenode1);
        } else
        {
            if(wordtreenode1.branch[0] != null)
            {
                wordtreenode1.branch[0] = null;
                wordnum--;
            }
            for(int k = 1; k < 27; k++)
            {
                if(wordtreenode1.branch[k] == null)
                    continue;
                flag = false;
                break;
            }

        }
        if(flag)
        {
            if(i == 0)
                return false;
            wordtreenode.branch[j] = null;
            for(int l = 0; l < 27; l++)
            {
                if(wordtreenode.branch[l] == null)
                    continue;
                flag = false;
                break;
            }

        }
        return flag;
    }

    private void trieDFSStreamOut(WordTreeNode wordtreenode, PrintWriter printwriter)
        throws IOException
    {
        for(int i = 0; i < 27; i++)
            if(wordtreenode.branch[i] != null)
            {
                printwriter.print((char)(i + 64));
                trieDFSStreamOut(wordtreenode.branch[i], printwriter);
            }

        printwriter.print('-');
    }

    private void trieDFSStreamIn(WordTreeNode wordtreenode)
        throws IOException
    {
        if(streamidx >= stream.length)
            return;
        for(int i = stream[streamidx]; (char)i != '-'; i = stream[streamidx])
        {
            if((i -= 64) == 0)
                wordnum++;
            wordtreenode.branch[i] = new WordTreeNode();
            streamidx++;
            trieDFSStreamIn(wordtreenode.branch[i]);
            streamidx++;
            if(streamidx >= stream.length)
                return;
        }

    }

    private void words(String s, WordTreeNode wordtreenode, Vector vector)
    {
        String s1 = "";
        if(wordtreenode.branch[0] != null)
        {
            char ac[] = s.toCharArray();
            for(int i = 0; i < ac.length; i++)
                if(ac[i] == 'Q')
                    s1 = s1 + "QU";
                else
                    s1 = s1 + "" + ac[i];

            vector.addElement(s1);
        }
        for(int j = 1; j < 27; j++)
            if(wordtreenode.branch[j] != null)
            {
                char c = (char)(j + 64);
                String s2 = s + c;
                words(s2, wordtreenode.branch[j], vector);
            }

    }

    WordTreeNode tree;
    int wordnum;
    int maxlen;
    char stream[];
    int streamidx;
}
