public static Highscore[] load (InputStream in)
                                                   throws IOException {
        Vector highscores = new Vector(20, 40);
        InputStreamReader inr = new InputStreamReader(in);
        String line;
        while ((line = jgame.impl.EngineLogic.readline(inr)) != null) {
            Vector fields = new Vector(5, 10);
            // XXX we use "`" to represent empty string because
            // StringTokenizer skips empty tokens
            Vector tokens = jgame.impl.EngineLogic.tokenizeString(line, '\t');
            // StringTokenizer toker = new StringTokenizer(line,"\t");
            for (Enumeration e = tokens.elements(); e.hasMoreElements();) {
                String tok = (String) e.nextElement();
                if (tok.equals("`")) tok = "";
                fields.addElement(tok);
            }
            Highscore hs = null;
            if (fields.size() == 1) {
                // we assume we have a highscore with no fields and empty name
                hs = new Highscore(Integer.parseInt((String) fields.elementAt(0)), "");
            }
            if (fields.size() >= 2) {
                hs = new Highscore(Integer.parseInt((String) fields.elementAt(0)),
                                   (String) fields.elementAt(1));
            }
            if (fields.size() >= 3) {
                hs.fields = new String[fields.size() - 2];
                for (int i = 2; i < fields.size(); i++) {
                    hs.fields[i - 2] = (String) fields.elementAt(i);
                }
            }
            highscores.addElement(hs);
        }
        Highscore[] ret = new Highscore[highscores.size()];
        for (int i = 0; i < highscores.size(); i++) {
            ret[i] = (Highscore) highscores.elementAt(i);
        }
        return ret;
        // return (Highscore[])highscores.toArray(new Highscore[]{});
    }