1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ******************************************************************************* 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (C) 2003-2010, International Business Machines 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Corporation and others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ******************************************************************************* 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * file name: nptrans.h 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * encoding: US-ASCII 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * tab size: 8 (not used) 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indentation:4 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * created on: 2003feb1 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * created by: Ram Viswanadha 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h" 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_TRANSLITERATION 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_IDNA 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "nptrans.h" 23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/resbund.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uniset.h" 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "sprpimpl.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustr_imp.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "intltest.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef DEBUG 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h> 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char NamePrepTransform::fgClassID=0; 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//Factory method 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNamePrepTransform* NamePrepTransform::createInstance(UParseError& parseError, UErrorCode& status){ 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NamePrepTransform* transform = new NamePrepTransform(parseError, status); 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete transform; 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return NULL; 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return transform; 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//constructor 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNamePrepTransform::NamePrepTransform(UParseError& parseError, UErrorCode& status) 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru: unassigned(), prohibited(), labelSeparatorSet(){ 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mapping = NULL; 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle = NULL; 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* testDataName = IntlTest::loadTestData(status); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle = ures_openDirect(testDataName,"idna_rules",&status); 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(bundle != NULL && U_SUCCESS(status)){ 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // create the mapping transliterator 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t ruleLen = 0; 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* ruleUChar = ures_getStringByKey(bundle, "MapNFKC",&ruleLen, &status); 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t mapRuleLen = 0; 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *mapRuleUChar = ures_getStringByKey(bundle, "MapNoNormalization", &mapRuleLen, &status); 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rule(mapRuleUChar, mapRuleLen); 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rule.append(ruleUChar, ruleLen); 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mapping = Transliterator::createFromRules(UnicodeString("NamePrepTransform", ""), rule, 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UTRANS_FORWARD, parseError,status); 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)) { 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //create the unassigned set 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t patternLen =0; 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* pattern = ures_getStringByKey(bundle,"UnassignedSet",&patternLen, &status); 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru unassigned.applyPattern(UnicodeString(pattern, patternLen), status); 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //create prohibited set 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternLen=0; 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern = ures_getStringByKey(bundle,"ProhibitedSet",&patternLen, &status); 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString test(pattern,patternLen); 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prohibited.applyPattern(test,status); 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef DEBUG 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("Construction of Unicode set failed\n"); 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status)){ 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(prohibited.contains((UChar) 0x644)){ 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("The string contains 0x644 ... damn !!\n"); 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString temp; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prohibited.toPattern(temp,TRUE); 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(int32_t i=0;i<temp.length();i++){ 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("%c", (char)temp.charAt(i)); 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("\n"); 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //create label separator set 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru patternLen=0; 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pattern = ures_getStringByKey(bundle,"LabelSeparatorSet",&patternLen, &status); 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru labelSeparatorSet.applyPattern(UnicodeString(pattern,patternLen),status); 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(status) && 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (mapping == NULL) 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ){ 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_MEMORY_ALLOCATION_ERROR; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete mapping; 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(bundle); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mapping = NULL; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle = NULL; 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool NamePrepTransform::isProhibited(UChar32 ch){ 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return (UBool)(ch != ASCII_SPACE); 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruNamePrepTransform::~NamePrepTransform(){ 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru delete mapping; 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mapping = NULL; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //close the bundle 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(bundle); 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle = NULL; 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t NamePrepTransform::map(const UChar* src, int32_t srcLength, 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* dest, int32_t destCapacity, 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool allowUnassigned, 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError* /*parseError*/, 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status ){ 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //check arguments 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(src==NULL || srcLength<-1 || (dest==NULL && destCapacity!=0)) { 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ILLEGAL_ARGUMENT_ERROR; 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UnicodeString rsource(src,srcLength); 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // map the code points 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // transliteration also performs NFKC 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mapping->transliterate(rsource); 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* buffer = rsource.getBuffer(); 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t bufLen = rsource.length(); 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check if unassigned 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(allowUnassigned == FALSE){ 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t bufIndex=0; 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch =0 ; 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(;bufIndex<bufLen;){ 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_NEXT(buffer, bufIndex, bufLen, ch); 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(unassigned.contains(ch)){ 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_IDNA_UNASSIGNED_ERROR; 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check if there is enough room in the output 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(bufLen < destCapacity){ 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memcpy(dest,buffer,bufLen*U_SIZEOF_UCHAR); 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return u_terminateUChars(dest, destCapacity, bufLen, &status); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define MAX_BUFFER_SIZE 300 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t NamePrepTransform::process( const UChar* src, int32_t srcLength, 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar* dest, int32_t destCapacity, 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool allowUnassigned, 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UParseError* parseError, 188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode& status ){ 189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check error status 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //check arguments 195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(src==NULL || srcLength<-1 || (dest==NULL && destCapacity!=0)) { 196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status=U_ILLEGAL_ARGUMENT_ERROR; 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UnicodeString b1String; 20150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UChar *b1 = b1String.getBuffer(MAX_BUFFER_SIZE); 20250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t b1Len; 203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t b1Index = 0; 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCharDirection direction=U_CHAR_DIRECTION_COUNT, firstCharDir=U_CHAR_DIRECTION_COUNT; 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool leftToRight=FALSE, rightToLeft=FALSE; 207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1Len = map(src, srcLength, b1, b1String.getCapacity(), allowUnassigned, parseError, status); 20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1String.releaseBuffer(b1Len); 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(status == U_BUFFER_OVERFLOW_ERROR){ 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // redo processing of string 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* we do not have enough room so grow the buffer*/ 21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1 = b1String.getBuffer(b1Len); 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; // reset error 21650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1Len = map(src, srcLength, b1, b1String.getCapacity(), allowUnassigned, parseError, status); 21750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1String.releaseBuffer(b1Len); 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 22150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1Len = 0; 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto CLEANUP; 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(; b1Index<b1Len; ){ 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar32 ch = 0; 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U16_NEXT(b1, b1Index, b1Len, ch); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(prohibited.contains(ch) && ch!=0x0020){ 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_IDNA_PROHIBITED_ERROR; 23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1Len = 0; 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto CLEANUP; 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru direction = u_charDirection(ch); 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(firstCharDir==U_CHAR_DIRECTION_COUNT){ 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru firstCharDir = direction; 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(direction == U_LEFT_TO_RIGHT){ 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru leftToRight = TRUE; 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(direction == U_RIGHT_TO_LEFT || direction == U_RIGHT_TO_LEFT_ARABIC){ 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rightToLeft = TRUE; 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // satisfy 2 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( leftToRight == TRUE && rightToLeft == TRUE){ 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_IDNA_CHECK_BIDI_ERROR; 25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho b1Len = 0; 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto CLEANUP; 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru //satisfy 3 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( rightToLeft == TRUE && 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru !((firstCharDir == U_RIGHT_TO_LEFT || firstCharDir == U_RIGHT_TO_LEFT_ARABIC) && 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (direction == U_RIGHT_TO_LEFT || direction == U_RIGHT_TO_LEFT_ARABIC)) 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ){ 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_IDNA_CHECK_BIDI_ERROR; 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(b1Len <= destCapacity){ 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_memmove(dest,b1, b1Len*U_SIZEOF_UCHAR); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruCLEANUP: 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return u_terminateUChars(dest, destCapacity, b1Len, &status); 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool NamePrepTransform::isLabelSeparator(UChar32 ch, UErrorCode& status){ 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru // check error status 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(status)){ 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return FALSE; 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return labelSeparatorSet.contains(ch); 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_IDNA */ 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_TRANSLITERATION */ 285