/*
**********************************************************************
* Copyright (c) 2004, International Business Machines
* Corporation and others.  All Rights Reserved.
**********************************************************************
* Author: Alan Liu
* Created: March 19 2004
* Since: ICU 3.0
**********************************************************************
*/
#ifndef __ICU_INTLTEST_TEXTFILE__
#define __ICU_INTLTEST_TEXTFILE__

#include "unicode/utypes.h"
#include "unicode/unistr.h"
#include "filestrm.h"

/**
 * This class implements access to a text data file located in the
 * icu/source/test/testdata/ directory.
 */
class TextFile {
 public:
    /**
     * Open a file with the given name, in the given encoding, in the
     * ICU testdata directory. See textfile.cpp to determine if the
     * 'name' and 'encoding' parameters are aliased or copied.
     */
    TextFile(const char* name, const char* encoding, UErrorCode& ec);

    virtual ~TextFile();

    /**
     * Read a line terminated by ^J or ^M or ^M^J, and convert it from
     * this file's encoding to Unicode. The EOL character(s) are not
     * included in 'line'.
     * @return TRUE if a line was read, or FALSE if the EOF
     * was reached or an error occurred
     */
    UBool readLine(UnicodeString& line, UErrorCode& ec);

    /**
     * Read a line, ignoring blank lines and lines that start with
     * '#'.  Trim leading white space.
     * @param trim if TRUE then remove leading rule white space
     * @return TRUE if a line was read, or FALSE if the EOF
     * was reached or an error occurred
     */
    UBool readLineSkippingComments(UnicodeString& line, UErrorCode& ec,
                                   UBool trim = FALSE);

    /**
     * Return the line number of the last line returned by readLine().
     */
    inline int32_t getLineNumber() const;

 private:
    UBool ensureCapacity(int32_t capacity);
    UBool setBuffer(int32_t index, char c, UErrorCode& ec);

    FileStream* file;
    char* name;
    char* encoding;
    char* buffer;
    int32_t capacity;
    int32_t lineNo;
};

inline int32_t TextFile::getLineNumber() const {
    return lineNo;
}

#endif
