Index: icu46/source/test/intltest/tokiter.cpp |
=================================================================== |
--- icu46/source/test/intltest/tokiter.cpp (revision 0) |
+++ icu46/source/test/intltest/tokiter.cpp (revision 0) |
@@ -0,0 +1,107 @@ |
+/* |
+********************************************************************** |
+* Copyright (c) 2004, International Business Machines |
+* Corporation and others. All Rights Reserved. |
+********************************************************************** |
+* Author: Alan Liu |
+* Created: March 22 2004 |
+* Since: ICU 3.0 |
+********************************************************************** |
+*/ |
+#include "tokiter.h" |
+#include "textfile.h" |
+#include "util.h" |
+#include "uprops.h" |
+ |
+TokenIterator::TokenIterator(TextFile* r) { |
+ reader = r; |
+ done = haveLine = FALSE; |
+ pos = lastpos = -1; |
+} |
+ |
+TokenIterator::~TokenIterator() { |
+} |
+ |
+UBool TokenIterator::next(UnicodeString& token, UErrorCode& ec) { |
+ if (done || U_FAILURE(ec)) { |
+ return FALSE; |
+ } |
+ token.truncate(0); |
+ for (;;) { |
+ if (!haveLine) { |
+ if (!reader->readLineSkippingComments(line, ec)) { |
+ done = TRUE; |
+ return FALSE; |
+ } |
+ haveLine = TRUE; |
+ pos = 0; |
+ } |
+ lastpos = pos; |
+ if (!nextToken(token, ec)) { |
+ haveLine = FALSE; |
+ if (U_FAILURE(ec)) return FALSE; |
+ continue; |
+ } |
+ return TRUE; |
+ } |
+} |
+ |
+int32_t TokenIterator::getLineNumber() const { |
+ return reader->getLineNumber(); |
+} |
+ |
+/** |
+ * Read the next token from 'this->line' and append it to 'token'. |
+ * Tokens are separated by rule white space. Tokens may also be |
+ * delimited by double or single quotes. The closing quote must match |
+ * the opening quote. If a '#' is encountered, the rest of the line |
+ * is ignored, unless it is backslash-escaped or within quotes. |
+ * @param token the token is appended to this StringBuffer |
+ * @param ec input-output error code |
+ * @return TRUE if a valid token is found, or FALSE if the end |
+ * of the line is reached or an error occurs |
+ */ |
+UBool TokenIterator::nextToken(UnicodeString& token, UErrorCode& ec) { |
+ ICU_Utility::skipWhitespace(line, pos, TRUE); |
+ if (pos == line.length()) { |
+ return FALSE; |
+ } |
+ UChar c = line.charAt(pos++); |
+ UChar quote = 0; |
+ switch (c) { |
+ case 34/*'"'*/: |
+ case 39/*'\\'*/: |
+ quote = c; |
+ break; |
+ case 35/*'#'*/: |
+ return FALSE; |
+ default: |
+ token.append(c); |
+ break; |
+ } |
+ while (pos < line.length()) { |
+ c = line.charAt(pos); // 16-bit ok |
+ if (c == 92/*'\\'*/) { |
+ UChar32 c32 = line.unescapeAt(pos); |
+ if (c32 < 0) { |
+ ec = U_MALFORMED_UNICODE_ESCAPE; |
+ return FALSE; |
+ } |
+ token.append(c32); |
+ } else if ((quote != 0 && c == quote) || |
+ (quote == 0 && uprv_isRuleWhiteSpace(c))) { |
+ ++pos; |
+ return TRUE; |
+ } else if (quote == 0 && c == '#') { |
+ return TRUE; // do NOT increment |
+ } else { |
+ token.append(c); |
+ ++pos; |
+ } |
+ } |
+ if (quote != 0) { |
+ ec = U_UNTERMINATED_QUOTE; |
+ return FALSE; |
+ } |
+ return TRUE; |
+} |
Property changes on: icu46/source/test/intltest/tokiter.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |