]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/samples/citer/citer.cpp
ICU-6.2.4.tar.gz
[apple/icu.git] / icuSources / samples / citer / citer.cpp
diff --git a/icuSources/samples/citer/citer.cpp b/icuSources/samples/citer/citer.cpp
new file mode 100644 (file)
index 0000000..7561e74
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+*******************************************************************************
+*
+*   Copyright (C) 2002-2003, International Business Machines
+*   Corporation and others.  All Rights Reserved.
+*
+*******************************************************************************
+*/
+
+#include "unicode/uchriter.h"
+#include "unicode/schriter.h"
+#include "unicode/ustring.h"
+#include <stdio.h>
+#include <iostream.h>
+#include <unicode/brkiter.h>
+#include <stdlib.h>
+
+void printUnicodeString(const UnicodeString &s) {
+  char charBuf[1000];
+  s.extract(0, s.length(), charBuf, sizeof(charBuf)-1, 0);   
+  charBuf[sizeof(charBuf)-1] = 0;          
+  cout << charBuf;
+}
+
+void printUChar(UChar32 ch) {
+  char charBuf[1000];
+  charBuf[sizeof(charBuf)-1] = 0;          
+  if(ch < 127) {
+    cout << (char) ch;
+  } else if (ch == CharacterIterator::DONE) {
+    cout << "[CharacterIterator::DONE = 0xFFFF]";
+  } else {
+    cout << "[" << ch << "]";
+  }
+}
+
+class Test
+{
+public:
+  void TestUChariter();
+  void TestStringiter();
+};
+
+void Test::TestUChariter() {
+  const char testChars[] = "Now is the time for all good men to come "
+    "to the aid of their country.";
+
+  UnicodeString testString(testChars,"");
+  const UChar *testText  = testString.getTerminatedBuffer();
+
+  UCharCharacterIterator iter(testText, u_strlen(testText));
+  UCharCharacterIterator* test2 = (UCharCharacterIterator*)iter.clone();
+  
+  cout << "testText = " << testChars;
+  
+  if (iter != *test2 ) {
+    printf("clone() or equals() failed: Two clones tested unequal\n");
+  }
+  
+  UnicodeString result1, result2;
+  // getting and comparing the text within the iterators
+  iter.getText(result1);
+  test2->getText(result2);
+  if (result1 != result2) {
+    printf("iter.getText() != clone.getText()\n");
+  } 
+  
+  cout << endl;
+  // Demonstrates seeking forward using the iterator.
+  cout << "Forward  = ";
+  
+  UChar c = iter.first();
+  printUChar(c);  // The first char
+  int32_t i = 0;
+  
+  if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) {
+    printf("startIndex() or endIndex() failed\n");
+  }
+  
+  
+  // Testing forward iteration...
+  do {
+    if (c == CharacterIterator::DONE && i != u_strlen(testText)) {
+      printf("Iterator reached end prematurely");
+    }
+    else if (c != testText[i]) {
+      printf("Character mismatch at position %d\n" + i);
+    }
+    if (iter.current() != c) {
+      printf("current() isn't working right");
+    }
+    if (iter.getIndex() != i) {
+            printf("getIndex() isn't working right\n");
+    }
+    if (c != CharacterIterator::DONE) {
+      c = iter.next();
+      i++;
+    }
+    
+    cout << "|";
+    printUChar(c);
+        
+  } while (c != CharacterIterator::DONE);    
+  
+  delete test2;
+  cout << endl;
+}
+
+
+void Test::TestStringiter() {
+  const char testChars[] = "Now is the time for all good men to come "
+    "to the aid of their country.";
+
+  UnicodeString testString(testChars,"");
+  const UChar *testText  = testString.getTerminatedBuffer();
+  
+  StringCharacterIterator iter(testText, u_strlen(testText));
+  StringCharacterIterator* test2 = (StringCharacterIterator*)iter.clone();
+  
+  if (iter != *test2 ) {
+    printf("clone() or equals() failed: Two clones tested unequal\n");
+  }
+  
+  UnicodeString result1, result2;
+  // getting and comparing the text within the iterators
+  iter.getText(result1);
+  test2->getText(result2);
+  if (result1 != result2) {
+    printf("getText() failed\n");
+  }
+
+  cout << "Backwards: ";
+  UChar c = iter.last();
+  printUChar(c);
+  int32_t i = iter.endIndex();
+  i--; // already printed out the last char 
+  if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) {
+    printf("startIndex() or endIndex() failed\n");
+  }
+  
+  // Testing backward iteration over a range...
+  do {
+    if (c == CharacterIterator::DONE) {
+      printf("Iterator reached end prematurely\n");
+    }
+    else if (c != testText[i]) {
+      printf("Character mismatch at position %d\n" + i);
+    }
+    if (iter.current() != c) {
+      printf("current() isn't working right\n");
+    }
+    if (iter.getIndex() != i) {
+      printf("getIndex() isn't working right [%d should be %d]\n", iter.getIndex(), i);
+    }
+    if (c != CharacterIterator::DONE) {
+      c = iter.previous();
+      i--;
+    }
+    cout << "|";
+    printUChar(c);
+  } while (c != CharacterIterator::DONE);
+
+  cout << endl;
+  delete test2;
+}
+
+/* Creating and using text boundaries */
+int main( void )
+{
+  cout << "ICU Iterator Sample Program (C++)\n\n";
+  
+  Test t;
+  
+  cout << endl;
+  cout << "Test::TestUCharIter()" << endl;
+  t.TestUChariter();
+  cout << "-----" << endl;
+  cout << "Test::TestStringchariter()" << endl;
+  t.TestStringiter();
+  cout << "-----" << endl;
+  
+  return 0;
+}