16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (c) 2004-2011, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Author: Alan Liu
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Created: March 22 2004
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Since: ICU 3.0
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef __ICU_INTLTEST_TOKITER__
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define __ICU_INTLTEST_TOKITER__
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "intltest.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TextFile;
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * An iterator class that returns successive string tokens from some
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * source.  String tokens are, in general, separated by Pattern_White_Space
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in the source test.  Furthermore, they may be delimited by
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * either single or double quotes (opening and closing quotes must
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * match).  Escapes are processed using standard ICU unescaping.
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass TokenIterator {
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Construct an iterator over the tokens returned by the given
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * TextFile, ignoring blank lines and comment lines (first
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * non-blank character is '#').  Note that trailing comments on a
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * line, beginning with the first unquoted '#', are recognized.
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TokenIterator(TextFile* r);
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~TokenIterator();
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the next token from this iterator.
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return TRUE if a token was read, or FALSE if no more tokens
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * are available or an error occurred.
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool next(UnicodeString& token, UErrorCode& ec);
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the one-based line number of the line of the last token
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returned by next(). Should only be called after a call to
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * next(); otherwise the return value is undefined.
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getLineNumber() const;
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return a string description of the position of the last line
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returned by readLine() or readLineSkippingComments().
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //public String describePosition() {
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //    return reader.describePosition() + ':' + (lastpos+1);
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool nextToken(UnicodeString& token, UErrorCode& ec);
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TextFile* reader; // alias
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString line;
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool done;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool haveLine;
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t pos;
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t lastpos;
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
72