1/*
2**********************************************************************
3* Copyright (c) 2004-2011, International Business Machines
4* Corporation and others.  All Rights Reserved.
5**********************************************************************
6* Author: Alan Liu
7* Created: March 19 2004
8* Since: ICU 3.0
9**********************************************************************
10*/
11#ifndef __ICU_INTLTEST_TEXTFILE__
12#define __ICU_INTLTEST_TEXTFILE__
13
14#include "intltest.h"
15#include "filestrm.h"
16
17/**
18 * This class implements access to a text data file located in the
19 * icu/source/test/testdata/ directory.
20 */
21class TextFile {
22 public:
23    /**
24     * Open a file with the given name, in the given encoding, in the
25     * ICU testdata directory. See textfile.cpp to determine if the
26     * 'name' and 'encoding' parameters are aliased or copied.
27     */
28    TextFile(const char* name, const char* encoding, UErrorCode& ec);
29
30    virtual ~TextFile();
31
32    /**
33     * Read a line terminated by ^J or ^M or ^M^J, and convert it from
34     * this file's encoding to Unicode. The EOL character(s) are not
35     * included in 'line'.
36     * @return TRUE if a line was read, or FALSE if the EOF
37     * was reached or an error occurred
38     */
39    UBool readLine(UnicodeString& line, UErrorCode& ec);
40
41    /**
42     * Read a line, ignoring blank lines and lines that start with
43     * '#'.  Trim leading white space.
44     * @param trim if TRUE then remove leading Pattern_White_Space
45     * @return TRUE if a line was read, or FALSE if the EOF
46     * was reached or an error occurred
47     */
48    UBool readLineSkippingComments(UnicodeString& line, UErrorCode& ec,
49                                   UBool trim = FALSE);
50
51    /**
52     * Return the line number of the last line returned by readLine().
53     */
54    inline int32_t getLineNumber() const;
55
56 private:
57    UBool ensureCapacity(int32_t capacity);
58    UBool setBuffer(int32_t index, char c, UErrorCode& ec);
59
60    FileStream* file;
61    char* name;
62    char* encoding;
63    char* buffer;
64    int32_t capacity;
65    int32_t lineNo;
66};
67
68inline int32_t TextFile::getLineNumber() const {
69    return lineNo;
70}
71
72#endif
73