1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 31b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert* Copyright (C) 2004-2015, International Business Machines 4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 659d709d503bab6e2b61931737e662dd293b40578ccornelius* file name: uregex.cpp 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_REGULAR_EXPRESSIONS 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/regex.h" 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uregex.h" 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unistr.h" 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uobject.h" 19103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "uassert.h" 221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "uhash.h" 231b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "umutex.h" 241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert#include "uvectr32.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "regextxt.h" 2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_BEGIN 2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define REMAINING_CAPACITY(idx,len) ((((len)-(idx))>0)?((len)-(idx)):0) 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostruct RegularExpression: public UMemory { 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic: 3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression(); 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ~RegularExpression(); 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t fMagic; 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RegexPattern *fPat; 3859d709d503bab6e2b61931737e662dd293b40578ccornelius u_atomic_int32_t *fPatRefCount; 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *fPatString; 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t fPatStringLen; 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RegexMatcher *fMatcher; 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *fText; // Text from setText() 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t fTextLength; // Length provided by user with setText(), which 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // may be -1. 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool fOwnsText; 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t REXP_MAGIC = 0x72657870; // "rexp" in ASCII 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoRegularExpression::RegularExpression() { 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMagic = REXP_MAGIC; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPat = NULL; 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPatRefCount = NULL; 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPatString = NULL; 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fPatStringLen = 0; 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMatcher = NULL; 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fText = NULL; 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fTextLength = 0; 5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fOwnsText = FALSE; 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoRegularExpression::~RegularExpression() { 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fMatcher; 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMatcher = NULL; 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (fPatRefCount!=NULL && umtx_atomic_dec(fPatRefCount)==0) { 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete fPat; 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(fPatString); 6859d709d503bab6e2b61931737e662dd293b40578ccornelius uprv_free((void *)fPatRefCount); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (fOwnsText && fText!=NULL) { 7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free((void *)fText); 7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fMagic = 0; 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_END 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_USE 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// validateRE Do boilerplate style checks on API function parameters. 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Return TRUE if they look OK. 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic UBool validateRE(const RegularExpression *re, UBool requiresText, UErrorCode *status) { 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (re == NULL || re->fMagic != REXP_MAGIC) { 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // !!! Not sure how to update this with the new UText backing, which is stored in re->fMatcher anyway 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (requiresText && re->fText == NULL && !re->fOwnsText) { 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_REGEX_INVALID_STATE; 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return TRUE; 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_open 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI URegularExpression * U_EXPORT2 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuregex_open( const UChar *pattern, 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t patternLength, 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t flags, 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError *pe, 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pattern == NULL || patternLength < -1 || patternLength == 0) { 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t actualPatLen = patternLength; 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (actualPatLen == -1) { 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru actualPatLen = u_strlen(pattern); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 12559d709d503bab6e2b61931737e662dd293b40578ccornelius RegularExpression *re = new RegularExpression; 12659d709d503bab6e2b61931737e662dd293b40578ccornelius u_atomic_int32_t *refC = (u_atomic_int32_t *)uprv_malloc(sizeof(int32_t)); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *patBuf = (UChar *)uprv_malloc(sizeof(UChar)*(actualPatLen+1)); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (re == NULL || refC == NULL || patBuf == NULL) { 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete re; 13159d709d503bab6e2b61931737e662dd293b40578ccornelius uprv_free((void *)refC); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(patBuf); 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re->fPatRefCount = refC; 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *re->fPatRefCount = 1; 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Make a copy of the pattern string, so we can return it later if asked. 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // For compiling the pattern, we will use a UText wrapper around 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // this local copy, to avoid making even more copies. 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re->fPatString = patBuf; 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re->fPatStringLen = patternLength; 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_memcpy(patBuf, pattern, actualPatLen); 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patBuf[actualPatLen] = 0; 147f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText patText = UTEXT_INITIALIZER; 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUChars(&patText, patBuf, patternLength, status); 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Compile the pattern 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pe != NULL) { 15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fPat = RegexPattern::compile(&patText, flags, *pe, *status); 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fPat = RegexPattern::compile(&patText, flags, *status); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&patText); 160f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto ErrorExit; 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Create the matcher object 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru re->fMatcher = re->fPat->matcher(*status); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_SUCCESS(*status)) { 17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return (URegularExpression*)re; 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruErrorExit: 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete re; 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_openUText 18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 18350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//---------------------------------------------------------------------------------------- 18450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI URegularExpression * U_EXPORT2 18550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_openUText(UText *pattern, 18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uint32_t flags, 18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UParseError *pe, 18850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 189f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(*status)) { 19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (pattern == NULL) { 19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_ILLEGAL_ARGUMENT_ERROR; 19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 197f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int64_t patternNativeLength = utext_nativeLength(pattern); 199f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (patternNativeLength == 0) { 20150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_ILLEGAL_ARGUMENT_ERROR; 20250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 20350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 204f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 20550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *re = new RegularExpression; 206f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode lengthStatus = U_ZERO_ERROR; 20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t pattern16Length = utext_extract(pattern, 0, patternNativeLength, NULL, 0, &lengthStatus); 209f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 21059d709d503bab6e2b61931737e662dd293b40578ccornelius u_atomic_int32_t *refC = (u_atomic_int32_t *)uprv_malloc(sizeof(int32_t)); 21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *patBuf = (UChar *)uprv_malloc(sizeof(UChar)*(pattern16Length+1)); 21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (re == NULL || refC == NULL || patBuf == NULL) { 21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_MEMORY_ALLOCATION_ERROR; 21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete re; 21559d709d503bab6e2b61931737e662dd293b40578ccornelius uprv_free((void *)refC); 21650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free(patBuf); 21750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 21850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 21950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fPatRefCount = refC; 22050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *re->fPatRefCount = 1; 221f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Make a copy of the pattern string, so we can return it later if asked. 22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // For compiling the pattern, we will use a read-only UText wrapper 22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // around this local copy, to avoid making even more copies. 22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fPatString = patBuf; 22850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fPatStringLen = pattern16Length; 22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_extract(pattern, 0, patternNativeLength, patBuf, pattern16Length+1, status); 230f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText patText = UTEXT_INITIALIZER; 23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUChars(&patText, patBuf, pattern16Length, status); 233f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 23550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Compile the pattern 23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 23750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (pe != NULL) { 23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fPat = RegexPattern::compile(&patText, flags, *pe, *status); 23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fPat = RegexPattern::compile(&patText, flags, *status); 24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&patText); 243f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(*status)) { 24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho goto ErrorExit; 24650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 247f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Create the matcher object 25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho re->fMatcher = re->fPat->matcher(*status); 25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_SUCCESS(*status)) { 25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return (URegularExpression*)re; 25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 255f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 25650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoErrorExit: 25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho delete re; 25850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return NULL; 259f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 26250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//---------------------------------------------------------------------------------------- 26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_close 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2 26850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_close(URegularExpression *re2) { 26950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *re = (RegularExpression*)re2; 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(re, FALSE, &status) == FALSE) { 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete re; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_clone 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//---------------------------------------------------------------------------------------- 283f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI URegularExpression * U_EXPORT2 28450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_clone(const URegularExpression *source2, UErrorCode *status) { 28550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *source = (RegularExpression*)source2; 286b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(source, FALSE, status) == FALSE) { 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *clone = new RegularExpression; 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (clone == NULL) { 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone->fMatcher = source->fPat->matcher(*status); 297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete clone; 299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone->fPat = source->fPat; 303f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius clone->fPatRefCount = source->fPatRefCount; 304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone->fPatString = source->fPatString; 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clone->fPatStringLen = source->fPatStringLen; 306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru umtx_atomic_inc(source->fPatRefCount); 307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Note: fText is not cloned. 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return (URegularExpression*)clone; 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_pattern 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 320f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI const UChar * U_EXPORT2 32150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_pattern(const URegularExpression *regexp2, 32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *patLength, 32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 325f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 326b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (patLength != NULL) { 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *patLength = regexp->fPatStringLen; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return regexp->fPatString; 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 33850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_patternUText 33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 34150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI UText * U_EXPORT2 34250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_patternUText(const URegularExpression *regexp2, 34350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 34450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 34527f654740f2a26ad62a5c155af9199af9e69b889claireho return regexp->fPat->patternText(*status); 34650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 34750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 34850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_flags 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 354f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 35550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_flags(const URegularExpression *regexp2, UErrorCode *status) { 35650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t flags = regexp->fPat->flags(); 361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return flags; 362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_setText 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 370f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 37150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_setText(URegularExpression *regexp2, 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *text, 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t textLength, 374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 37550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 376b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (text == NULL || textLength < -1) { 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 383f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 38450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (regexp->fOwnsText && regexp->fText != NULL) { 38550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free((void *)regexp->fText); 38650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 387f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru regexp->fText = text; 389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru regexp->fTextLength = textLength; 39050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fOwnsText = FALSE; 391f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 39250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText input = UTEXT_INITIALIZER; 39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_openUChars(&input, text, textLength, status); 39450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fMatcher->reset(&input); 39550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_close(&input); // reset() made a shallow clone, so we don't need this copy 39650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_setUText 40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 404f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 40550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_setUText(URegularExpression *regexp2, 40650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *text, 40750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 409b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 41150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 41250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (text == NULL) { 41350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_ILLEGAL_ARGUMENT_ERROR; 41450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return; 41550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 416f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 41750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (regexp->fOwnsText && regexp->fText != NULL) { 41850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free((void *)regexp->fText); 41950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 420f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 42150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fText = NULL; // only fill it in on request 42250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fTextLength = -1; 42350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fOwnsText = TRUE; 42450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fMatcher->reset(text); 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_getText 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 434f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI const UChar * U_EXPORT2 43550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_getText(URegularExpression *regexp2, 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t *textLength, 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 43850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 439b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 442f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 44350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (regexp->fText == NULL) { 44450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // need to fill in the text 44550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *inputText = regexp->fMatcher->inputText(); 44650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int64_t inputNativeLength = utext_nativeLength(inputText); 44750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (UTEXT_FULL_TEXT_IN_CHUNK(inputText, inputNativeLength)) { 44850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fText = inputText->chunkContents; 44950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fTextLength = (int32_t)inputNativeLength; 45050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fOwnsText = FALSE; // because the UText owns it 45150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 45250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode lengthStatus = U_ZERO_ERROR; 45350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fTextLength = utext_extract(inputText, 0, inputNativeLength, NULL, 0, &lengthStatus); // buffer overflow error 45450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *inputChars = (UChar *)uprv_malloc(sizeof(UChar)*(regexp->fTextLength+1)); 455f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 45650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho utext_extract(inputText, 0, inputNativeLength, inputChars, regexp->fTextLength+1, status); 45750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fText = inputChars; 45850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fOwnsText = TRUE; // should already be set but just in case 45950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 46050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 461f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (textLength != NULL) { 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *textLength = regexp->fTextLength; 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return regexp->fText; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 47150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_getUText 47250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 47350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 474f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UText * U_EXPORT2 47550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_getUText(URegularExpression *regexp2, 47650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *dest, 47750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 47850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 479b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 48050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return dest; 48150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 48227f654740f2a26ad62a5c155af9199af9e69b889claireho return regexp->fMatcher->getInput(dest, *status); 48350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 48450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4862e615e9896b12236afe0ff2695e8afc2ee73f961claireho//------------------------------------------------------------------------------ 4872e615e9896b12236afe0ff2695e8afc2ee73f961claireho// 4882e615e9896b12236afe0ff2695e8afc2ee73f961claireho// uregex_refreshUText 4892e615e9896b12236afe0ff2695e8afc2ee73f961claireho// 4902e615e9896b12236afe0ff2695e8afc2ee73f961claireho//------------------------------------------------------------------------------ 491f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 4922e615e9896b12236afe0ff2695e8afc2ee73f961clairehouregex_refreshUText(URegularExpression *regexp2, 4932e615e9896b12236afe0ff2695e8afc2ee73f961claireho UText *text, 4942e615e9896b12236afe0ff2695e8afc2ee73f961claireho UErrorCode *status) { 4952e615e9896b12236afe0ff2695e8afc2ee73f961claireho RegularExpression *regexp = (RegularExpression*)regexp2; 496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 4972e615e9896b12236afe0ff2695e8afc2ee73f961claireho return; 4982e615e9896b12236afe0ff2695e8afc2ee73f961claireho } 4992e615e9896b12236afe0ff2695e8afc2ee73f961claireho regexp->fMatcher->refreshInputText(text, *status); 5002e615e9896b12236afe0ff2695e8afc2ee73f961claireho} 501b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 5022e615e9896b12236afe0ff2695e8afc2ee73f961claireho 50350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 50450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_matches 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 508f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 50950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_matches(URegularExpression *regexp2, 51027f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t startIndex, 51127f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 51227f654740f2a26ad62a5c155af9199af9e69b889claireho return uregex_matches64( regexp2, (int64_t)startIndex, status); 51327f654740f2a26ad62a5c155af9199af9e69b889claireho} 51427f654740f2a26ad62a5c155af9199af9e69b889claireho 515f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 51627f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_matches64(URegularExpression *regexp2, 51727f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t startIndex, 51827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 51950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 520c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool result = FALSE; 521b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 522c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return result; 523c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 524c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (startIndex == -1) { 525c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result = regexp->fMatcher->matches(*status); 526c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 527c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result = regexp->fMatcher->matches(startIndex, *status); 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_lookingAt 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 538f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 53950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_lookingAt(URegularExpression *regexp2, 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t startIndex, 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 54227f654740f2a26ad62a5c155af9199af9e69b889claireho return uregex_lookingAt64( regexp2, (int64_t)startIndex, status); 54327f654740f2a26ad62a5c155af9199af9e69b889claireho} 54427f654740f2a26ad62a5c155af9199af9e69b889claireho 545f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 54627f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_lookingAt64(URegularExpression *regexp2, 54727f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t startIndex, 54827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 54950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 550c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool result = FALSE; 551b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 552c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return result; 553c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 554c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (startIndex == -1) { 555c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result = regexp->fMatcher->lookingAt(*status); 556c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 557c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result = regexp->fMatcher->lookingAt(startIndex, *status); 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_find 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 569f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 57050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_find(URegularExpression *regexp2, 571f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t startIndex, 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 57327f654740f2a26ad62a5c155af9199af9e69b889claireho return uregex_find64( regexp2, (int64_t)startIndex, status); 57427f654740f2a26ad62a5c155af9199af9e69b889claireho} 57527f654740f2a26ad62a5c155af9199af9e69b889claireho 576f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 57727f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_find64(URegularExpression *regexp2, 578f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int64_t startIndex, 57927f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 58050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 581c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UBool result = FALSE; 582b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 583c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return result; 584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru if (startIndex == -1) { 586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru regexp->fMatcher->resetPreserveRegion(); 587f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius result = regexp->fMatcher->find(*status); 588c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } else { 589c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru result = regexp->fMatcher->find(startIndex, *status); 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 59427f654740f2a26ad62a5c155af9199af9e69b889claireho 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_findNext 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 600f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 60150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_findNext(URegularExpression *regexp2, 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 60350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 607f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UBool result = regexp->fMatcher->find(*status); 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_groupCount 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 616f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 61750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_groupCount(URegularExpression *regexp2, 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 61950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 620b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t result = regexp->fMatcher->groupCount(); 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 6301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// uregex_groupNumberFromName 6311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// 6321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//------------------------------------------------------------------------------ 6331b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertint32_t 6341b7d32f919554dda9c193b32188251337bc756f1Fredrik Rouberturegex_groupNumberFromName(URegularExpression *regexp2, 6351b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const UChar *groupName, 6361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t nameLength, 6371b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UErrorCode *status) { 6381b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert RegularExpression *regexp = (RegularExpression*)regexp2; 6391b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (validateRE(regexp, FALSE, status) == FALSE) { 6401b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return 0; 6411b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 6421b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t result = regexp->fPat->groupNumberFromName(UnicodeString(groupName, nameLength), *status); 6431b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return result; 6441b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} 6451b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 6461b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertint32_t 6471b7d32f919554dda9c193b32188251337bc756f1Fredrik Rouberturegex_groupNumberFromCName(URegularExpression *regexp2, 6481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert const char *groupName, 6491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t nameLength, 6501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UErrorCode *status) { 6511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert RegularExpression *regexp = (RegularExpression*)regexp2; 6521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (validateRE(regexp, FALSE, status) == FALSE) { 6531b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return 0; 6541b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 6551b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return regexp->fPat->groupNumberFromName(groupName, nameLength, *status); 6561b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert} 6571b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 6581b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert//------------------------------------------------------------------------------ 6591b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert// 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_group 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 663f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 66450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_group(URegularExpression *regexp2, 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t groupNum, 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *dest, 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destCapacity, 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 66950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 670b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destCapacity < 0 || (destCapacity > 0 && dest == NULL)) { 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 677f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 67850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (destCapacity == 0 || regexp->fText != NULL) { 67950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // If preflighting or if we already have the text as UChars, 6801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // this is a little cheaper than extracting from the UText 681f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 68250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 68350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Pick up the range of characters from the matcher 68450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t startIx = regexp->fMatcher->start(groupNum, *status); 68650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t endIx = regexp->fMatcher->end (groupNum, *status); 68750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(*status)) { 68850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 68950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 69150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 69250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Trim length based on buffer capacity 693f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // 69450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t fullLength = endIx - startIx; 69550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t copyLength = fullLength; 69650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (copyLength < destCapacity) { 69750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[copyLength] = 0; 69850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if (copyLength == destCapacity) { 69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_STRING_NOT_TERMINATED_WARNING; 70050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 70150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho copyLength = destCapacity; 70250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_BUFFER_OVERFLOW_ERROR; 70350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 704f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 70550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 70650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Copy capture group to user's buffer 70750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // 70850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (copyLength > 0) { 70950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_memcpy(dest, ®exp->fText[startIx], copyLength); 71050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 71150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return fullLength; 71250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 7131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int64_t start = regexp->fMatcher->start64(groupNum, *status); 7141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int64_t limit = regexp->fMatcher->end64(groupNum, *status); 7151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (U_FAILURE(*status)) { 7161b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return 0; 717fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius } 7181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Note edge cases: 7191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Group didn't match: start == end == -1. UText trims to 0, UText gives zero length result. 7201b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Zero Length Match: start == end. 7211b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t length = utext_extract(regexp->fMatcher->inputText(), start, limit, dest, destCapacity, status); 7221b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert return length; 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 7241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert 72550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 72750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 72850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 72950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 73050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_groupUText 73150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 73250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 733f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UText * U_EXPORT2 73450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_groupUText(URegularExpression *regexp2, 73550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t groupNum, 73650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *dest, 73727f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t *groupLength, 73827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 73927f654740f2a26ad62a5c155af9199af9e69b889claireho RegularExpression *regexp = (RegularExpression*)regexp2; 740b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 74127f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode emptyTextStatus = U_ZERO_ERROR; 74227f654740f2a26ad62a5c155af9199af9e69b889claireho return (dest ? dest : utext_openUChars(NULL, NULL, 0, &emptyTextStatus)); 74327f654740f2a26ad62a5c155af9199af9e69b889claireho } 74427f654740f2a26ad62a5c155af9199af9e69b889claireho 74527f654740f2a26ad62a5c155af9199af9e69b889claireho return regexp->fMatcher->group(groupNum, dest, *groupLength, *status); 74627f654740f2a26ad62a5c155af9199af9e69b889claireho} 74727f654740f2a26ad62a5c155af9199af9e69b889claireho 74827f654740f2a26ad62a5c155af9199af9e69b889claireho//------------------------------------------------------------------------------ 74927f654740f2a26ad62a5c155af9199af9e69b889claireho// 750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_start 751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 753f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 75450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_start(URegularExpression *regexp2, 755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t groupNum, 756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 75727f654740f2a26ad62a5c155af9199af9e69b889claireho return (int32_t)uregex_start64( regexp2, groupNum, status); 75827f654740f2a26ad62a5c155af9199af9e69b889claireho} 75927f654740f2a26ad62a5c155af9199af9e69b889claireho 760f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int64_t U_EXPORT2 76127f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_start64(URegularExpression *regexp2, 76227f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t groupNum, 76327f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 76450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 765b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t result = regexp->fMatcher->start(groupNum, *status); 769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_end 775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 777f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 77850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_end(URegularExpression *regexp2, 779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t groupNum, 780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 78127f654740f2a26ad62a5c155af9199af9e69b889claireho return (int32_t)uregex_end64( regexp2, groupNum, status); 78227f654740f2a26ad62a5c155af9199af9e69b889claireho} 78327f654740f2a26ad62a5c155af9199af9e69b889claireho 784f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int64_t U_EXPORT2 78527f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_end64(URegularExpression *regexp2, 78627f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t groupNum, 78727f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 78850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 789b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t result = regexp->fMatcher->end(groupNum, *status); 793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return result; 794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_reset 799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 801f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 80250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_reset(URegularExpression *regexp2, 803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t index, 804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 80527f654740f2a26ad62a5c155af9199af9e69b889claireho uregex_reset64( regexp2, (int64_t)index, status); 80627f654740f2a26ad62a5c155af9199af9e69b889claireho} 80727f654740f2a26ad62a5c155af9199af9e69b889claireho 808f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 80927f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_reset64(URegularExpression *regexp2, 81027f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t index, 81127f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 81250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 813b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru regexp->fMatcher->reset(index, *status); 817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 822c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_setRegion 823c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 824c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 825f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 82650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_setRegion(URegularExpression *regexp2, 827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t regionStart, 828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t regionLimit, 829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 83027f654740f2a26ad62a5c155af9199af9e69b889claireho uregex_setRegion64( regexp2, (int64_t)regionStart, (int64_t)regionLimit, status); 83127f654740f2a26ad62a5c155af9199af9e69b889claireho} 83227f654740f2a26ad62a5c155af9199af9e69b889claireho 833f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 83427f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_setRegion64(URegularExpression *regexp2, 83527f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t regionStart, 83627f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t regionLimit, 83727f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 83850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 839b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 840c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 841c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 842c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru regexp->fMatcher->region(regionStart, regionLimit, *status); 843c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 844c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 845c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 846c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 847c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 84827f654740f2a26ad62a5c155af9199af9e69b889claireho// uregex_setRegionAndStart 84927f654740f2a26ad62a5c155af9199af9e69b889claireho// 85027f654740f2a26ad62a5c155af9199af9e69b889claireho//------------------------------------------------------------------------------ 851f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 85227f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_setRegionAndStart(URegularExpression *regexp2, 85327f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t regionStart, 85427f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t regionLimit, 85527f654740f2a26ad62a5c155af9199af9e69b889claireho int64_t startIndex, 85627f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 85727f654740f2a26ad62a5c155af9199af9e69b889claireho RegularExpression *regexp = (RegularExpression*)regexp2; 858b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 85927f654740f2a26ad62a5c155af9199af9e69b889claireho return; 86027f654740f2a26ad62a5c155af9199af9e69b889claireho } 86127f654740f2a26ad62a5c155af9199af9e69b889claireho regexp->fMatcher->region(regionStart, regionLimit, startIndex, *status); 86227f654740f2a26ad62a5c155af9199af9e69b889claireho} 86327f654740f2a26ad62a5c155af9199af9e69b889claireho 86427f654740f2a26ad62a5c155af9199af9e69b889claireho//------------------------------------------------------------------------------ 86527f654740f2a26ad62a5c155af9199af9e69b889claireho// 866c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_regionStart 867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 869f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 87050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_regionStart(const URegularExpression *regexp2, 871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 87227f654740f2a26ad62a5c155af9199af9e69b889claireho return (int32_t)uregex_regionStart64(regexp2, status); 87327f654740f2a26ad62a5c155af9199af9e69b889claireho} 87427f654740f2a26ad62a5c155af9199af9e69b889claireho 875f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int64_t U_EXPORT2 87627f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_regionStart64(const URegularExpression *regexp2, 87727f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 87850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 879b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return 0; 881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return regexp->fMatcher->regionStart(); 883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_regionEnd 889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 891f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 89250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_regionEnd(const URegularExpression *regexp2, 893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 89427f654740f2a26ad62a5c155af9199af9e69b889claireho return (int32_t)uregex_regionEnd64(regexp2, status); 89527f654740f2a26ad62a5c155af9199af9e69b889claireho} 89627f654740f2a26ad62a5c155af9199af9e69b889claireho 897f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int64_t U_EXPORT2 89827f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_regionEnd64(const URegularExpression *regexp2, 89927f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 90050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 901b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return 0; 903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return regexp->fMatcher->regionEnd(); 905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_hasTransparentBounds 911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 913f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 91450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_hasTransparentBounds(const URegularExpression *regexp2, 915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 91650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 917b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 918c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return FALSE; 919c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return regexp->fMatcher->hasTransparentBounds(); 921c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 924c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 925c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 926c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_useTransparentBounds 927c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 928c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 929f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 93050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_useTransparentBounds(URegularExpression *regexp2, 93150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool b, 93250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 93350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 934b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 937c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru regexp->fMatcher->useTransparentBounds(b); 938c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 940c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 941c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 942c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_hasAnchoringBounds 944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 945c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 946f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 94750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_hasAnchoringBounds(const URegularExpression *regexp2, 94850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 94950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 950b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 951c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return FALSE; 952c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 953c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return regexp->fMatcher->hasAnchoringBounds(); 954c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 955c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 956c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 957c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 958c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 959c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_useAnchoringBounds 960c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 961c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 962f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 96350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_useAnchoringBounds(URegularExpression *regexp2, 96450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool b, 96550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 96650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 967b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status) == FALSE) { 968c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return; 969c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 970c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru regexp->fMatcher->useAnchoringBounds(b); 971c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 972c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 973c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 974c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 975c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 976c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_hitEnd 977c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 978c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 979f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 98050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_hitEnd(const URegularExpression *regexp2, 981c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 98250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 983b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 984c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return FALSE; 985c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 986c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return regexp->fMatcher->hitEnd(); 987c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 988c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 989c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 990c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 991c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 992c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_requireEnd 993c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 994c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 995f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UBool U_EXPORT2 99650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_requireEnd(const URegularExpression *regexp2, 997c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 99850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 999b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 1000c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return FALSE; 1001c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1002c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return regexp->fMatcher->requireEnd(); 1003c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1004c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1005c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1006c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1007c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1008c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_setTimeLimit 1009c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1010c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1011f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 101250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_setTimeLimit(URegularExpression *regexp2, 1013c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t limit, 1014c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 101550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1016b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 1017c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru regexp->fMatcher->setTimeLimit(limit, *status); 1018c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1019c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1020c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1021c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1022c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1023c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1024c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1025c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_getTimeLimit 1026c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1027c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1028f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 102950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_getTimeLimit(const URegularExpression *regexp2, 1030c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 1031c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t retVal = 0; 103250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1033b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 1034c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru retVal = regexp->fMatcher->getTimeLimit(); 1035c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1036c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return retVal; 1037c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1038c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1039c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1040c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1041c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1042c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1043c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_setStackLimit 1044c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1045c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1046f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 104750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_setStackLimit(URegularExpression *regexp2, 104850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t limit, 104950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 105050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1051b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 1052c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru regexp->fMatcher->setStackLimit(limit, *status); 1053c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1054c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1055c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1056c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1057c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1058c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1059c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1060c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_getStackLimit 1061c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1062c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1063f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 106450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_getStackLimit(const URegularExpression *regexp2, 106550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 1066c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru int32_t retVal = 0; 106750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1068b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 1069c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru retVal = regexp->fMatcher->getStackLimit(); 1070c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1071c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru return retVal; 1072c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1073c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1074c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1075c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1076c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1077c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_setMatchCallback 1078c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1079c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1080c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste QueruU_CAPI void U_EXPORT2 108150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_setMatchCallback(URegularExpression *regexp2, 1082c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru URegexMatchCallback *callback, 1083c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const void *context, 1084c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 108550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1086b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 108750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fMatcher->setMatchCallback(callback, context, *status); 1088c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1089c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1090c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1091c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1092c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1093c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1094c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// uregex_getMatchCallback 1095c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 1096c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1097f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 109850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_getMatchCallback(const URegularExpression *regexp2, 1099c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru URegexMatchCallback **callback, 1100c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru const void **context, 1101c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UErrorCode *status) { 110250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 1104c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru regexp->fMatcher->getMatchCallback(*callback, *context, *status); 1105c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru } 1106c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru} 1107c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1108c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru 1109c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//------------------------------------------------------------------------------ 1110c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru// 111127f654740f2a26ad62a5c155af9199af9e69b889claireho// uregex_setMatchProgressCallback 111227f654740f2a26ad62a5c155af9199af9e69b889claireho// 111327f654740f2a26ad62a5c155af9199af9e69b889claireho//------------------------------------------------------------------------------ 111427f654740f2a26ad62a5c155af9199af9e69b889clairehoU_CAPI void U_EXPORT2 111527f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_setFindProgressCallback(URegularExpression *regexp2, 111627f654740f2a26ad62a5c155af9199af9e69b889claireho URegexFindProgressCallback *callback, 111727f654740f2a26ad62a5c155af9199af9e69b889claireho const void *context, 111827f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 111927f654740f2a26ad62a5c155af9199af9e69b889claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 112127f654740f2a26ad62a5c155af9199af9e69b889claireho regexp->fMatcher->setFindProgressCallback(callback, context, *status); 112227f654740f2a26ad62a5c155af9199af9e69b889claireho } 112327f654740f2a26ad62a5c155af9199af9e69b889claireho} 112427f654740f2a26ad62a5c155af9199af9e69b889claireho 112527f654740f2a26ad62a5c155af9199af9e69b889claireho 112627f654740f2a26ad62a5c155af9199af9e69b889claireho//------------------------------------------------------------------------------ 112727f654740f2a26ad62a5c155af9199af9e69b889claireho// 112827f654740f2a26ad62a5c155af9199af9e69b889claireho// uregex_getMatchCallback 112927f654740f2a26ad62a5c155af9199af9e69b889claireho// 113027f654740f2a26ad62a5c155af9199af9e69b889claireho//------------------------------------------------------------------------------ 1131f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 113227f654740f2a26ad62a5c155af9199af9e69b889clairehouregex_getFindProgressCallback(const URegularExpression *regexp2, 113327f654740f2a26ad62a5c155af9199af9e69b889claireho URegexFindProgressCallback **callback, 113427f654740f2a26ad62a5c155af9199af9e69b889claireho const void **context, 113527f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 113627f654740f2a26ad62a5c155af9199af9e69b889claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, FALSE, status)) { 113827f654740f2a26ad62a5c155af9199af9e69b889claireho regexp->fMatcher->getFindProgressCallback(*callback, *context, *status); 113927f654740f2a26ad62a5c155af9199af9e69b889claireho } 114027f654740f2a26ad62a5c155af9199af9e69b889claireho} 114127f654740f2a26ad62a5c155af9199af9e69b889claireho 114227f654740f2a26ad62a5c155af9199af9e69b889claireho 114327f654740f2a26ad62a5c155af9199af9e69b889claireho//------------------------------------------------------------------------------ 114427f654740f2a26ad62a5c155af9199af9e69b889claireho// 1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_replaceAll 1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1148f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 114950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_replaceAll(URegularExpression *regexp2, 1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *replacementText, 1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t replacementLength, 1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *destBuf, 1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destCapacity, 1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 115550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (replacementText == NULL || replacementLength < -1 || 116027f654740f2a26ad62a5c155af9199af9e69b889claireho (destBuf == NULL && destCapacity > 0) || 1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destCapacity < 0) { 1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 1167b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 116850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_reset(regexp2, 0, status); 1169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1170b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Note: Seperate error code variables for findNext() and appendReplacement() 1171b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // are used so that destination buffer overflow errors 1172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // in appendReplacement won't stop findNext() from working. 1173b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // appendReplacement() and appendTail() special case incoming buffer 1174b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // overflow errors, continuing to return the correct length. 1175b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru UErrorCode findStatus = *status; 117650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho while (uregex_findNext(regexp2, &findStatus)) { 117750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho len += uregex_appendReplacement(regexp2, replacementText, replacementLength, 1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &destBuf, &destCapacity, status); 1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 118050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho len += uregex_appendTail(regexp2, &destBuf, &destCapacity, status); 1181f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1182b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (U_FAILURE(findStatus)) { 1183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // If anything went wrong with the findNext(), make that error trump 1184b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // whatever may have happened with the append() operations. 1185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru // Errors in findNext() are not expected. 1186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *status = findStatus; 1187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return len; 1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 119550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_replaceAllUText 119650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 119750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 1198f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UText * U_EXPORT2 119950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_replaceAllUText(URegularExpression *regexp2, 120050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *replacementText, 120150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *dest, 120250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 120350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 120550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 120650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 120750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (replacementText == NULL) { 120850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_ILLEGAL_ARGUMENT_ERROR; 120950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 121050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1211f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 121250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest = regexp->fMatcher->replaceAll(replacementText, dest, *status); 121350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return dest; 121450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1215f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 121650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 121750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 121850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_replaceFirst 1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1222f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 122350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_replaceFirst(URegularExpression *regexp2, 1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *replacementText, 1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t replacementLength, 1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *destBuf, 1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destCapacity, 1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 122950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (replacementText == NULL || replacementLength < -1 || 123427f654740f2a26ad62a5c155af9199af9e69b889claireho (destBuf == NULL && destCapacity > 0) || 1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destCapacity < 0) { 1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool findSucceeded; 124250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uregex_reset(regexp2, 0, status); 124350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho findSucceeded = uregex_find(regexp2, 0, status); 1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (findSucceeded) { 1245f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius len = uregex_appendReplacement(regexp2, replacementText, replacementLength, 1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru &destBuf, &destCapacity, status); 1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 124850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho len += uregex_appendTail(regexp2, &destBuf, &destCapacity, status); 1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return len; 1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 125650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_replaceFirstUText 1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1259f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UText * U_EXPORT2 126050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_replaceFirstUText(URegularExpression *regexp2, 126150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *replacementText, 126250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *dest, 126350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 126450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1265b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 126650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 126750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 126850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (replacementText == NULL) { 126950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_ILLEGAL_ARGUMENT_ERROR; 127050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 127150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1272f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 127350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest = regexp->fMatcher->replaceFirst(replacementText, dest, *status); 127450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return dest; 127550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 127950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 128050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_appendReplacement 128150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 128250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//------------------------------------------------------------------------------ 128350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 128450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_BEGIN 1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Dummy class, because these functions need to be friends of class RegexMatcher, 1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// and stand-alone C functions don't work as friends 1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass RegexCImpl { 1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru public: 129150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho inline static int32_t appendReplacement(RegularExpression *regexp, 1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *replacementText, 1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t replacementLength, 1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar **destBuf, 1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t *destCapacity, 1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status); 1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 129850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho inline static int32_t appendTail(RegularExpression *regexp, 129950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar **destBuf, 130050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *destCapacity, 130150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status); 1302f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 130350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho inline static int32_t split(RegularExpression *regexp, 130450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *destBuf, 130550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t destCapacity, 130650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *requiredCapacity, 130750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *destFields[], 130850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t destFieldsCapacity, 130950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status); 1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 131250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_END 1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar BACKSLASH = 0x5c; 1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UChar DOLLARSIGN = 0x24; 13181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic const UChar LEFTBRACKET = 0x7b; 13191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubertstatic const UChar RIGHTBRACKET = 0x7d; 1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Move a character to an output buffer, with bounds checking on the index. 1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Index advances even if capacity is exceeded, for preflight size computations. 1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This little sequence is used a LOT. 1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline void appendToBuf(UChar c, int32_t *idx, UChar *buf, int32_t bufCapacity) { 1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (*idx < bufCapacity) { 1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru buf[*idx] = c; 1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (*idx)++; 1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// appendReplacement, the actual implementation. 1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 133750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t RegexCImpl::appendReplacement(RegularExpression *regexp, 133850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *replacementText, 133950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t replacementLength, 134050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar **destBuf, 134150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *destCapacity, 134250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we come in with a buffer overflow error, don't suppress the operation. 1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A series of appendReplacements, appendTail need to correctly preflight 1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the buffer size when an overflow happens somewhere in the middle. 1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool pendingBufferOverflow = FALSE; 1348b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (*status == U_BUFFER_OVERFLOW_ERROR && destCapacity != NULL && *destCapacity == 0) { 1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pendingBufferOverflow = TRUE; 1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ZERO_ERROR; 1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Validate all paramters 1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (replacementText == NULL || replacementLength < -1 || 1360f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius destCapacity == NULL || destBuf == NULL || 136127f654740f2a26ad62a5c155af9199af9e69b889claireho (*destBuf == NULL && *destCapacity > 0) || 1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destCapacity < 0) { 1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RegexMatcher *m = regexp->fMatcher; 1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (m->fMatch == FALSE) { 1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_REGEX_INVALID_STATE; 1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *dest = *destBuf; 1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t capacity = *destCapacity; 1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destIdx = 0; 1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; 1377f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If it wasn't supplied by the caller, get the length of the replacement text. 1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // TODO: slightly smarter logic in the copy loop could watch for the NUL on 1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the fly and avoid this step. 1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (replacementLength == -1) { 1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru replacementLength = u_strlen(replacementText); 1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Copy input string from the end of previous match to start of current match 138650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (regexp->fText != NULL) { 138750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t matchStart; 138850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t lastMatchEnd; 138950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (UTEXT_USES_U16(m->fInputText)) { 139050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho lastMatchEnd = (int32_t)m->fLastMatchEnd; 139150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho matchStart = (int32_t)m->fMatchStart; 139250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 139350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // !!!: Would like a better way to do this! 13941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UErrorCode tempStatus = U_ZERO_ERROR; 13951b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert lastMatchEnd = utext_extract(m->fInputText, 0, m->fLastMatchEnd, NULL, 0, &tempStatus); 13961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert tempStatus = U_ZERO_ERROR; 13971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert matchStart = lastMatchEnd + utext_extract(m->fInputText, m->fLastMatchEnd, m->fMatchStart, NULL, 0, &tempStatus); 139850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 139950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (i=lastMatchEnd; i<matchStart; i++) { 140050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho appendToBuf(regexp->fText[i], &destIdx, dest, capacity); 1401f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 140250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 140350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode possibleOverflowError = U_ZERO_ERROR; // ignore 140450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx += utext_extract(m->fInputText, m->fLastMatchEnd, m->fMatchStart, 1405103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius dest==NULL?NULL:&dest[destIdx], REMAINING_CAPACITY(destIdx, capacity), 1406103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius &possibleOverflowError); 1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius U_ASSERT(destIdx >= 0); 1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // scan the replacement text, looking for substitutions ($n) and \escapes. 1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t replIdx = 0; 14121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert while (replIdx < replacementLength && U_SUCCESS(*status)) { 1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c = replacementText[replIdx]; 1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru replIdx++; 1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c != DOLLARSIGN && c != BACKSLASH) { 1416f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // Common case, no substitution, no escaping, 1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // just copy the char to the dest buf. 1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendToBuf(c, &destIdx, dest, capacity); 1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c == BACKSLASH) { 1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Backslash Escape. Copy the following char out without further checks. 1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Note: Surrogate pairs don't need any special handling 1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // The second half wont be a '$' or a '\', and 1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // will move to the dest normally on the next 1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // loop iteration. 1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (replIdx >= replacementLength) { 1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = replacementText[replIdx]; 1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (c==0x55/*U*/ || c==0x75/*u*/) { 1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We have a \udddd or \Udddddddd escape sequence. 1435f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius UChar32 escapedChar = 143650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_unescapeAt(uregex_ucstr_unescape_charAt, 1437f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius &replIdx, // Index is updated by unescapeAt 1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru replacementLength, // Length of replacement text 1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (void *)replacementText); 1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (escapedChar != (UChar32)0xFFFFFFFF) { 1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (escapedChar <= 0xffff) { 1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendToBuf((UChar)escapedChar, &destIdx, dest, capacity); 1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendToBuf(U16_LEAD(escapedChar), &destIdx, dest, capacity); 1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendToBuf(U16_TRAIL(escapedChar), &destIdx, dest, capacity); 1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Note: if the \u escape was invalid, just fall through and 1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // treat it as a plain \<anything> escape. 1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Plain backslash escape. Just put out the escaped character. 1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru appendToBuf(c, &destIdx, dest, capacity); 1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru replIdx++; 1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru continue; 1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14611b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // We've got a $. Pick up the following capture group name or number. 14621b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // For numbers, consume only digits that produce a valid capture group for the pattern. 1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t groupNum = 0; 14651b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert U_ASSERT(c == DOLLARSIGN); 14661b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UChar32 c32; 14671b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert U16_GET(replacementText, 0, replIdx, replacementLength, c32); 14681b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (u_isdigit(c32)) { 14691b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t numDigits = 0; 14701b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t numCaptureGroups = m->fPattern->fGroupMap->size(); 14711b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert for (;;) { 14721b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (replIdx >= replacementLength) { 14731b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert break; 14741b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 14751b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert U16_GET(replacementText, 0, replIdx, replacementLength, c32); 14761b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (u_isdigit(c32) == FALSE) { 14771b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert break; 14781b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 14801b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert int32_t digitVal = u_charDigitValue(c32); 14811b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (groupNum * 10 + digitVal <= numCaptureGroups) { 14821b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert groupNum = groupNum * 10 + digitVal; 14831b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert U16_FWD_1(replacementText, replIdx, replacementLength); 14841b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert numDigits++; 14851b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } else { 14861b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (numDigits == 0) { 14871b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_INDEX_OUTOFBOUNDS_ERROR; 14881b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 14891b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert break; 14901b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 14911b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 14921b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } else if (c32 == LEFTBRACKET) { 14931b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Scan for Named Capture Group, ${name}. 14941b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert UnicodeString groupName; 1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_FWD_1(replacementText, replIdx, replacementLength); 14961b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert while (U_SUCCESS(*status) && c32 != RIGHTBRACKET) { 14971b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (replIdx >= replacementLength) { 14981b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_REGEX_INVALID_CAPTURE_GROUP_NAME; 14991b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert break; 15001b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 15011b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert U16_NEXT(replacementText, replIdx, replacementLength, c32); 15021b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if ((c32 >= 0x41 && c32 <= 0x5a) || // A..Z 15031b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert (c32 >= 0x61 && c32 <= 0x7a) || // a..z 15041b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert (c32 >= 0x31 && c32 <= 0x39)) { // 0..9 15051b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert groupName.append(c32); 15061b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } else if (c32 == RIGHTBRACKET) { 15071b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert groupNum = uhash_geti(regexp->fPat->fNamedCaptureMap, &groupName); 15081b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (groupNum == 0) { 15091b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Name not defined by pattern. 15101b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_REGEX_INVALID_CAPTURE_GROUP_NAME; 15111b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 15121b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } else { 15131b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Character was something other than a name char or a closing '}' 15141b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_REGEX_INVALID_CAPTURE_GROUP_NAME; 15151b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 15171b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } else { 15181b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // $ not followed by {name} or digits. 15191b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_REGEX_INVALID_CAPTURE_GROUP_NAME; 1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Finally, append the capture group data to the destination. 15241b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (U_SUCCESS(*status)) { 15251b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert destIdx += uregex_group((URegularExpression*)regexp, groupNum, 15261b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert dest==NULL?NULL:&dest[destIdx], REMAINING_CAPACITY(destIdx, capacity), status); 15271b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (*status == U_BUFFER_OVERFLOW_ERROR) { 15281b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // Ignore buffer overflow when extracting the group. We need to 15291b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // continue on to get full size of the untruncated result. We will 15301b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // raise our own buffer overflow error at the end. 15311b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_ZERO_ERROR; 15321b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 15361b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert // bad group number or name. 1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Nul Terminate the dest buffer if possible. 1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Set the appropriate buffer overflow or not terminated error, if needed. 1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destIdx < capacity) { 1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[destIdx] = 0; 15471b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } else if (U_SUCCESS(*status)) { 15481b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert if (destIdx == *destCapacity) { 15491b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_STRING_NOT_TERMINATED_WARNING; 15501b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } else { 15511b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert *status = U_BUFFER_OVERFLOW_ERROR; 15521b7d32f919554dda9c193b32188251337bc756f1Fredrik Roubert } 1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1554f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Return an updated dest buffer and capacity to the caller. 1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destIdx > 0 && *destCapacity > 0) { 1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destIdx < capacity) { 1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destBuf += destIdx; 1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destCapacity -= destIdx; 1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destBuf += capacity; 1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destCapacity = 0; 1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we came in with a buffer overflow, make sure we go out with one also. 1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // (A zero length match right at the end of the previous match could 1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // make this function succeed even though a previous call had overflowed the buf) 1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pendingBufferOverflow && U_SUCCESS(*status)) { 1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_BUFFER_OVERFLOW_ERROR; 1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return destIdx; 1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 157950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// appendReplacement the actual API function, 1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1581f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 158250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_appendReplacement(URegularExpression *regexp2, 158350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar *replacementText, 158450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t replacementLength, 158550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar **destBuf, 158650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *destCapacity, 158750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 1588f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 158950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return RegexCImpl::appendReplacement( 1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru regexp, replacementText, replacementLength,destBuf, destCapacity, status); 1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 159450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 159550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_appendReplacementUText...can just use the normal C++ method 159650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 1597f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI void U_EXPORT2 159850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_appendReplacementUText(URegularExpression *regexp2, 159950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *replText, 160050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *dest, 160150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 160250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 160350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fMatcher->appendReplacement(dest, replText, *status); 160450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 160550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_appendTail 1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 161250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t RegexCImpl::appendTail(RegularExpression *regexp, 161350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar **destBuf, 161450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *destCapacity, 161550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) 1616c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru{ 1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we come in with a buffer overflow error, don't suppress the operation. 1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // A series of appendReplacements, appendTail need to correctly preflight 1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // the buffer size when an overflow happens somewhere in the middle. 1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool pendingBufferOverflow = FALSE; 1622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (*status == U_BUFFER_OVERFLOW_ERROR && destCapacity != NULL && *destCapacity == 0) { 1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pendingBufferOverflow = TRUE; 1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ZERO_ERROR; 1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1627b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1630f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1631f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius if (destCapacity == NULL || destBuf == NULL || 163227f654740f2a26ad62a5c155af9199af9e69b889claireho (*destBuf == NULL && *destCapacity > 0) || 1633b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *destCapacity < 0) 1634b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru { 1635b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru *status = U_ILLEGAL_ARGUMENT_ERROR; 1636b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return 0; 1637b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 1638b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru RegexMatcher *m = regexp->fMatcher; 1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destIdx = 0; 1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destCap = *destCapacity; 1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *dest = *destBuf; 1644f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 164550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (regexp->fText != NULL) { 164650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t srcIdx; 164750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int64_t nativeIdx = (m->fMatch ? m->fMatchEnd : m->fLastMatchEnd); 164850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (nativeIdx == -1) { 164950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho srcIdx = 0; 165050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if (UTEXT_USES_U16(m->fInputText)) { 165150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho srcIdx = (int32_t)nativeIdx; 1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 165350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode status = U_ZERO_ERROR; 165450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho srcIdx = utext_extract(m->fInputText, 0, nativeIdx, NULL, 0, &status); 165550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1656f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 165750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (;;) { 1658103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius U_ASSERT(destIdx >= 0); 1659103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 166050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (srcIdx == regexp->fTextLength) { 1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 166350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar c = regexp->fText[srcIdx]; 166450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (c == 0 && regexp->fTextLength == -1) { 166550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho regexp->fTextLength = srcIdx; 166650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 166750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 166950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (destIdx < destCap) { 167050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho dest[destIdx] = c; 167150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 167250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // We've overflowed the dest buffer. 167350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // If the total input string length is known, we can 167450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // compute the total buffer size needed without scanning through the string. 167550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (regexp->fTextLength > 0) { 167650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx += (regexp->fTextLength - srcIdx); 167750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho break; 167850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 167950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 168050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho srcIdx++; 168150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx++; 1682f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius } 168350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 168450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int64_t srcIdx; 168550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (m->fMatch) { 1686f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // The most recent call to find() succeeded. 168750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho srcIdx = m->fMatchEnd; 168850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 168950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // The last call to find() on this matcher failed(). 169050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // Look back to the end of the last find() that succeeded for src index. 169150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho srcIdx = m->fLastMatchEnd; 169250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (srcIdx == -1) { 169350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // There has been no successful match with this matcher. 169450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // We want to copy the whole string. 169550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho srcIdx = 0; 169650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 169950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx = utext_extract(m->fInputText, srcIdx, m->fInputLength, dest, destCap, status); 1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // NUL terminate the output string, if possible, otherwise issue the 1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // appropriate error or warning. 1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destIdx < destCap) { 1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dest[destIdx] = 0; 1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (destIdx == destCap) { 1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_STRING_NOT_TERMINATED_WARNING; 1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_BUFFER_OVERFLOW_ERROR; 1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Update the user's buffer ptr and capacity vars to reflect the 1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // amount used. 1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destIdx < destCap) { 1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destBuf += destIdx; 1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destCapacity -= destIdx; 1721103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius } else if (*destBuf != NULL) { 1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destBuf += destCap; 1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destCapacity = 0; 1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (pendingBufferOverflow && U_SUCCESS(*status)) { 1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_BUFFER_OVERFLOW_ERROR; 1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return destIdx; 1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 173450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 173550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// appendTail the actual API function 173650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 1737f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 173850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_appendTail(URegularExpression *regexp2, 1739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar **destBuf, 1740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t *destCapacity, 1741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 174250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return RegexCImpl::appendTail(regexp, destBuf, destCapacity, status); 1744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 174750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 174850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_appendTailUText...can just use the normal C++ method 174950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 1750f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI UText * U_EXPORT2 175150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_appendTailUText(URegularExpression *regexp2, 175227f654740f2a26ad62a5c155af9199af9e69b889claireho UText *dest, 175327f654740f2a26ad62a5c155af9199af9e69b889claireho UErrorCode *status) { 175450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 175527f654740f2a26ad62a5c155af9199af9e69b889claireho return regexp->fMatcher->appendTail(dest, *status); 175650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 175750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 175850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// copyString Internal utility to copy a string to an output buffer, 1762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// while managing buffer overflow and preflight size 1763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// computation. NUL termination is added to destination, 1764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// and the NUL is counted in the output size. 1765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 176750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if 0 1768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void copyString(UChar *destBuffer, // Destination buffer. 1769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destCapacity, // Total capacity of dest buffer 1770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t *destIndex, // Index into dest buffer. Updated on return. 1771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Update not clipped to destCapacity. 1772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *srcPtr, // Pointer to source string 1773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t srcLen) // Source string len. 1774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 1775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t si; 1776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t di = *destIndex; 1777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar c; 1778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (si=0; si<srcLen; si++) { 1780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru c = srcPtr[si]; 1781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (di < destCapacity) { 1782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destBuffer[di] = c; 1783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru di++; 1784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru di += srcLen - si; 1786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (di<destCapacity) { 1790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destBuffer[di] = 0; 1791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru di++; 1793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *destIndex = di; 1794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 179550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif 1796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 1798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// uregex_split 1800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// 1801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//------------------------------------------------------------------------------ 180250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoint32_t RegexCImpl::split(RegularExpression *regexp, 180350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *destBuf, 180450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t destCapacity, 180550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *requiredCapacity, 180650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *destFields[], 180750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t destFieldsCapacity, 180850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 1809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Reset for the input text 1811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru regexp->fMatcher->reset(); 181350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *inputText = regexp->fMatcher->fInputText; 181450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int64_t nextOutputStringStart = 0; 181550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int64_t inputLen = regexp->fMatcher->fInputLength; 1816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (inputLen == 0) { 1817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 1818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Loop through the input text, searching for the delimiter pattern 1822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // 1823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i; // Index of the field being processed. 1824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t destIdx = 0; // Next available position in destBuf; 1825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t numCaptureGroups = regexp->fMatcher->groupCount(); 182650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode tStatus = U_ZERO_ERROR; // Want to ignore any buffer overflow errors so that the strings are still counted 1827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i=0; ; i++) { 1828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i>=destFieldsCapacity-1) { 182950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // There are one or zero output strings left. 1830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Fill the last output string with whatever is left from the input, then exit the loop. 1831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // ( i will be == destFieldsCapacity if we filled the output array while processing 1832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // capture groups of the delimiter expression, in which case we will discard the 1833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // last capture group saved in favor of the unprocessed remainder of the 1834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // input string.) 183550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (inputLen > nextOutputStringStart) { 183650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (i != destFieldsCapacity-1) { 183750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // No fields are left. Recycle the last one for holding the trailing part of 183850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho // the input string. 183950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho i = destFieldsCapacity-1; 184050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx = (int32_t)(destFields[i] - destFields[0]); 184150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1842f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 184350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destFields[i] = &destBuf[destIdx]; 184450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx += 1 + utext_extract(inputText, nextOutputStringStart, inputLen, 184550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &destBuf[destIdx], REMAINING_CAPACITY(destIdx, destCapacity), status); 1846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1849f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (regexp->fMatcher->find()) { 1851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We found another delimiter. Move everything from where we started looking 1852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // up until the start of the delimiter into the next output string. 1853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destFields[i] = &destBuf[destIdx]; 1854f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 185550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx += 1 + utext_extract(inputText, nextOutputStringStart, regexp->fMatcher->fMatchStart, 185650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &destBuf[destIdx], REMAINING_CAPACITY(destIdx, destCapacity), &tStatus); 185750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (tStatus == U_BUFFER_OVERFLOW_ERROR) { 185850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho tStatus = U_ZERO_ERROR; 185950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 186050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = tStatus; 186150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 186250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho nextOutputStringStart = regexp->fMatcher->fMatchEnd; 1863f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If the delimiter pattern has capturing parentheses, the captured 1865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // text goes out into the next n destination strings. 1866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t groupNum; 1867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (groupNum=1; groupNum<=numCaptureGroups; groupNum++) { 1868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // If we've run out of output string slots, bail out. 1869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i==destFieldsCapacity-1) { 1870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru i++; 1873f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 1874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Set up to extract the capture group contents into the dest buffer. 1875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destFields[i] = &destBuf[destIdx]; 187650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho tStatus = U_ZERO_ERROR; 1877f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius int32_t t = uregex_group((URegularExpression*)regexp, 1878f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius groupNum, 1879f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius destFields[i], 1880f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius REMAINING_CAPACITY(destIdx, destCapacity), 1881b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho &tStatus); 1882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destIdx += t + 1; // Record the space used in the output string buffer. 1883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // +1 for the NUL that terminates the string. 188450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (tStatus == U_BUFFER_OVERFLOW_ERROR) { 188550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho tStatus = U_ZERO_ERROR; 188650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 188750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = tStatus; 188850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (nextOutputStringStart == inputLen) { 1892f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius // The delimiter was at the end of the string. 1893b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Output an empty string, and then we are done. 1894b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (destIdx < destCapacity) { 1895b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho destBuf[destIdx] = 0; 1896b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1897b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (i < destFieldsCapacity-1) { 1898b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ++i; 1899b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1900b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (destIdx < destCapacity) { 1901b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho destFields[i] = destBuf + destIdx; 1902b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 1903b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho ++destIdx; 1904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else 1909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 1910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // We ran off the end of the input while looking for the next delimiter. 1911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // All the remaining text goes into the current output string. 1912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destFields[i] = &destBuf[destIdx]; 191350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destIdx += 1 + utext_extract(inputText, nextOutputStringStart, inputLen, 191450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho &destBuf[destIdx], REMAINING_CAPACITY(destIdx, destCapacity), status); 1915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 1916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // Zero out any unused portion of the destFields array 1920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int j; 1921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (j=i+1; j<destFieldsCapacity; j++) { 1922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru destFields[j] = NULL; 1923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (requiredCapacity != NULL) { 1926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *requiredCapacity = destIdx; 1927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (destIdx > destCapacity) { 1929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_BUFFER_OVERFLOW_ERROR; 1930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 1931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return i+1; 1932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 1933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 193450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 193550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_split The actual API function 193650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 1937f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 193850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_split(URegularExpression *regexp2, 193950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *destBuf, 194050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t destCapacity, 194150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t *requiredCapacity, 194250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *destFields[], 194350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t destFieldsCapacity, 194450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 194550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 1946b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (validateRE(regexp, TRUE, status) == FALSE) { 194750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 194850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 194927f654740f2a26ad62a5c155af9199af9e69b889claireho if ((destBuf == NULL && destCapacity > 0) || 195050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destCapacity < 0 || 195150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destFields == NULL || 195250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho destFieldsCapacity < 1 ) { 195350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *status = U_ILLEGAL_ARGUMENT_ERROR; 195450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; 195550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 1956f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 195750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return RegexCImpl::split(regexp, destBuf, destCapacity, requiredCapacity, destFields, destFieldsCapacity, status); 195850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 1959f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius 196050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 196150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 196250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// uregex_splitUText...can just use the normal C++ method 196350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// 1964f9878a236aa0d9662d8e40cafdaf2e04cd615835ccorneliusU_CAPI int32_t U_EXPORT2 196550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouregex_splitUText(URegularExpression *regexp2, 196650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UText *destFields[], 196750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t destFieldsCapacity, 196850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 196950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho RegularExpression *regexp = (RegularExpression*)regexp2; 197050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return regexp->fMatcher->split(regexp->fMatcher->inputText(), destFields, destFieldsCapacity, *status); 197150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 197250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 1973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif // !UCONFIG_NO_REGULAR_EXPRESSIONS 1975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 1976