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