/* 
 * SorOlvaso.java
 * sorokat olvas egy InputStream-ből, kommenteket sorszéli szóközöket kiszűrve
 * by pts@fazekas.hu at Fri Mar 30 20:07:13 CEST 2001
 * további doksi: a README-ben és e file legkülső class-ának fejkommentjében
 *
 * Kincskereső Kisgömböc (C) Early May 2001 by eNTitánok (Rév Szilvia,
 * Szabó Péter <pts@inf.bme.hu>, Szurdi Miklós, Weizengruber Attila).
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or   
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package eNTitanok.util;
import java.io.InputStream;
import java.io.IOException;

/**
 * A :SorOlvasó a nemüres sorokat string-ként adja vissza, #-kommentek és
 * szélső whitespace nélkül stb. Azért InputStream-et (byte) használunk és
 * nem Reader-t (char), hogy minden platformon ugyanúgy olvashassuk be a
 * file-t.
 */
public class SorOlvaso {
  /**
   * Akkor váltódik ki, ha a bemeneti szövegfile nem az előírt formátumú.
   */
  public static class HibasBemenetException extends IOException {}
  /**
   * A bemeneti file-nak csak szóközt (32), soremelést (13 és/vagy 10) és
   * ASCII karaktereket (33 és 126 között) szabad tartalmaznia. Ha ez nem
   * teljesül, kiváltódik ez a kivétel.
   */
  public static class BemenetenRosszKarakterException extends HibasBemenetException {}
  protected static final int S_SORELEJE=0, S_VEGE=1;
  protected InputStream is;
  protected StringBuffer b;
  protected int status;
  public SorOlvaso(InputStream is) {
    this.is=is;
    status=S_SORELEJE;
    b=new StringBuffer();
  }
  /**
   * A bemenet karaktereit sorokká fűzi össze.
   * @return a következő nemüres sort adja vissza, soremelés, kommentek, nyitó
   *         és záró whitespace nélkül
   */
  public synchronized String readLine() throws IOException {
    while (status!=S_VEGE) {
      int c;
      while ((c=is.read())=='\n' || c=='\r' || c==' ');
      if (c==-1) { status=S_VEGE; break}
      if (c<33 || c>126) throw new BemenetenRosszKarakterException();
      if (c=='#') {
        while ((c=is.read())!=-1 && c!='\n' && c!='\r');
        if (c==-1) { status=S_VEGE; break}
      } else {
        b.setLength(0);
        b.append((char)c);
        while ((c=is.read())!=-1 && c!='\n' && c!='\r') {
          if (c<32 || c>126) throw new BemenetenRosszKarakterException();
          b.append((char)c);
        }
        if (c==-1) status=S_VEGE;
        int i=0;
        while (i<b.length() && b.charAt(i)!='#') i++;
        b.setLength(i);
        i=b.length();
        while (i>0 && b.charAt(i-1)==' ') i--;
        b.setLength(i);
        if (i>0) return b.toString();
      } /// IF
    } /// WHILE
    return null;
  } /// readLine()
  public synchronized void close() throws IOException {
    status=S_VEGE;
    is.close(); is=null;
  }
} /// class SorOlvaso