1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
4b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru*   Copyright (C) 2003-2009, International Business Machines
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   file name:  testidn.cpp
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: 2003-02-06
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created by: Ram Viswanadha
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   This program reads the rfc3454_*.txt files,
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   parses them, and extracts the data for Nameprep conformance.
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   It then preprocesses it and writes a binary file for efficient use
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   in various IDNA conversion processes.
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_IDNA && !UCONFIG_NO_TRANSLITERATION
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define USPREP_TYPE_NAMES_ARRAY
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udata.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unewdata.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uoptions.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uparse.h"
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "utrie.h"
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h"
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "sprpimpl.h"
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "testidna.h"
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "punyref.h"
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool beVerbose=FALSE, haveCopyright=TRUE;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* prototypes --------------------------------------------------------------- */
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruparseMappings(const char *filename, UBool reportError,TestIDNA& test, UErrorCode *pErrorCode);
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucompareMapping(uint32_t codepoint, uint32_t* mapping, int32_t mapLength,
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UStringPrepType option);
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucompareFlagsForRange(uint32_t start, uint32_t end,UStringPrepType option);
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestAllCodepoints(TestIDNA& test);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic TestIDNA* pTestIDNA =NULL;
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* fileNames[] = {
64b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                    "rfc3491.txt"
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                 };
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const UTrie *idnTrie              = NULL;
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t *indexes            = NULL;
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint16_t *mappingData       = NULL;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* -------------------------------------------------------------------------- */
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* file definitions */
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define DATA_TYPE "icu"
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru#define SPREP_DIR "sprep"
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruextern int
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestData(TestIDNA& test) {
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *basename=NULL;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode=U_ZERO_ERROR;
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *saveBasename =NULL;
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    LocalUStringPrepProfilePointer profile(usprep_openByType(USPREP_RFC3491_NAMEPREP, &errorCode));
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)){
846d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        test.errcheckln(errorCode, "Failed to load IDNA data file. " + UnicodeString(u_errorName(errorCode)));
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return errorCode;
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char* filename = (char*) malloc(strlen(IntlTest::pathToDataDirectory())*1024);
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //TODO get the srcDir dynamically
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char *srcDir=IntlTest::pathToDataDirectory();
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    idnTrie     = &profile->sprepTrie;
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    indexes     = profile->indexes;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mappingData = profile->mappingData;
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //initialize
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pTestIDNA = &test;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* prepare the filename beginning with the source dir */
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_strchr(srcDir,U_FILE_SEP_CHAR) == NULL){
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        filename[0] = 0x2E;
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        filename[1] = U_FILE_SEP_CHAR;
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_strcpy(filename+2,srcDir);
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_strcpy(filename, srcDir);
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    basename=filename+uprv_strlen(filename);
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *basename++=U_FILE_SEP_CHAR;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* process unassigned */
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    basename=filename+uprv_strlen(filename);
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(basename>filename && *(basename-1)!=U_FILE_SEP_CHAR) {
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *basename++=U_FILE_SEP_CHAR;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* first copy misc directory */
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    saveBasename = basename;
120b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uprv_strcpy(basename,SPREP_DIR);
121b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    basename = basename + uprv_strlen(SPREP_DIR);
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *basename++=U_FILE_SEP_CHAR;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* process unassigned */
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uprv_strcpy(basename,fileNames[0]);
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    parseMappings(filename,TRUE, test,&errorCode);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test.errln( "Could not open file %s for reading \n", filename);
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return errorCode;
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testAllCodepoints(test);
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pTestIDNA = NULL;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(filename);
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return errorCode;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void U_CALLCONV
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerustrprepProfileLineFn(void * /*context*/,
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              char *fields[][2], int32_t fieldCount,
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UErrorCode *pErrorCode) {
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t mapping[40];
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *end, *map;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t code;
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   /*UBool* mapWithNorm = (UBool*) context;*/
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* typeName;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t rangeStart=0,rangeEnd =0;
151b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *s;
152b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
153b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    s = u_skipWhitespace(fields[0][0]);
154b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (*s == '@') {
155b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        /* a special directive introduced in 4.2 */
156b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        return;
157b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
158b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(fieldCount != 3){
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode = U_INVALID_FORMAT_ERROR;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    typeName = fields[2][0];
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    map = fields[1][0];
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(uprv_strstr(typeName, usprepTypeNames[USPREP_UNASSIGNED])!=NULL){
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_parseCodePointRange(s, &rangeStart,&rangeEnd, pErrorCode);
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* store the range */
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        compareFlagsForRange(rangeStart,rangeEnd,USPREP_UNASSIGNED);
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_PROHIBITED])!=NULL){
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
176b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        u_parseCodePointRange(s, &rangeStart,&rangeEnd, pErrorCode);
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* store the range */
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        compareFlagsForRange(rangeStart,rangeEnd,USPREP_PROHIBITED);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else if(uprv_strstr(typeName, usprepTypeNames[USPREP_MAP])!=NULL){
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* get the character code, field 0 */
183b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        code=(uint32_t)uprv_strtoul(s, &end, 16);
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* parse the mapping string */
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=u_parseCodePoints(map, mapping, sizeof(mapping)/4, pErrorCode);
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* store the mapping */
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        compareMapping(code,mapping, length,USPREP_MAP);
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode = U_INVALID_FORMAT_ERROR;
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruparseMappings(const char *filename,UBool reportError, TestIDNA& test, UErrorCode *pErrorCode) {
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char *fields[3][2];
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_parseDelimitedFile(filename, ';', fields, 3, strprepProfileLineFn, (void*)filename, pErrorCode);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //fprintf(stdout,"Number of code points that have mappings with length >1 : %i\n",len);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(*pErrorCode) && (reportError || *pErrorCode!=U_FILE_ACCESS_ERROR)) {
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        test.errln( "testidn error: u_parseDelimitedFile(\"%s\") failed - %s\n", filename, u_errorName(*pErrorCode));
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UStringPrepType
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetValues(uint32_t result, int32_t& value, UBool& isIndex){
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringPrepType type;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(result == 0){
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Initial value stored in the mapping table
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * just return USPREP_TYPE_LIMIT .. so that
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * the source codepoint is copied to the destination
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        type = USPREP_TYPE_LIMIT;
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        isIndex =FALSE;
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        value = 0;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else if(result >= _SPREP_TYPE_THRESHOLD){
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        type = (UStringPrepType) (result - _SPREP_TYPE_THRESHOLD);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        isIndex =FALSE;
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        value = 0;
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* get the state */
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        type = USPREP_MAP;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* ascertain if the value is index or delta */
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result & 0x02){
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            isIndex = TRUE;
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            value = result  >> 2; //mask off the lower 2 bits and shift
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            isIndex = FALSE;
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            value = (int16_t)result;
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            value =  (value >> 2);
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((result>>2) == _SPREP_MAX_INDEX_VALUE){
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            type = USPREP_DELETE;
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            isIndex =FALSE;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            value = 0;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return type;
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerutestAllCodepoints(TestIDNA& test){
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar str[19] = {
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x070F,//prohibited
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        };
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t in[19] = {0};
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t inLength=0, outLength=100;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        char output[100] = {0};
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        punycode_status error;
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_strToUTF32((UChar32*)in,19,&inLength,str,19,&status);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        error= punycode_encode(inLength, in, NULL, (uint32_t*)&outLength, output);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        printf(output);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t i = 0;
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t unassigned      = 0;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t prohibited      = 0;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t mappedWithNorm  = 0;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t mapped          = 0;
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t noValueInTrie   = 0;
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringPrepType type;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t value;
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isIndex = FALSE;
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<=0x10FFFF;i++){
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t result = 0;
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UTRIE_GET16(idnTrie,i, result);
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        type = getValues(result,value, isIndex);
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(type != USPREP_TYPE_LIMIT ){
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(type == USPREP_UNASSIGNED){
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                unassigned++;
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(type == USPREP_PROHIBITED){
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                prohibited++;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(type == USPREP_MAP){
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                mapped++;
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            noValueInTrie++;
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(result > 0){
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                test.errln("The return value for 0x%06X is wrong. %i\n",i,result);
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.logln("Number of Unassinged code points : %i \n",unassigned);
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.logln("Number of Prohibited code points : %i \n",prohibited);
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.logln("Number of Mapped code points : %i \n",mapped);
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.logln("Number of Mapped with NFKC code points : %i \n",mappedWithNorm);
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    test.logln("Number of code points that have no value in Trie: %i \n",noValueInTrie);
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucompareMapping(uint32_t codepoint, uint32_t* mapping,int32_t mapLength,
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UStringPrepType type){
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t result = 0;
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UTRIE_GET16(idnTrie,codepoint, result);
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length=0;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isIndex;
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringPrepType retType;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t value, index=0, delta=0;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    retType = getValues(result,value,isIndex);
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(type != retType && retType != USPREP_DELETE){
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pTestIDNA->errln( "Did not get the assigned type for codepoint 0x%08X. Expected: %i Got: %i\n",codepoint, USPREP_MAP, type);
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(isIndex){
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index = value;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(index >= indexes[_SPREP_ONE_UCHAR_MAPPING_INDEX_START] &&
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 index < indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START]){
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length = 1;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(index >= indexes[_SPREP_TWO_UCHARS_MAPPING_INDEX_START] &&
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 index < indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START]){
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length = 2;
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else if(index >= indexes[_SPREP_THREE_UCHARS_MAPPING_INDEX_START] &&
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 index < indexes[_SPREP_FOUR_UCHARS_MAPPING_INDEX_START]){
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length = 3;
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length = mappingData[index++];
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delta = value;
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length = (retType == USPREP_DELETE)? 0 :  1;
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t realLength =0;
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* figure out the real length */
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t j=0; j<mapLength; j++){
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(mapping[j] > 0xFFFF){
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            realLength +=2;
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            realLength++;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(realLength != length){
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        pTestIDNA->errln( "Did not get the expected length. Expected: %i Got: %i\n", mapLength, length);
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(isIndex){
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(int8_t i =0; i< mapLength; i++){
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(mapping[i] <= 0xFFFF){
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(mappingData[index+i] != (uint16_t)mapping[i]){
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    pTestIDNA->errln("Did not get the expected result. Expected: 0x%04X Got: 0x%04X \n", mapping[i], mappingData[index+i]);
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }else{
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UChar lead  = UTF16_LEAD(mapping[i]);
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UChar trail = UTF16_TRAIL(mapping[i]);
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(mappingData[index+i] != lead ||
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    mappingData[index+i+1] != trail){
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    pTestIDNA->errln( "Did not get the expected result. Expected: 0x%04X 0x%04X  Got: 0x%04X 0x%04X", lead, trail, mappingData[index+i], mappingData[index+i+1]);
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(retType!=USPREP_DELETE && (codepoint-delta) != (uint16_t)mapping[0]){
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            pTestIDNA->errln("Did not get the expected result. Expected: 0x%04X Got: 0x%04X \n", mapping[0],(codepoint-delta));
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerucompareFlagsForRange(uint32_t start, uint32_t end,
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     UStringPrepType type){
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t result =0 ;
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UStringPrepType retType;
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isIndex=FALSE;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t value=0;
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // supplementary code point
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar __lead16=UTF16_LEAD(0x2323E);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t __offset;
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // get data for lead surrogate
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (result)=_UTRIE_GET_RAW((&idnTrie), index, 0, (__lead16));
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    __offset=(&idnTrie)->getFoldingOffset(result);
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // get the real data from the folded lead/trail units
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(__offset>0) {
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (result)=_UTRIE_GET_RAW((&idnTrie), index, __offset, (0x2323E)&0x3ff);
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (result)=(uint32_t)((&idnTrie)->initialValue);
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UTRIE_GET16(&idnTrie,0x2323E, result);
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(start < end+1){
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UTRIE_GET16(idnTrie,start, result);
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        retType = getValues(result,value,isIndex);
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(result > _SPREP_TYPE_THRESHOLD){
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(retType != type){
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pTestIDNA->errln( "FAIL: Did not get the expected type for 0x%06X. Expected: %s Got: %s\n",start,usprepTypeNames[type], usprepTypeNames[retType]);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }else{
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(type == USPREP_PROHIBITED && ((result & 0x01) != 0x01)){
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pTestIDNA->errln( "FAIL: Did not get the expected type for 0x%06X. Expected: %s Got: %s\n",start,usprepTypeNames[type], usprepTypeNames[retType]);
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        start++;
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_IDNA */
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Hey, Emacs, please set the following:
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables:
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End:
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
455