1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************** 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT: 359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (c) 2004-2013, International Business Machines Corporation and 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/ 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/******************************************************************************** 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File reapits.c 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************/ 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*C API TEST FOR Regular Expressions */ 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/** 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* This is an API test for ICU regular expressions in C. It doesn't test very many cases, and doesn't 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* try to test the full functionality. It just calls each function and verifies that it 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* works on a basic level. 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* More complete testing of regular expression functionality is done with the C++ tests. 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**/ 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_REGULAR_EXPRESSIONS 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uloc.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uregex.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/utext.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \ 336d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querulog_data_err("Failure at file %s, line %d, error = %s (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status));}} 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \ 366d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Querulog_data_err("Test Failure at file %s, line %d (Are you missing data?)\n", __FILE__, __LINE__);}} 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 38c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* 39c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * TEST_SETUP and TEST_TEARDOWN 40c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * macros to handle the boilerplate around setting up regex test cases. 41c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * parameteres to setup: 42c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * pattern: The regex pattern, a (char *) null terminated C string. 43c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * testString: The string data, also a (char *) C string. 44c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * flags: Regex flags to set when compiling the pattern 45c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 46c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Put arbitrary test code between SETUP and TEARDOWN. 47c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * 're" is the compiled, ready-to-go regular expression. 48c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 49c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define TEST_SETUP(pattern, testString, flags) { \ 50c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar *srcString = NULL; \ 51c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; \ 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru re = uregex_openC(pattern, flags, NULL, &status); \ 53c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); \ 54c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru srcString = (UChar *)malloc((strlen(testString)+2)*sizeof(UChar)); \ 55c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru u_uastrncpy(srcString, testString, strlen(testString)+1); \ 56c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setText(re, srcString, -1, &status); \ 57c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); \ 58c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_SUCCESS(status)) { 59c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 60c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru#define TEST_TEARDOWN \ 61c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } \ 62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); \ 63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_close(re); \ 64c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru free(srcString); \ 65c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 66c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 67c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * @param expected utf-8 array of bytes to be expected 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void test_assert_string(const char *expected, const UChar *actual, UBool nulTerm, const char *file, int line) { 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char buf_inside_macro[120]; 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = (int32_t)strlen(expected); 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool success; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nulTerm) { 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(buf_inside_macro, (actual), len+1); 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf_inside_macro[len+2] = 0; 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru success = (strcmp((expected), buf_inside_macro) == 0); 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_austrncpy(buf_inside_macro, (actual), len); 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf_inside_macro[len+1] = 0; 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru success = (strncmp((expected), buf_inside_macro, len) == 0); 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (success == FALSE) { 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru log_err("Failure at file %s, line %d, expected \"%s\", got \"%s\"\n", 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru file, line, (expected), buf_inside_macro); 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define TEST_ASSERT_STRING(expected, actual, nulTerm) test_assert_string(expected, actual, nulTerm, __FILE__, __LINE__) 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic UBool equals_utf8_utext(const char *utf8, UText *utext) { 9483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius int32_t u8i = 0; 9583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UChar32 u8c = 0; 9683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UChar32 utc = 0; 9783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UBool stringsEqual = TRUE; 9883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius utext_setNativeIndex(utext, 0); 9983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius for (;;) { 10083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius U8_NEXT_UNSAFE(utf8, u8i, u8c); 10183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius utc = utext_next32(utext); 10283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (u8c == 0 && utc == U_SENTINEL) { 10383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius break; 10483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 10583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (u8c != utc || u8c == 0) { 10683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius stringsEqual = FALSE; 10783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius break; 10883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 10983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 11083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return stringsEqual; 11183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 11283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 11383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 11450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void test_assert_utext(const char *expected, UText *actual, const char *file, int line) { 11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_setNativeIndex(actual, 0); 11683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (!equals_utf8_utext(expected, actual)) { 11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar32 c; 11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("Failure at file %s, line %d, expected \"%s\", got \"", file, line, expected); 11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho c = utext_next32From(actual, 0); 12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho while (c != U_SENTINEL) { 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (0x20<c && c <0x7e) { 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("%c", c); 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("%#x", c); 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho c = UTEXT_NEXT32(actual); 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_err("\"\n"); 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius/* 13383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * TEST_ASSERT_UTEXT(const char *expected, const UText *actual) 13483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * Note: Expected is a UTF-8 encoded string, _not_ the system code page. 13583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius */ 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define TEST_ASSERT_UTEXT(expected, actual) test_assert_utext(expected, actual, __FILE__, __LINE__) 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusstatic UBool testUTextEqual(UText *uta, UText *utb) { 13983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UChar32 ca = 0; 14083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UChar32 cb = 0; 14183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius utext_setNativeIndex(uta, 0); 14283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius utext_setNativeIndex(utb, 0); 14383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius do { 14483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius ca = utext_next32(uta); 14583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius cb = utext_next32(utb); 14683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius if (ca != cb) { 14783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius break; 14883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } 14983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius } while (ca != U_SENTINEL); 15083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return ca == cb; 15183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 15283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 15383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRegexCAPI(void); 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBug4315(void); 15850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTextAPI(void); 1592e615e9896b12236afe0ff2695e8afc2ee73f961clairehostatic void TestRefreshInput(void); 160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestBug8421(void); 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addURegexTest(TestNode** root); 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addURegexTest(TestNode** root) 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestRegexCAPI, "regex/TestRegexCAPI"); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru addTest(root, &TestBug4315, "regex/TestBug4315"); 16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho addTest(root, &TestUTextAPI, "regex/TestUTextAPI"); 1692e615e9896b12236afe0ff2695e8afc2ee73f961claireho addTest(root, &TestRefreshInput, "regex/TestRefreshInput"); 170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho addTest(root, &TestBug8421, "regex/TestBug8421"); 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 173c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* 174c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Call back function and context struct used for testing 175c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * regular expression user callbacks. This test is mostly the same as 176c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * the corresponding C++ test in intltest. 177c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 178c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querutypedef struct callBackContext { 179c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t maxCalls; 180c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t numCalls; 181c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t lastSteps; 182c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} callBackContext; 183c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 184c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic UBool U_EXPORT2 U_CALLCONV 185c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruTestCallbackFn(const void *context, int32_t steps) { 186c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru callBackContext *info = (callBackContext *)context; 187c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (info->lastSteps+1 != steps) { 188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru log_err("incorrect steps in callback. Expected %d, got %d\n", info->lastSteps+1, steps); 189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 190c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru info->lastSteps = steps; 191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru info->numCalls++; 192c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return (info->numCalls < info->maxCalls); 193c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru/* 196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Regular Expression C API Tests 197c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestRegexCAPI(void) { 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru URegularExpression *re; 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar pat[200]; 202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *minus1; 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(&minus1, -1, sizeof(minus1)); 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Mimimalist open/close */ 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(pat, "abc*", sizeof(pat)/2); 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0, 0, &status); 209c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (U_FAILURE(status)) { 21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("Failed to open regular expression, %s:%d, error is \"%s\" (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status)); 211c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 212c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Open with all flag values set */ 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 21883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD | UREGEX_LITERAL, 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 0, &status); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Open with an invalid flag */ 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0x40000000, 0, &status); 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_REGEX_INVALID_FLAG); 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Open with an unimplemented flag */ 23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 23183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius re = uregex_open(pat, -1, UREGEX_CANON_EQ, 0, &status); 23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(status == U_REGEX_UNIMPLEMENTED); 23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* openC with an invalid parameter */ 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC(NULL, 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status); 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR && re == NULL); 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* openC with an invalid parameter */ 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_USELESS_COLLATOR_ERROR; 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC(NULL, 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status); 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_USELESS_COLLATOR_ERROR && re == NULL); 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* openC open from a C string */ 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *p; 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len; 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("abc*", 0, 0, &status); 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru p = uregex_pattern(re, &len, &status); 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS above should change too... */ 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(pat, "abc*", sizeof(pat)/2); 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(u_strcmp(pat, p) == 0); 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(len==(int32_t)strlen("abc*")); 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: Open with ParseError parameter */ 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * clone 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru URegularExpression *clone1; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru URegularExpression *clone2; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru URegularExpression *clone3; 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar testString1[30]; 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar testString2[30]; 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool result; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("abc*", 0, 0, &status); 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone1 = uregex_clone(re, &status); 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(clone1 != NULL); 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone2 = uregex_clone(re, &status); 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(clone2 != NULL); 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone3 = uregex_clone(clone2, &status); 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(clone3 != NULL); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(testString1, "abcccd", sizeof(pat)/2); 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(testString2, "xxxabcccd", sizeof(pat)/2); 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(clone1, testString1, -1, &status); 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_lookingAt(clone1, 0, &status); 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result==TRUE); 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(clone2, testString2, -1, &status); 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_lookingAt(clone2, 0, &status); 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result==FALSE); 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_find(clone2, 0, &status); 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result==TRUE); 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(clone1); 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(clone2); 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(clone3); 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * pattern() 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *resultPat; 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultLen; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(pat, "hello", sizeof(pat)/2); 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0, NULL, &status); 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultPat = uregex_pattern(re, &resultLen, &status); 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS above should change too... */ 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultLen == -1); 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(u_strcmp(resultPat, pat) == 0); 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, 3, 0, NULL, &status); 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultPat = uregex_pattern(re, &resultLen, &status); 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS above should change too... */ 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultLen == 3); 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(u_strncmp(resultPat, pat, 3) == 0); 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(u_strlen(resultPat) == 3); 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * flags() 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t t; 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0, NULL, &status); 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = uregex_flags(re, &status); 370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(t == 0); 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0, NULL, &status); 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = uregex_flags(re, &status); 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(t == 0); 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL, NULL, &status); 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = uregex_flags(re, &status); 384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(t == (UREGEX_CASE_INSENSITIVE | UREGEX_DOTALL)); 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * setText() and lookingAt() 391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text1[50]; 394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text2[50]; 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool result; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text1, "abcccd", sizeof(text1)/2); 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text2, "abcccxd", sizeof(text2)/2); 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(pat, "abc*d", sizeof(pat)/2); 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0, NULL, &status); 402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Operation before doing a setText should fail... */ 405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_lookingAt(re, 0, &status); 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT( status== U_REGEX_INVALID_STATE); 408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_lookingAt(re, 0, &status); 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text2, -1, &status); 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_lookingAt(re, 0, &status); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == FALSE); 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_lookingAt(re, 0, &status); 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, 5, &status); 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_lookingAt(re, 0, &status); 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == FALSE); 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, 6, &status); 435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_lookingAt(re, 0, &status); 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * getText() 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text1[50]; 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text2[50]; 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *result; 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t textLength; 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text1, "abcccd", sizeof(text1)/2); 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text2, "abcccxd", sizeof(text2)/2); 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(pat, "abc*d", sizeof(pat)/2); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0, NULL, &status); 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_getText(re, &textLength, &status); 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == text1); 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(textLength == -1); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text2, 7, &status); 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_getText(re, &textLength, &status); 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == text2); 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(textLength == 7); 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text2, 4, &status); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_getText(re, &textLength, &status); 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == text2); 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(textLength == 4); 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * matches() 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text1[50]; 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool result; 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int len; 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar nullString[] = {0,0,0}; 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text1, "abcccde", sizeof(text1)/2); 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(pat, "abc*d", sizeof(pat)/2); 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_open(pat, -1, 0, NULL, &status); 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_matches(re, 0, &status); 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == FALSE); 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, 6, &status); 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_matches(re, 0, &status); 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, 6, &status); 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_matches(re, 1, &status); 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == FALSE); 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC(".?", 0, NULL, &status); 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = u_strlen(text1); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_matches(re, len, &status); 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, nullString, -1, &status); 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_matches(re, 0, &status); 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * lookingAt() Used in setText test. 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * find(), findNext, start, end, reset 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text1[50]; 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool result; 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text1, "012rx5rx890rxrx...", sizeof(text1)/2); 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("rx", 0, NULL, &status); 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_find(re, 0, &status); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 3); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 5); 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_find(re, 9, &status); 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 11); 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 13); 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_find(re, 14, &status); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == FALSE); 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_reset(re, 0, &status); 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_findNext(re, &status); 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 3); 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 5); 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_findNext(re, &status); 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 6); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 8); 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_reset(re, 12, &status); 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_findNext(re, &status); 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == TRUE); 582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 13); 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 15); 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_findNext(re, &status); 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == FALSE); 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * groupCount 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t result; 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("abc", 0, NULL, &status); 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_groupCount(re, &status); 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == 0); 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("abc(def)(ghi(j))", 0, NULL, &status); 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_groupCount(re, &status); 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result == 3); 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * group() 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text1[80]; 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buf[80]; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool result; 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultSz; 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text1, "noise abc interior def, and this is off the end", sizeof(text1)/2); 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("abc(.*?)def", 0, NULL, &status); 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru result = uregex_find(re, 0, &status); 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(result==TRUE); 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Capture Group 0, the full match. Should succeed. */ 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_group(re, 0, buf, sizeof(buf)/2, &status); 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("abc interior def", buf, TRUE); 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Capture group #1. Should succeed. */ 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_group(re, 1, buf, sizeof(buf)/2, &status); 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" interior ", buf, TRUE); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen(" interior ")); 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Capture group out of range. Error. */ 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_group(re, 2, buf, sizeof(buf)/2, &status); 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NULL buffer, pure pre-flight */ 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_group(re, 0, NULL, 0, &status); 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Too small buffer, truncated string */ 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(buf, -1, sizeof(buf)); 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_group(re, 0, buf, 5, &status); 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("abc i", buf, FALSE); 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(buf[5] == (UChar)0xffff); 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Output string just fits buffer, no NUL term. */ 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_group(re, 0, buf, (int32_t)strlen("abc interior def"), &status); 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("abc interior def", buf, FALSE); 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("abc interior def")); 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(buf[strlen("abc interior def")] == (UChar)0xffff); 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 680c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 681c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 682c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Regions 683c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 684c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 685c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 686c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* SetRegion(), getRegion() do something */ 687c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".*", "0123456789ABCDEF", 0) 688c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar resultString[40]; 689c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_regionStart(re, &status) == 0); 690c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_regionEnd(re, &status) == 16); 691c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 3, 6, &status); 692c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_regionStart(re, &status) == 3); 693c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_regionEnd(re, &status) == 6); 694c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_findNext(re, &status)); 695c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_group(re, 0, resultString, sizeof(resultString)/2, &status) == 3) 696c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_STRING("345", resultString, TRUE); 697c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 698c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 699c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* find(start=-1) uses regions */ 700c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".*", "0123456789ABCDEF", 0); 701c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 4, 6, &status); 702c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, -1, &status) == TRUE); 703c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 4); 704c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 6); 705c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 706c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 707c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* find (start >=0) does not use regions */ 708c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".*", "0123456789ABCDEF", 0); 709c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 4, 6, &status); 710c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, 0, &status) == TRUE); 711c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 0); 712c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 16); 713c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 714c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 715c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* findNext() obeys regions */ 716c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".", "0123456789ABCDEF", 0); 717c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 4, 6, &status); 718c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_findNext(re,&status) == TRUE); 719c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 4); 720c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_findNext(re, &status) == TRUE); 721c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 5); 722c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_findNext(re, &status) == FALSE); 723c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 724c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 725c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* matches(start=-1) uses regions */ 726c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Also, verify that non-greedy *? succeeds in finding the full match. */ 727c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".*?", "0123456789ABCDEF", 0); 728c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 4, 6, &status); 729c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_matches(re, -1, &status) == TRUE); 730c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 4); 731c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 6); 732c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 733c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 734c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* matches (start >=0) does not use regions */ 735c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".*?", "0123456789ABCDEF", 0); 736c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 4, 6, &status); 737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_matches(re, 0, &status) == TRUE); 738c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 0); 739c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 16); 740c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 741c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 742c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* lookingAt(start=-1) uses regions */ 743c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Also, verify that non-greedy *? finds the first (shortest) match. */ 744c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".*?", "0123456789ABCDEF", 0); 745c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 4, 6, &status); 746c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_lookingAt(re, -1, &status) == TRUE); 747c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 4); 748c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 4); 749c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 751c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* lookingAt (start >=0) does not use regions */ 752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP(".*?", "0123456789ABCDEF", 0); 753c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 4, 6, &status); 754c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_lookingAt(re, 0, &status) == TRUE); 755c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_start(re, 0, &status) == 0); 756c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 0); 757c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 758c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 759c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* hitEnd() */ 760c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("[a-f]*", "abcdefghij", 0); 761c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, 0, &status) == TRUE); 762c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_hitEnd(re, &status) == FALSE); 763c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 764c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 765c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("[a-f]*", "abcdef", 0); 766c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, 0, &status) == TRUE); 767c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_hitEnd(re, &status) == TRUE); 768c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 769c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 770c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* requireEnd */ 771c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("abcd", "abcd", 0); 772c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, 0, &status) == TRUE); 773c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_requireEnd(re, &status) == FALSE); 774c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 775c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 776c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("abcd$", "abcd", 0); 777c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, 0, &status) == TRUE); 778c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_requireEnd(re, &status) == TRUE); 779c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 781c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* anchoringBounds */ 782c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("abc$", "abcdef", 0); 783c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_hasAnchoringBounds(re, &status) == TRUE); 784c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_useAnchoringBounds(re, FALSE, &status); 785c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_hasAnchoringBounds(re, &status) == FALSE); 786c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 787c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, -1, &status) == FALSE); 788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_useAnchoringBounds(re, TRUE, &status); 789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 0, 3, &status); 790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, -1, &status) == TRUE); 791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 3); 792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Transparent Bounds */ 795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("abc(?=def)", "abcdef", 0); 796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_hasTransparentBounds(re, &status) == FALSE); 797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_useTransparentBounds(re, TRUE, &status); 798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_hasTransparentBounds(re, &status) == TRUE); 799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_useTransparentBounds(re, FALSE, &status); 801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, -1, &status) == TRUE); /* No Region */ 802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setRegion(re, 0, 3, &status); 803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, -1, &status) == FALSE); /* with region, opaque bounds */ 804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_useTransparentBounds(re, TRUE, &status); 805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_find(re, -1, &status) == TRUE); /* with region, transparent bounds */ 806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_end(re, 0, &status) == 3); 807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * replaceFirst() 812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text1[80]; 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text2[80]; 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar replText[80]; 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buf[80]; 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t resultSz; 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text1, "Replace xaax x1x x...x.", sizeof(text1)/2); 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text2, "No match here.", sizeof(text2)/2); 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(replText, "<$1>", sizeof(replText)/2); 822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("x(.*?)x", 0, NULL, &status); 825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Normal case, with match */ 828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status); 830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, TRUE); 832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); 833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* No match. Text should copy to output with no changes. */ 835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text2, -1, &status); 837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_replaceFirst(re, replText, -1, buf, sizeof(buf)/2, &status); 838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("No match here.", buf, TRUE); 840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("No match here.")); 841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Match, output just fills buffer, no termination warning. */ 843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(buf, -1, sizeof(buf)); 846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status); 847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); 848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE); 849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); 850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(buf[resultSz] == (UChar)0xffff); 851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Do the replaceFirst again, without first resetting anything. 853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Should give the same results. 854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(buf, -1, sizeof(buf)); 857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x."), &status); 858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); 859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("Replace <aa> x1x x...x.", buf, FALSE); 860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); 861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(buf[resultSz] == (UChar)0xffff); 862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NULL buffer, zero buffer length */ 864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_replaceFirst(re, replText, -1, NULL, 0, &status); 866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); 868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Buffer too small by one */ 870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(buf, -1, sizeof(buf)); 872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resultSz = uregex_replaceFirst(re, replText, -1, buf, strlen("Replace <aa> x1x x...x.")-1, &status); 873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("Replace <aa> x1x x...x", buf, FALSE); 875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(resultSz == (int32_t)strlen("Replace xaax x1x x...x.")); 876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(buf[resultSz] == (UChar)0xffff); 877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * replaceAll() 884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 886b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar text1[80]; /* "Replace xaax x1x x...x." */ 887b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar text2[80]; /* "No match Here" */ 888b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar replText[80]; /* "<$1>" */ 889b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UChar replText2[80]; /* "<<$1>>" */ 890b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char * pattern = "x(.*?)x"; 891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char * expectedResult = "Replace <aa> <1> <...>."; 892b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const char * expectedResult2 = "Replace <<aa>> <<1>> <<...>>."; 893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buf[80]; 894b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t resultSize; 895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t expectedResultSize; 896b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t expectedResultSize2; 897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text1, "Replace xaax x1x x...x.", sizeof(text1)/2); 900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text2, "No match here.", sizeof(text2)/2); 901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(replText, "<$1>", sizeof(replText)/2); 902b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru u_uastrncpy(replText2, "<<$1>>", sizeof(replText2)/2); 903b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expectedResultSize = strlen(expectedResult); 904b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expectedResultSize2 = strlen(expectedResult2); 905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 907b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru re = uregex_openC(pattern, 0, NULL, &status); 908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Normal case, with match */ 911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 912b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru resultSize = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status); 913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 914b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT_STRING(expectedResult, buf, TRUE); 915b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(resultSize == expectedResultSize); 916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* No match. Text should copy to output with no changes. */ 918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text2, -1, &status); 920b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru resultSize = uregex_replaceAll(re, replText, -1, buf, sizeof(buf)/2, &status); 921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("No match here.", buf, TRUE); 923b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(resultSize == u_strlen(text2)); 924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Match, output just fills buffer, no termination warning. */ 926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text1, -1, &status); 928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(buf, -1, sizeof(buf)); 929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru resultSize = uregex_replaceAll(re, replText, -1, buf, expectedResultSize, &status); 930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); 931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT_STRING(expectedResult, buf, FALSE); 932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(resultSize == expectedResultSize); 933b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(buf[resultSize] == (UChar)0xffff); 934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Do the replaceFirst again, without first resetting anything. 936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Should give the same results. 937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(buf, -1, sizeof(buf)); 940b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru resultSize = uregex_replaceAll(re, replText, -1, buf, strlen("Replace xaax x1x x...x."), &status); 941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_STRING_NOT_TERMINATED_WARNING); 942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("Replace <aa> <1> <...>.", buf, FALSE); 943b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(resultSize == (int32_t)strlen("Replace <aa> <1> <...>.")); 944b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(buf[resultSize] == (UChar)0xffff); 945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* NULL buffer, zero buffer length */ 947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 948b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru resultSize = uregex_replaceAll(re, replText, -1, NULL, 0, &status); 949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(resultSize == (int32_t)strlen("Replace <aa> <1> <...>.")); 951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Buffer too small. Try every size, which will tickle edge cases 953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * in uregex_appendReplacement (used by replaceAll) */ 954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; i<expectedResultSize; i++) { 955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char expected[80]; 956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(buf, -1, sizeof(buf)); 958b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru resultSize = uregex_replaceAll(re, replText, -1, buf, i, &status); 959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru strcpy(expected, expectedResult); 961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru expected[i] = 0; 962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(expected, buf, FALSE); 963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(resultSize == expectedResultSize); 964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(buf[i] == (UChar)0xffff); 965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Buffer too small. Same as previous test, except this time the replacement 968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * text is longer than the match capture group, making the length of the complete 969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru * replacement longer than the original string. 970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru */ 971b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru for (i=0; i<expectedResultSize2; i++) { 972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru char expected[80]; 973b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_ZERO_ERROR; 974b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru memset(buf, -1, sizeof(buf)); 975b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru resultSize = uregex_replaceAll(re, replText2, -1, buf, i, &status); 976b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 977b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru strcpy(expected, expectedResult2); 978b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru expected[i] = 0; 979b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT_STRING(expected, buf, FALSE); 980b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(resultSize == expectedResultSize2); 981b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(buf[i] == (UChar)0xffff); 982b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 983b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 984b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * appendReplacement() 991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text[100]; 994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar repl[100]; 995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buf[100]; 996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *bufPtr; 997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t bufCap; 998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC(".*", 0, 0, &status); 1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text, "whatever", sizeof(text)/2); 1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(repl, "some other", sizeof(repl)/2); 1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, text, -1, &status); 1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* match covers whole target string */ 1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_find(re, 0, &status); 1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufPtr = buf; 1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufCap = sizeof(buf) / 2; 1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status); 1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("some other", buf, TRUE); 1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Match has \u \U escapes */ 1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_find(re, 0, &status); 1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufPtr = buf; 1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bufCap = sizeof(buf) / 2; 1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(repl, "abc\\u0041\\U00000042 \\\\ $ \\abc", sizeof(repl)/2); 1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status); 1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("abcAB \\ $ abc", buf, TRUE); 1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1027b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru /* Bug 6813, parameter check of NULL destCapacity; crashed before fix. */ 1028b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_ZERO_ERROR; 1029b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uregex_find(re, 0, &status); 1030b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1031b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru bufPtr = buf; 1032b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru status = U_BUFFER_OVERFLOW_ERROR; 1033b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uregex_appendReplacement(re, repl, -1, &bufPtr, NULL, &status); 1034b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 1035b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * appendTail(). Checked in ReplaceFirst(), replaceAll(). 1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * split() 1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar textToSplit[80]; 1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar text2[80]; 1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buf[200]; 1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *fields[10]; 1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t numFields; 1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t requiredCapacity; 1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t spaceNeeded; 1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sz; 1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(textToSplit, "first : second: third", sizeof(textToSplit)/2); 1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(text2, "No match here.", sizeof(text2)/2); 1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC(":", 0, NULL, &status); 1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Simple split */ 1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, textToSplit, -1, &status); 1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(status)) { 1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status); 1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(numFields == 3); 1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second", fields[1], TRUE); 1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" third", fields[2], TRUE); 1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(fields[3] == NULL); 1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru spaceNeeded = u_strlen(textToSplit) - 1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (numFields - 1) + /* Field delimiters do not appear in output */ 1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields; /* Each field gets a NUL terminator */ 1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Split with too few output strings available */ 1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC(":", 0, NULL, &status); 1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, textToSplit, -1, &status); 1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status); 1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(numFields == 2); 1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second: third", fields[1], TRUE); 1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*))); 1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru spaceNeeded = u_strlen(textToSplit) - 1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (numFields - 1) + /* Field delimiters do not appear in output */ 1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields; /* Each field gets a NUL terminator */ 1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Split with a range of output buffer sizes. */ 1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru spaceNeeded = u_strlen(textToSplit) - 1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (numFields - 1) + /* Field delimiters do not appear in output */ 1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields; /* Each field gets a NUL terminator */ 1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (sz=0; sz < spaceNeeded+1; sz++) { 1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sz, &requiredCapacity, fields, 10, &status); 1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (sz >= spaceNeeded) { 1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second", fields[1], TRUE); 1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" third", fields[2], TRUE); 1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(status == U_BUFFER_OVERFLOW_ERROR); 1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(numFields == 3); 1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(fields[3] == NULL); 1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Split(), part 2. Patterns with capture groups. The capture group text 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * comes out as additional fields. */ 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar textToSplit[80]; 1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar buf[200]; 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *fields[10]; 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t numFields; 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t requiredCapacity; 1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t spaceNeeded; 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t sz; 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrncpy(textToSplit, "first <tag-a> second<tag-b> third", sizeof(textToSplit)/2); 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re = uregex_openC("<(.*?)>", 0, NULL, &status); 1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, textToSplit, -1, &status); 1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 10, &status); 1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(numFields == 5); 1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("tag-a", fields[1], TRUE); 1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second", fields[2], TRUE); 1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("tag-b", fields[3], TRUE); 1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" third", fields[4], TRUE); 1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(fields[5] == NULL); 1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru spaceNeeded = strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */ 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Split with too few output strings available (2) */ 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 2, &status); 1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(numFields == 2); 1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second<tag-b> third", fields[1], TRUE); 1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(!memcmp(&fields[2],&minus1,sizeof(UChar*))); 1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru spaceNeeded = strlen("first . second<tag-b> third."); /* "." at NUL positions */ 1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Split with too few output strings available (3) */ 1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 3, &status); 1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(numFields == 3); 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("tag-a", fields[1], TRUE); 1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second<tag-b> third", fields[2], TRUE); 1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(!memcmp(&fields[3],&minus1,sizeof(UChar*))); 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru spaceNeeded = strlen("first .tag-a. second<tag-b> third."); /* "." at NUL positions */ 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Split with just enough output strings available (5) */ 1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 5, &status); 1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(numFields == 5); 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("tag-a", fields[1], TRUE); 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second", fields[2], TRUE); 1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("tag-b", fields[3], TRUE); 1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" third", fields[4], TRUE); 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(!memcmp(&fields[5],&minus1,sizeof(UChar*))); 1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru spaceNeeded = strlen("first .tag-a. second.tag-b. third."); /* "." at NUL positions */ 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Split, end of text is a field delimiter. */ 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sz = strlen("first <tag-a> second<tag-b>"); 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(re, textToSplit, sz, &status); 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru memset(fields, -1, sizeof(fields)); 1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru numFields = 1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_split(re, buf, sizeof(buf)/2, &requiredCapacity, fields, 9, &status); 1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* The TEST_ASSERT_SUCCESS call above should change too... */ 1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)) { 1265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(numFields == 5); 1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("first ", fields[0], TRUE); 1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("tag-a", fields[1], TRUE); 1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING(" second", fields[2], TRUE); 1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("tag-b", fields[3], TRUE); 1270b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT_STRING("", fields[4], TRUE); 1271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(fields[5] == NULL); 1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(fields[8] == NULL); 1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(!memcmp(&fields[9],&minus1,sizeof(UChar*))); 1274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho spaceNeeded = strlen("first .tag-a. second.tag-b.."); /* "." at NUL positions */ 1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(spaceNeeded == requiredCapacity); 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(re); 1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 1283c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * set/getTimeLimit 1284c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 1285c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("abc$", "abcdef", 0); 1286c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_getTimeLimit(re, &status) == 0); 1287c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setTimeLimit(re, 1000, &status); 1288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_getTimeLimit(re, &status) == 1000); 1289c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1290c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setTimeLimit(re, -1, &status); 1291c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR); 1292c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 1293c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_getTimeLimit(re, &status) == 1000); 1294c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 1295c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1296c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 1297c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * set/get Stack Limit 1298c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 1299c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("abc$", "abcdef", 0); 1300c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_getStackLimit(re, &status) == 8000000); 1301c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setStackLimit(re, 40000, &status); 1302c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_getStackLimit(re, &status) == 40000); 1303c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1304c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setStackLimit(re, -1, &status); 1305c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR); 1306c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru status = U_ZERO_ERROR; 1307c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_getStackLimit(re, &status) == 40000); 1308c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 1309c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1310c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1311c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* 1312c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * Get/Set callback functions 1313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * This test is copied from intltest regex/Callbacks 1314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * The pattern and test data will run long enough to cause the callback 1315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * to be invoked. The nested '+' operators give exponential time 1316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru * behavior with increasing string length. 1317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru */ 1318c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_SETUP("((.)+\\2)+x", "aaaaaaaaaaaaaaaaaaab", 0) 1319c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru callBackContext cbInfo = {4, 0, 0}; 1320c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const void *pContext = &cbInfo; 1321c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru URegexMatchCallback *returnedFn = &TestCallbackFn; 1322c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1323c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Getting the callback fn when it hasn't been set must return NULL */ 1324c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_getMatchCallback(re, &returnedFn, &pContext, &status); 1325c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1326c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(returnedFn == NULL); 1327c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(pContext == NULL); 1328c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1329c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Set thecallback and do a match. */ 1330c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* The callback function should record that it has been called. */ 1331c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_setMatchCallback(re, &TestCallbackFn, &cbInfo, &status); 1332c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1333c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(cbInfo.numCalls == 0); 1334c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(uregex_matches(re, -1, &status) == FALSE); 1335c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT_SUCCESS(status); 1336c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(cbInfo.numCalls > 0); 1337c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1338c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* Getting the callback should return the values that were set above. */ 1339c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uregex_getMatchCallback(re, &returnedFn, &pContext, &status); 1340c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(returnedFn == &TestCallbackFn); 1341c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_ASSERT(pContext == &cbInfo); 1342c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1343c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru TEST_TEARDOWN; 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1346c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1347c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestBug4315(void) { 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode theICUError = U_ZERO_ERROR; 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru URegularExpression *theRegEx; 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *textBuff; 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *thePattern; 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar theString[100]; 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *destFields[24]; 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t neededLength1; 1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t neededLength2; 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t wordCount = 0; 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destFieldsSize = 24; 1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru thePattern = "ck "; 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_uastrcpy(theString, "The quick brown fox jumped over the slow black turtle."); 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* open a regex */ 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru theRegEx = uregex_openC(thePattern, 0, NULL, &theICUError); 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(theICUError); 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* set the input string */ 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_setText(theRegEx, theString, u_strlen(theString), &theICUError); 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(theICUError); 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* split */ 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*explicitly pass NULL and 0 to force the overflow error -> this is where the 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * error occurs! */ 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wordCount = uregex_split(theRegEx, NULL, 0, &neededLength1, destFields, 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destFieldsSize, &theICUError); 1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(theICUError == U_BUFFER_OVERFLOW_ERROR); 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(wordCount==3); 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(theICUError == U_BUFFER_OVERFLOW_ERROR) 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru theICUError = U_ZERO_ERROR; 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru textBuff = (UChar *) malloc(sizeof(UChar) * (neededLength1 + 1)); 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru wordCount = uregex_split(theRegEx, textBuff, neededLength1+1, &neededLength2, 1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destFields, destFieldsSize, &theICUError); 1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(wordCount==3); 1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_SUCCESS(theICUError); 1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(neededLength1 == neededLength2); 1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("The qui", destFields[0], TRUE); 1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("brown fox jumped over the slow bla", destFields[1], TRUE); 1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT_STRING("turtle.", destFields[2], TRUE); 1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru TEST_ASSERT(destFields[3] == NULL); 1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru free(textBuff); 1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uregex_close(theRegEx); 1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* Based on TestRegexCAPI() */ 140050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void TestUTextAPI(void) { 140150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode status = U_ZERO_ERROR; 140250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho URegularExpression *re; 140350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText patternText = UTEXT_INITIALIZER; 140450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar pat[200]; 140550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char patternTextUTF8[5] = { 0x61, 0x62, 0x63, 0x2a, 0x00 }; 140650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 140750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Mimimalist open/close */ 140850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&patternText, patternTextUTF8, -1, &status); 140950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(&patternText, 0, 0, &status); 141050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 141150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho log_data_err("Failed to open regular expression, %s:%d, error is \"%s\" (Are you missing data?)\n", __FILE__, __LINE__, u_errorName(status)); 141250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&patternText); 141350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 141450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 141550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 141650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 141750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Open with all flag values set */ 141850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 141950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(&patternText, 142050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 142150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 0, &status); 142250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 142350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 142450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 142550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Open with an invalid flag */ 142650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 142750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(&patternText, 0x40000000, 0, &status); 142850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(status == U_REGEX_INVALID_FLAG); 142950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 143050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 143150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* open with an invalid parameter */ 143250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 143350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(NULL, 143450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UREGEX_CASE_INSENSITIVE | UREGEX_COMMENTS | UREGEX_DOTALL | UREGEX_MULTILINE | UREGEX_UWORD, 0, &status); 143550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(status == U_ILLEGAL_ARGUMENT_ERROR && re == NULL); 143650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 143750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 143850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * clone 143950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 144050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 144150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho URegularExpression *clone1; 144250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho URegularExpression *clone2; 144350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho URegularExpression *clone3; 144450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar testString1[30]; 144550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar testString2[30]; 144650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result; 144750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 144850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 144950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 145050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(&patternText, 0, 0, &status); 145150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 145250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho clone1 = uregex_clone(re, &status); 145350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 145450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(clone1 != NULL); 145550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 145650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 145750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho clone2 = uregex_clone(re, &status); 145850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 145950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(clone2 != NULL); 146050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 146150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 146250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 146350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho clone3 = uregex_clone(clone2, &status); 146450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 146550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(clone3 != NULL); 146650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 146750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(testString1, "abcccd", sizeof(pat)/2); 146850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(testString2, "xxxabcccd", sizeof(pat)/2); 146950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 147050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 147150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(clone1, testString1, -1, &status); 147250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 147350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_lookingAt(clone1, 0, &status); 147450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 147550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result==TRUE); 147650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 147750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 147850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(clone2, testString2, -1, &status); 147950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 148050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_lookingAt(clone2, 0, &status); 148150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 148250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result==FALSE); 148350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_find(clone2, 0, &status); 148450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 148550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result==TRUE); 148650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 148750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(clone1); 148850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(clone2); 148950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(clone3); 149050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 149150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 149250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 149350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 149450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * pattern() and patternText() 149550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 149650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 149750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *resultPat; 149850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t resultLen; 149950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *resultText; 150050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_hello[] = { 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00 }; /* hello */ 150150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_hel[] = { 0x68, 0x65, 0x6c, 0x00 }; /* hel */ 150250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(pat, "hello", sizeof(pat)/2); /* for comparison */ 150350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 150450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 150550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&patternText, str_hello, -1, &status); 150650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_open(pat, -1, 0, NULL, &status); 150750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultPat = uregex_pattern(re, &resultLen, &status); 150850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 150950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 151050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS above should change too... */ 151150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_SUCCESS(status)) { 151250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(resultLen == -1); 151350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(u_strcmp(resultPat, pat) == 0); 151450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 151550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 151650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultText = uregex_patternUText(re, &status); 151750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 151850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_hello, resultText); 151950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 152050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 152150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 152250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 152350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_open(pat, 3, 0, NULL, &status); 152450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultPat = uregex_pattern(re, &resultLen, &status); 152550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 152650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 152750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS above should change too... */ 152850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_SUCCESS(status)) { 152950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(resultLen == 3); 153050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(u_strncmp(resultPat, pat, 3) == 0); 153150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(u_strlen(resultPat) == 3); 153250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 153350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 153450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultText = uregex_patternUText(re, &status); 153550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 153650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_hel, resultText); 153750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 153850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 153950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 154050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 154150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 154250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * setUText() and lookingAt() 154350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 154450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 154550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText text1 = UTEXT_INITIALIZER; 154650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText text2 = UTEXT_INITIALIZER; 154750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result; 154850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcccd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x65, 0x00 }; /* abcccd */ 154950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcccxd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x79, 0x65, 0x00 }; /* abcccxd */ 155050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcd[] = { 0x62, 0x63, 0x64, 0x2b, 0x65, 0x00 }; /* abc*d */ 155150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 155250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&text1, str_abcccd, -1, &status); 155350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&text2, str_abcccxd, -1, &status); 155450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 155550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&patternText, str_abcd, -1, &status); 155650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(&patternText, 0, NULL, &status); 155750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 155850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 155950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Operation before doing a setText should fail... */ 156050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 156150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_lookingAt(re, 0, &status); 156250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT( status== U_REGEX_INVALID_STATE); 156350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 156450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 156550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setUText(re, &text1, &status); 156650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_lookingAt(re, 0, &status); 156750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 156850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 156950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 157050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 157150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setUText(re, &text2, &status); 157250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_lookingAt(re, 0, &status); 157350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == FALSE); 157450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 157550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 157650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 157750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setUText(re, &text1, &status); 157850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_lookingAt(re, 0, &status); 157950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 158050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 158150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 158250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 158350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&text1); 158450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&text2); 158550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 158650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 158750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 158850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 158950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * getText() and getUText() 159050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 159150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 159250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText text1 = UTEXT_INITIALIZER; 159350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText text2 = UTEXT_INITIALIZER; 159450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text2Chars[20]; 159550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *resultText; 159650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *result; 159750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t textLength; 159850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcccd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x65, 0x00 }; /* abcccd */ 159950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcccxd[] = { 0x62, 0x63, 0x64, 0x64, 0x64, 0x79, 0x65, 0x00 }; /* abcccxd */ 160050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcd[] = { 0x62, 0x63, 0x64, 0x2b, 0x65, 0x00 }; /* abc*d */ 160150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 160250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 160350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 160450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&text1, str_abcccd, -1, &status); 160550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text2Chars, str_abcccxd, sizeof(text2)/2); 160650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUChars(&text2, text2Chars, -1, &status); 160750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 160850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&patternText, str_abcd, -1, &status); 160950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(&patternText, 0, NULL, &status); 161050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 161150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* First set a UText */ 161250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setUText(re, &text1, &status); 161350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultText = uregex_getUText(re, NULL, &status); 161450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 161550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(resultText != &text1); 161650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_setNativeIndex(resultText, 0); 161750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_setNativeIndex(&text1, 0); 161883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius TEST_ASSERT(testUTextEqual(resultText, &text1)); 161950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(resultText); 162050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 162150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_getText(re, &textLength, &status); /* flattens UText into buffer */ 162259d709d503bab6e2b61931737e662dd293b40578ccornelius (void)result; /* Suppress set but not used warning. */ 162350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(textLength == -1 || textLength == 6); 162450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultText = uregex_getUText(re, NULL, &status); 162550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 162650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(resultText != &text1); 162750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_setNativeIndex(resultText, 0); 162850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_setNativeIndex(&text1, 0); 162983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius TEST_ASSERT(testUTextEqual(resultText, &text1)); 163050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(resultText); 163150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 163250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Then set a UChar * */ 163350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text2Chars, 7, &status); 163450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho resultText = uregex_getUText(re, NULL, &status); 163550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 163650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_setNativeIndex(resultText, 0); 163750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_setNativeIndex(&text2, 0); 163883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius TEST_ASSERT(testUTextEqual(resultText, &text2)); 163950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(resultText); 164050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_getText(re, &textLength, &status); 164150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(textLength == 7); 164250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 164350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 164450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&text1); 164550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&text2); 164650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 164750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 164850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 164950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * matches() 165050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 165150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 165250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText text1 = UTEXT_INITIALIZER; 165350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result; 165450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText nullText = UTEXT_INITIALIZER; 165550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcccde[] = { 0x61, 0x62, 0x63, 0x63, 0x63, 0x64, 0x65, 0x00 }; /* abcccde */ 165650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcd[] = { 0x61, 0x62, 0x63, 0x2a, 0x64, 0x00 }; /* abc*d */ 165750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 165850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 165950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&text1, str_abcccde, -1, &status); 166050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&patternText, str_abcd, -1, &status); 166150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openUText(&patternText, 0, NULL, &status); 166250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 166350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setUText(re, &text1, &status); 166450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_matches(re, 0, &status); 166550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == FALSE); 166650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 166750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 166850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 166950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 167050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC(".?", 0, NULL, &status); 167150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setUText(re, &text1, &status); 167250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_matches(re, 7, &status); 167350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 167450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 167550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 167650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 167750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&nullText, "", -1, &status); 167850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setUText(re, &nullText, &status); 167950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 168050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_matches(re, 0, &status); 168150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 168250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 168350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 168450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 168550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&text1); 168650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&nullText); 168750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 168850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 168950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 169050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 169150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * lookingAt() Used in setText test. 169250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 169350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 169450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 169550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 169650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * find(), findNext, start, end, reset 169750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 169850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 169950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text1[50]; 170050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result; 170150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text1, "012rx5rx890rxrx...", sizeof(text1)/2); 170250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 170350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC("rx", 0, NULL, &status); 170450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 170550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text1, -1, &status); 170650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_find(re, 0, &status); 170750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 170850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_start(re, 0, &status) == 3); 170950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_end(re, 0, &status) == 5); 171050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 171150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 171250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_find(re, 9, &status); 171350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 171450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_start(re, 0, &status) == 11); 171550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_end(re, 0, &status) == 13); 171650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 171750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 171850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_find(re, 14, &status); 171950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == FALSE); 172050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 172150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 172250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 172350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_reset(re, 0, &status); 172450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 172550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_findNext(re, &status); 172650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 172750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_start(re, 0, &status) == 3); 172850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_end(re, 0, &status) == 5); 172950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 173050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 173150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_findNext(re, &status); 173250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 173350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_start(re, 0, &status) == 6); 173450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_end(re, 0, &status) == 8); 173550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 173650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 173750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 173850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_reset(re, 12, &status); 173950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 174050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_findNext(re, &status); 174150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == TRUE); 174250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_start(re, 0, &status) == 13); 174350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(uregex_end(re, 0, &status) == 15); 174450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 174550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 174650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_findNext(re, &status); 174750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result == FALSE); 174850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 174950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 175050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 175150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 175250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 175350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 175450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * group() 175550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 175650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 175750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text1[80]; 175850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *actual; 175950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool result; 176050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 176150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_abcinteriordef[] = { 0x61, 0x62, 0x63, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x66, 0x00 }; /* abc interior def */ 176250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_interior[] = { 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x00 }; /* ' interior ' */ 176350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 176450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 176550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text1, "noise abc interior def, and this is off the end", sizeof(text1)/2); 176650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 176750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 176850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC("abc(.*?)def", 0, NULL, &status); 176950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 177050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 177150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text1, -1, &status); 177250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_find(re, 0, &status); 177350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(result==TRUE); 177450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 177550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Capture Group 0, the full match. Should succeed. */ 177650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 177727f654740f2a26ad62a5c155af9199af9e69b889claireho actual = uregex_groupUTextDeep(re, 0, NULL, &status); 177850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 177950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_abcinteriordef, actual); 178050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(actual); 178150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 178227f654740f2a26ad62a5c155af9199af9e69b889claireho /* Capture Group 0 with shallow clone API. Should succeed. */ 178327f654740f2a26ad62a5c155af9199af9e69b889claireho status = U_ZERO_ERROR; 178427f654740f2a26ad62a5c155af9199af9e69b889claireho { 178527f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t group_len; 178627f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t len16; 178727f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode shallowStatus = U_ZERO_ERROR; 178827f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t nativeIndex; 178927f654740f2a26ad62a5c155af9199af9e69b889claireho UChar *groupChars; 179027f654740f2a26ad62a5c155af9199af9e69b889claireho UText groupText = UTEXT_INITIALIZER; 179127f654740f2a26ad62a5c155af9199af9e69b889claireho 179227f654740f2a26ad62a5c155af9199af9e69b889claireho actual = uregex_groupUText(re, 0, NULL, &group_len, &status); 179327f654740f2a26ad62a5c155af9199af9e69b889claireho TEST_ASSERT_SUCCESS(status); 179427f654740f2a26ad62a5c155af9199af9e69b889claireho 179527f654740f2a26ad62a5c155af9199af9e69b889claireho nativeIndex = utext_getNativeIndex(actual); 179627f654740f2a26ad62a5c155af9199af9e69b889claireho /* Following returns U_INDEX_OUTOFBOUNDS_ERROR... looks like a bug in ucstrFuncs UTextFuncs [utext.cpp] */ 179727f654740f2a26ad62a5c155af9199af9e69b889claireho /* len16 = utext_extract(actual, nativeIndex, nativeIndex + group_len, NULL, 0, &shallowStatus); */ 1798b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho len16 = (int32_t)group_len; 179927f654740f2a26ad62a5c155af9199af9e69b889claireho 180027f654740f2a26ad62a5c155af9199af9e69b889claireho groupChars = (UChar *)malloc(sizeof(UChar)*(len16+1)); 180127f654740f2a26ad62a5c155af9199af9e69b889claireho utext_extract(actual, nativeIndex, nativeIndex + group_len, groupChars, len16+1, &shallowStatus); 180227f654740f2a26ad62a5c155af9199af9e69b889claireho 180327f654740f2a26ad62a5c155af9199af9e69b889claireho utext_openUChars(&groupText, groupChars, len16, &shallowStatus); 180427f654740f2a26ad62a5c155af9199af9e69b889claireho 180527f654740f2a26ad62a5c155af9199af9e69b889claireho TEST_ASSERT_UTEXT(str_abcinteriordef, &groupText); 180627f654740f2a26ad62a5c155af9199af9e69b889claireho utext_close(&groupText); 180727f654740f2a26ad62a5c155af9199af9e69b889claireho free(groupChars); 180827f654740f2a26ad62a5c155af9199af9e69b889claireho } 180927f654740f2a26ad62a5c155af9199af9e69b889claireho utext_close(actual); 181027f654740f2a26ad62a5c155af9199af9e69b889claireho 181150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Capture group #1. Should succeed. */ 181250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 181327f654740f2a26ad62a5c155af9199af9e69b889claireho actual = uregex_groupUTextDeep(re, 1, NULL, &status); 181450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 181550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_interior, actual); 181650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(actual); 181750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 181850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Capture group out of range. Error. */ 181950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 182027f654740f2a26ad62a5c155af9199af9e69b889claireho actual = uregex_groupUTextDeep(re, 2, NULL, &status); 182150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(status == U_INDEX_OUTOFBOUNDS_ERROR); 182250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(utext_nativeLength(actual) == 0); 182350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(actual); 182450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 182550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 182650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 182750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 182850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 182950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 183050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * replaceFirst() 183150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 183250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 183350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text1[80]; 183450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text2[80]; 183550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText replText = UTEXT_INITIALIZER; 183650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *result; 183750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_Replxxx[] = { 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3c, 0x61, 0x61, 0x3e, 0x20, 0x78, 0x31, 0x78, 0x20, 0x78, 0x2e, 0x2e, 0x2e, 0x78, 0x2e, 0x00 }; /* Replace <aa> x1x x...x. */ 183850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_Nomatchhere[] = { 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x00 }; /* No match here. */ 183950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_u00411U00000042a[] = { 0x5c, 0x5c, 0x5c, 0x75, 0x30, 0x30, 0x34, 0x31, 0x24, 0x31, 0x5c, 0x55, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x32, 0x24, 0x5c, 0x61, 0x00 }; /* \\\u0041$1\U00000042$\a */ 184050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_1x[] = { 0x3c, 0x24, 0x31, 0x3e, 0x00 }; /* <$1> */ 184150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_ReplaceAaaBax1xxx[] = { 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x5c, 0x41, 0x61, 0x61, 0x42, 0x24, 0x61, 0x20, 0x78, 0x31, 0x78, 0x20, 0x78, 0x2e, 0x2e, 0x2e, 0x78, 0x2e, 0x00 }; /* Replace \AaaB$a x1x x...x. */ 184250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 184350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text1, "Replace xaax x1x x...x.", sizeof(text1)/2); 184450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text2, "No match here.", sizeof(text2)/2); 184550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&replText, str_1x, -1, &status); 184650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 184750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC("x(.*?)x", 0, NULL, &status); 184850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 184950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 185050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Normal case, with match */ 185150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text1, -1, &status); 185250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_replaceFirstUText(re, &replText, NULL, &status); 185350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 185450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_Replxxx, result); 185550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(result); 185650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 185750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* No match. Text should copy to output with no changes. */ 185850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text2, -1, &status); 185950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_replaceFirstUText(re, &replText, NULL, &status); 186050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 186150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_Nomatchhere, result); 186250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(result); 186350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 186450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Unicode escapes */ 186550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text1, -1, &status); 186650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&replText, str_u00411U00000042a, -1, &status); 186750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_replaceFirstUText(re, &replText, NULL, &status); 186850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 186950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_ReplaceAaaBax1xxx, result); 187050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(result); 187150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 187250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 187350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&replText); 187450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 187550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 187650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 187750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 187850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * replaceAll() 187950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 188050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 188150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text1[80]; 188250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text2[80]; 188350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText replText = UTEXT_INITIALIZER; 188450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *result; 188550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_1[] = { 0x3c, 0x24, 0x31, 0x3e, 0x00 }; /* <$1> */ 188650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_Replaceaa1[] = { 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x3c, 0x61, 0x61, 0x3e, 0x20, 0x3c, 0x31, 0x3e, 0x20, 0x3c, 0x2e, 0x2e, 0x2e, 0x3e, 0x2e, 0x00 }; /* Replace <aa> <1> <...>. */ 188750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_Nomatchhere[] = { 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x00 }; /* No match here. */ 188850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 188950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text1, "Replace xaax x1x x...x.", sizeof(text1)/2); 189050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text2, "No match here.", sizeof(text2)/2); 189150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUTF8(&replText, str_1, -1, &status); 189250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 189350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC("x(.*?)x", 0, NULL, &status); 189450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 189550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 189650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Normal case, with match */ 189750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text1, -1, &status); 189850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_replaceAllUText(re, &replText, NULL, &status); 189950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 190050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_Replaceaa1, result); 190150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(result); 190250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 190350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* No match. Text should copy to output with no changes. */ 190450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text2, -1, &status); 190550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho result = uregex_replaceAllUText(re, &replText, NULL, &status); 190650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 190750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_Nomatchhere, result); 190850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(result); 190950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 191050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 191150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&replText); 191250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 191350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 191450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 191550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 191650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * appendReplacement() 191750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 191850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 191950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text[100]; 192050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar repl[100]; 192150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar buf[100]; 192250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *bufPtr; 192350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t bufCap; 192450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 192550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 192650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC(".*", 0, 0, &status); 192750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 192850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 192950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text, "whatever", sizeof(text)/2); 193050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(repl, "some other", sizeof(repl)/2); 193150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, text, -1, &status); 193250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 193350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* match covers whole target string */ 193450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_find(re, 0, &status); 193550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 193650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bufPtr = buf; 193750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bufCap = sizeof(buf) / 2; 193850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status); 193950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 194050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_STRING("some other", buf, TRUE); 194150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 194250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Match has \u \U escapes */ 194350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_find(re, 0, &status); 194450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 194550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bufPtr = buf; 194650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bufCap = sizeof(buf) / 2; 194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(repl, "abc\\u0041\\U00000042 \\\\ $ \\abc", sizeof(repl)/2); 194850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_appendReplacement(re, repl, -1, &bufPtr, &bufCap, &status); 194950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_STRING("abcAB \\ $ abc", buf, TRUE); 195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 195350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 195450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 195650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 195750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * appendReplacement(), appendTail() checked in replaceFirst(), replaceAll(). 195850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 195950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * splitUText() 196250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 196350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 196450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar textToSplit[80]; 196550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar text2[80]; 196650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *fields[10]; 196750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t numFields; 196850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t i; 196950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(textToSplit, "first : second: third", sizeof(textToSplit)/2); 197150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(text2, "No match here.", sizeof(text2)/2); 197250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 197350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 197450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC(":", 0, NULL, &status); 197550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 197650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 197750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Simple split */ 197850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 197950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, textToSplit, -1, &status); 198050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 198150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 198250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 198350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_SUCCESS(status)) { 198450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(fields, 0, sizeof(fields)); 198550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numFields = uregex_splitUText(re, fields, 10, &status); 198650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 198750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 198850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 198950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 199050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* 'first ' */ 199150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /* ' second' */ 199250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* ' third' */ 199350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(numFields == 3); 199450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_first, fields[0]); 199550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_second, fields[1]); 199650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_third, fields[2]); 199750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[3] == NULL); 199850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 199950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < numFields; i++) { 200050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(fields[i]); 200150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 200250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 200350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 200450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 200550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 200650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 200750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Split with too few output strings available */ 200850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 200950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC(":", 0, NULL, &status); 201050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, textToSplit, -1, &status); 201150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 201250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 201350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 201450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 201550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[0] = NULL; 201650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[1] = NULL; 201750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[2] = &patternText; 201850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numFields = uregex_splitUText(re, fields, 2, &status); 201950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 202050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 202150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 202250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 202350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first */ 202450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_secondthird[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x3a, 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* second: third */ 202550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(numFields == 2); 202650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_first, fields[0]); 202750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_secondthird, fields[1]); 202850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[2] == &patternText); 202950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < numFields; i++) { 203150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(fields[i]); 203250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 203550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 203650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 203750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 203850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* splitUText(), part 2. Patterns with capture groups. The capture group text 203950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * comes out as additional fields. */ 204050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho { 204150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar textToSplit[80]; 204250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *fields[10]; 204350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t numFields; 204450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t i; 204550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 204650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_uastrncpy(textToSplit, "first <tag-a> second<tag-b> third", sizeof(textToSplit)/2); 204750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 204850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 204950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re = uregex_openC("<(.*?)>", 0, NULL, &status); 205050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 205150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, textToSplit, -1, &status); 205250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 205350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 205450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 205550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 205650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(fields, 0, sizeof(fields)); 205750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numFields = uregex_splitUText(re, fields, 10, &status); 205850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 205950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 206050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 206150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 206250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first */ 206350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */ 206450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /* second */ 206550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */ 206650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* third */ 206750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 206850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(numFields == 5); 206950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_first, fields[0]); 207050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_taga, fields[1]); 207150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_second, fields[2]); 207250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_tagb, fields[3]); 207350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_third, fields[4]); 207450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[5] == NULL); 207550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 207650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < numFields; i++) { 207750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(fields[i]); 207850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 207950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 208050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 208150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Split with too few output strings available (2) */ 208250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 208350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[0] = NULL; 208450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[1] = NULL; 208550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[2] = &patternText; 208650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numFields = uregex_splitUText(re, fields, 2, &status); 208750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 208850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 208950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 209050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 209150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first */ 209250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_secondtagbthird[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x3c, 0x74, 0x61, 0x67, 0x2d, 0x62, 0x3e, 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* second<tag-b> third */ 209350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(numFields == 2); 209450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_first, fields[0]); 209550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_secondtagbthird, fields[1]); 209650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[2] == &patternText); 209750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 209850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < numFields; i++) { 209950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(fields[i]); 210050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 210150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 210250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 210350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Split with too few output strings available (3) */ 210450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 210550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[0] = NULL; 210650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[1] = NULL; 210750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[2] = NULL; 210850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[3] = &patternText; 210950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numFields = uregex_splitUText(re, fields, 3, &status); 211050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 211150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 211250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 211350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 211450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first */ 211550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */ 211650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_secondtagbthird[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x3c, 0x74, 0x61, 0x67, 0x2d, 0x62, 0x3e, 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* second<tag-b> third */ 211750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(numFields == 3); 211850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_first, fields[0]); 211950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_taga, fields[1]); 212050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_secondtagbthird, fields[2]); 212150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[3] == &patternText); 212250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 212350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < numFields; i++) { 212450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(fields[i]); 212550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 212650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 212750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Split with just enough output strings available (5) */ 212850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 212950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[0] = NULL; 213050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[1] = NULL; 213150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[2] = NULL; 213250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[3] = NULL; 213350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[4] = NULL; 213450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[5] = &patternText; 213550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numFields = uregex_splitUText(re, fields, 5, &status); 213650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 213750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 213850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 213950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 214050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first */ 214150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */ 214250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /* second */ 214350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */ 214450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_third[] = { 0x20, 0x20, 0x74, 0x68, 0x69, 0x72, 0x64, 0x00 }; /* third */ 214550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 214650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(numFields == 5); 214750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_first, fields[0]); 214850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_taga, fields[1]); 214950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_second, fields[2]); 215050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_tagb, fields[3]); 215150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_third, fields[4]); 215250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[5] == &patternText); 215350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 215450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < numFields; i++) { 215550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(fields[i]); 215650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 215750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 215850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Split, end of text is a field delimiter. */ 215950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho status = U_ZERO_ERROR; 216050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_setText(re, textToSplit, strlen("first <tag-a> second<tag-b>"), &status); 216150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 216250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 216350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 216450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 216550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho memset(fields, 0, sizeof(fields)); 216650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fields[9] = &patternText; 216750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho numFields = uregex_splitUText(re, fields, 9, &status); 216850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_SUCCESS(status); 216950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 217050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* The TEST_ASSERT_SUCCESS call above should change too... */ 217150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_SUCCESS(status)) { 217250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_first[] = { 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x00 }; /* first */ 217350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_taga[] = { 0x74, 0x61, 0x67, 0x2d, 0x61, 0x00 }; /* tag-a */ 217450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_second[] = { 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x00 }; /* second */ 217550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char str_tagb[] = { 0x74, 0x61, 0x67, 0x2d, 0x62, 0x00 }; /* tag-b */ 2176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char str_empty[] = { 0x00 }; 217750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(numFields == 5); 217950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_first, fields[0]); 218050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_taga, fields[1]); 218150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_second, fields[2]); 218250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT_UTEXT(str_tagb, fields[3]); 2183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT_UTEXT(str_empty, fields[4]); 2184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(fields[5] == NULL); 218550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[8] == NULL); 218650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho TEST_ASSERT(fields[9] == &patternText); 218750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 218850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < numFields; i++) { 218950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(fields[i]); 219050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 219150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 219250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 219350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_close(re); 219450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 219550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&patternText); 219650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 219750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 21992e615e9896b12236afe0ff2695e8afc2ee73f961clairehostatic void TestRefreshInput(void) { 22002e615e9896b12236afe0ff2695e8afc2ee73f961claireho /* 22012e615e9896b12236afe0ff2695e8afc2ee73f961claireho * RefreshInput changes out the input of a URegularExpression without 22022e615e9896b12236afe0ff2695e8afc2ee73f961claireho * changing anything else in the match state. Used with Java JNI, 22032e615e9896b12236afe0ff2695e8afc2ee73f961claireho * when Java moves the underlying string storage. This test 22042e615e9896b12236afe0ff2695e8afc2ee73f961claireho * runs a find() loop, moving the text after the first match. 22052e615e9896b12236afe0ff2695e8afc2ee73f961claireho * The right number of matches should still be found. 22062e615e9896b12236afe0ff2695e8afc2ee73f961claireho */ 22072e615e9896b12236afe0ff2695e8afc2ee73f961claireho UChar testStr[] = {0x41, 0x20, 0x42, 0x20, 0x43, 0x0}; /* = "A B C" */ 22082e615e9896b12236afe0ff2695e8afc2ee73f961claireho UChar movedStr[] = { 0, 0, 0, 0, 0, 0}; 22092e615e9896b12236afe0ff2695e8afc2ee73f961claireho UErrorCode status = U_ZERO_ERROR; 22102e615e9896b12236afe0ff2695e8afc2ee73f961claireho URegularExpression *re; 22112e615e9896b12236afe0ff2695e8afc2ee73f961claireho UText ut1 = UTEXT_INITIALIZER; 22122e615e9896b12236afe0ff2695e8afc2ee73f961claireho UText ut2 = UTEXT_INITIALIZER; 2213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 22142e615e9896b12236afe0ff2695e8afc2ee73f961claireho re = uregex_openC("[ABC]", 0, 0, &status); 22152e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT_SUCCESS(status); 22162e615e9896b12236afe0ff2695e8afc2ee73f961claireho 22172e615e9896b12236afe0ff2695e8afc2ee73f961claireho utext_openUChars(&ut1, testStr, -1, &status); 22182e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT_SUCCESS(status); 22192e615e9896b12236afe0ff2695e8afc2ee73f961claireho uregex_setUText(re, &ut1, &status); 22202e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT_SUCCESS(status); 22212e615e9896b12236afe0ff2695e8afc2ee73f961claireho 22222e615e9896b12236afe0ff2695e8afc2ee73f961claireho /* Find the first match "A" in the original string */ 22232e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT(uregex_findNext(re, &status)); 22242e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT(uregex_start(re, 0, &status) == 0); 2225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 22262e615e9896b12236afe0ff2695e8afc2ee73f961claireho /* Move the string, kill the original string. */ 22272e615e9896b12236afe0ff2695e8afc2ee73f961claireho u_strcpy(movedStr, testStr); 22282e615e9896b12236afe0ff2695e8afc2ee73f961claireho u_memset(testStr, 0, u_strlen(testStr)); 22292e615e9896b12236afe0ff2695e8afc2ee73f961claireho utext_openUChars(&ut2, movedStr, -1, &status); 22302e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT_SUCCESS(status); 22312e615e9896b12236afe0ff2695e8afc2ee73f961claireho uregex_refreshUText(re, &ut2, &status); 22322e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT_SUCCESS(status); 22332e615e9896b12236afe0ff2695e8afc2ee73f961claireho 22342e615e9896b12236afe0ff2695e8afc2ee73f961claireho /* Find the following two matches, now working in the moved string. */ 22352e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT(uregex_findNext(re, &status)); 22362e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT(uregex_start(re, 0, &status) == 2); 22372e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT(uregex_findNext(re, &status)); 22382e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT(uregex_start(re, 0, &status) == 4); 22392e615e9896b12236afe0ff2695e8afc2ee73f961claireho TEST_ASSERT(FALSE == uregex_findNext(re, &status)); 22402e615e9896b12236afe0ff2695e8afc2ee73f961claireho 22412e615e9896b12236afe0ff2695e8afc2ee73f961claireho uregex_close(re); 22422e615e9896b12236afe0ff2695e8afc2ee73f961claireho} 22432e615e9896b12236afe0ff2695e8afc2ee73f961claireho 2244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestBug8421(void) { 2246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* Bug 8421: setTimeLimit on a regular expresssion before setting text to be matched 2247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * was failing. 2248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho */ 2249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho URegularExpression *re; 2250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode status = U_ZERO_ERROR; 2251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t limit = -1; 2252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho re = uregex_openC("abc", 0, 0, &status); 2254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT_SUCCESS(status); 2255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho limit = uregex_getTimeLimit(re, &status); 2257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT_SUCCESS(status); 2258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(limit == 0); 2259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uregex_setTimeLimit(re, 100, &status); 2261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT_SUCCESS(status); 2262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho limit = uregex_getTimeLimit(re, &status); 2263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT_SUCCESS(status); 2264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho TEST_ASSERT(limit == 100); 2265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2266b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uregex_close(re); 2267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 2268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2269b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 2270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS */ 2271