/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/utility/FileLineIterator.java,v $
* $Date: 2003/02/25 23:38:22 $
* $Revision: 1.2 $
*
*******************************************************************************
*/

package com.ibm.text.utility;

import java.util.*;
import java.text.*;
import java.io.*;
import com.ibm.icu.text.UnicodeSet;
import com.ibm.icu.text.UTF16;
import com.ibm.icu.text.Replaceable;
import com.ibm.icu.text.ReplaceableString;
import com.ibm.icu.text.UnicodeMatcher;

import com.ibm.text.UCD.*;

/**
 * Opens a file, and iterates through the lines in the file.
 * Options allow trimming and comment handling, and splitting
 */
public class FileLineIterator {
    static public final char NOTCHAR = '\uFFFF';
    
    // public writable
    public boolean doCounter = true;
    public int lineLimit = Integer.MAX_VALUE;
    public char commentChar = '#';  // NOTCHAR if no comments
    public boolean showFilename = true;
    
    // public readable
    public String originalLine = "";
    public String cleanedLine = "";
    public int counter = 0;
    
    private BufferedReader br = null;
    private Utility.Encoding encoding = Utility.UTF8;
    
    /**
     * Open the file for reading. If useGenDir is set, use the normal generation directory
     */
    public void open(String filename, Utility.Encoding encoding) throws IOException {
        if (showFilename) {
            Utility.fixDot();
            System.out.println("Reading File: " + new File(filename).getCanonicalPath());
        }
        br = Utility.openReadFile(filename, encoding);
        this.encoding = encoding;
    }
    
    /**
     * Fetch a non-zero-length line from the file, stripping comments & using counter, according to settings.
     */
    public String read() throws IOException {
        while (true) {
            if (counter >= lineLimit) return null;
            cleanedLine = originalLine = br.readLine();
            if (doCounter) Utility.dot(counter++);
            if (cleanedLine == null) return null;
            
            // drop BOM
            if (encoding == Utility.UTF8 && counter == 0 && cleanedLine.length() > 0 && cleanedLine.charAt(0) == 0xFEFF) {
                cleanedLine = cleanedLine.substring(1);
            }
            
            // drop comment
            if (commentChar != NOTCHAR) {
                int commentPos = cleanedLine.indexOf(commentChar);
                if (commentPos >= 0) cleanedLine = cleanedLine.substring(0, commentPos);
            }
            cleanedLine = cleanedLine.trim();
            if (cleanedLine.length() != 0) return cleanedLine;
        }
    }
    
    public int readSplit(String[] results, char delimiter) throws IOException {
        String line = read();
        if (line == null) return 0;
        return Utility.split(line, delimiter, results);
    }
    
    public void close() throws IOException {
        Utility.fixDot();
        br.close();
    }
}
    