1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (c) 2002-2011, International Business Machines
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Author: Alan Liu
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Created: October 30 2002
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Since: ICU 2.4
9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* 2010nov19 Markus Scherer  Rewrite for formatVersion 2.
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru**********************************************************************
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "propname.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/udata.h"
1583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "unicode/uscript.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "umutex.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucln_cmn.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uarrsort.h"
21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "uinvchar.h"
22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#define INCLUDED_FROM_PROPNAME_CPP
24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "propname_data.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the next non-ignorable ASCII character from a property name
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and lowercases it.
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return ((advance count for the name)<<8)|character
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline int32_t
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetASCIIPropertyNameChar(const char *name) {
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char c;
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Ignore delimiters '-', '_', and ASCII White_Space */
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (c=name[i++])==0x2d || c==0x5f ||
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c==0x20 || (0x09<=c && c<=0x0d);
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {}
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(c!=0) {
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (i<<8)|(uint8_t)uprv_asciitolower((char)c);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return i<<8;
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Get the next non-ignorable EBCDIC character from a property name
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and lowercases it.
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return ((advance count for the name)<<8)|character
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline int32_t
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QuerugetEBCDICPropertyNameChar(const char *name) {
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char c;
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Ignore delimiters '-', '_', and EBCDIC White_Space */
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (c=name[i++])==0x60 || c==0x6d ||
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c==0x40 || c==0x05 || c==0x15 || c==0x25 || c==0x0b || c==0x0c || c==0x0d;
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {}
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(c!=0) {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (i<<8)|(uint8_t)uprv_ebcdictolower((char)c);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return i<<8;
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Unicode property names and property value names are compared "loosely".
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * UCD.html 4.0.1 says:
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   For all property names, property value names, and for property values for
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   Enumerated, Binary, or Catalog properties, use the following
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   loose matching rule:
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   LM3. Ignore case, whitespace, underscore ('_'), and hyphens.
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This function does just that, for (char *) name strings.
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It is almost identical to ucnv_compareNames() but also ignores
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * C0 White_Space characters (U+0009..U+000d, and U+0085 on EBCDIC).
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @internal
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_compareASCIIPropertyNames(const char *name1, const char *name2) {
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t rc, r1, r2;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(;;) {
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r1=getASCIIPropertyNameChar(name1);
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r2=getASCIIPropertyNameChar(name2);
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* If we reach the ends of both strings then they match */
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(((r1|r2)&0xff)==0) {
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0;
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Compare the lowercased characters */
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(r1!=r2) {
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rc=(r1&0xff)-(r2&0xff);
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(rc!=0) {
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return rc;
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name1+=r1>>8;
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name2+=r2>>8;
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_compareEBCDICPropertyNames(const char *name1, const char *name2) {
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t rc, r1, r2;
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(;;) {
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r1=getEBCDICPropertyNameChar(name1);
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        r2=getEBCDICPropertyNameChar(name2);
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* If we reach the ends of both strings then they match */
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(((r1|r2)&0xff)==0) {
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0;
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Compare the lowercased characters */
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(r1!=r2) {
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rc=(r1&0xff)-(r2&0xff);
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(rc!=0) {
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return rc;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name1+=r1>>8;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name2+=r2>>8;
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t PropNameData::findProperty(int32_t property) {
148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t i=1;  // valueMaps index, initially after numRanges
149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for(int32_t numRanges=valueMaps[0]; numRanges>0; --numRanges) {
150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // Read and skip the start and limit of this range.
151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t start=valueMaps[i];
152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t limit=valueMaps[i+1];
153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        i+=2;
154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(property<start) {
155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            break;
156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(property<limit) {
158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return i+(property-start)*2;
159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        i+=(limit-start)*2;  // Skip all entries for this range.
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return 0;
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t PropNameData::findPropertyValueNameGroup(int32_t valueMapIndex, int32_t value) {
166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(valueMapIndex==0) {
167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return 0;  // The property does not have named values.
168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    ++valueMapIndex;  // Skip the BytesTrie offset.
170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t numRanges=valueMaps[valueMapIndex++];
171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(numRanges<0x10) {
172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // Ranges of values.
173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        for(; numRanges>0; --numRanges) {
174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            // Read and skip the start and limit of this range.
175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t start=valueMaps[valueMapIndex];
176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t limit=valueMaps[valueMapIndex+1];
177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            valueMapIndex+=2;
178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(value<start) {
179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                break;
180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(value<limit) {
182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return valueMaps[valueMapIndex+value-start];
183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            valueMapIndex+=limit-start;  // Skip all entries for this range.
185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // List of values.
188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t valuesStart=valueMapIndex;
189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        int32_t nameGroupOffsetsStart=valueMapIndex+numRanges-0x10;
190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        do {
191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            int32_t v=valueMaps[valueMapIndex];
192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(value<v) {
193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                break;
194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if(value==v) {
196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                return valueMaps[nameGroupOffsetsStart+valueMapIndex-valuesStart];
197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        } while(++valueMapIndex<nameGroupOffsetsStart);
199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return 0;
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst char *PropNameData::getName(const char *nameGroup, int32_t nameIndex) {
204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t numNames=*nameGroup++;
205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(nameIndex<0 || numNames<=nameIndex) {
206b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;
207b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // Skip nameIndex names.
209b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    for(; nameIndex>0; --nameIndex) {
210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        nameGroup=uprv_strchr(nameGroup, 0)+1;
211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(*nameGroup==0) {
213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;  // no name (Property[Value]Aliases.txt has "n/a")
214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return nameGroup;
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
218b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoUBool PropNameData::containsName(BytesTrie &trie, const char *name) {
219b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(name==NULL) {
220b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return FALSE;
221b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
222b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UStringTrieResult result=USTRINGTRIE_NO_VALUE;
223b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    char c;
224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    while((c=*name++)!=0) {
225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        c=uprv_invCharToLowercaseAscii(c);
226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        // Ignore delimiters '-', '_', and ASCII White_Space.
227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(c==0x2d || c==0x5f || c==0x20 || (0x09<=c && c<=0x0d)) {
228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            continue;
229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        if(!USTRINGTRIE_HAS_NEXT(result)) {
231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            return FALSE;
232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        }
233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        result=trie.next((uint8_t)c);
234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return USTRINGTRIE_HAS_VALUE(result);
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst char *PropNameData::getPropertyName(int32_t property, int32_t nameChoice) {
239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t valueMapIndex=findProperty(property);
240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(valueMapIndex==0) {
241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;  // Not a known property.
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return getName(nameGroups+valueMaps[valueMapIndex], nameChoice);
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoconst char *PropNameData::getPropertyValueName(int32_t property, int32_t value, int32_t nameChoice) {
247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t valueMapIndex=findProperty(property);
248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(valueMapIndex==0) {
249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;  // Not a known property.
250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t nameGroupOffset=findPropertyValueNameGroup(valueMaps[valueMapIndex+1], value);
252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(nameGroupOffset==0) {
253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return NULL;
254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return getName(nameGroups+nameGroupOffset, nameChoice);
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t PropNameData::getPropertyOrValueEnum(int32_t bytesTrieOffset, const char *alias) {
259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    BytesTrie trie(bytesTries+bytesTrieOffset);
260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(containsName(trie, alias)) {
261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return trie.getValue();
262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    } else {
263b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return UCHAR_INVALID_CODE;
264b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
267b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t PropNameData::getPropertyEnum(const char *alias) {
268b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return getPropertyOrValueEnum(0, alias);
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint32_t PropNameData::getPropertyValueEnum(int32_t property, const char *alias) {
272b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t valueMapIndex=findProperty(property);
273b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(valueMapIndex==0) {
274b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return UCHAR_INVALID_CODE;  // Not a known property.
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
276b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    valueMapIndex=valueMaps[valueMapIndex+1];
277b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(valueMapIndex==0) {
278b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return UCHAR_INVALID_CODE;  // The property does not have named values.
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
280b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // valueMapIndex is the start of the property's valueMap,
281b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    // where the first word is the BytesTrie offset.
282b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return getPropertyOrValueEnum(valueMaps[valueMapIndex], alias);
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
284b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_END
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------------------------
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Public API implementation
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getPropertyName(UProperty property,
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  UPropertyNameChoice nameChoice) {
292b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    U_NAMESPACE_USE
293b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return PropNameData::getPropertyName(property, nameChoice);
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UProperty U_EXPORT2
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getPropertyEnum(const char* alias) {
298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    U_NAMESPACE_USE
299b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return (UProperty)PropNameData::getPropertyEnum(alias);
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI const char* U_EXPORT2
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getPropertyValueName(UProperty property,
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       int32_t value,
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UPropertyNameChoice nameChoice) {
306b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    U_NAMESPACE_USE
307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return PropNameData::getPropertyValueName(property, value, nameChoice);
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_getPropertyValueEnum(UProperty property,
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       const char* alias) {
313b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    U_NAMESPACE_USE
314b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return PropNameData::getPropertyValueEnum(property, alias);
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
31683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
31783a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CAPI const char*  U_EXPORT2
31883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliususcript_getName(UScriptCode scriptCode){
31983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    return u_getPropertyValueName(UCHAR_SCRIPT, scriptCode,
32083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                                  U_LONG_PROPERTY_NAME);
32183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
32283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
32383a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CAPI const char*  U_EXPORT2
32483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliususcript_getShortName(UScriptCode scriptCode){
32583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    return u_getPropertyValueName(UCHAR_SCRIPT, scriptCode,
32683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                                  U_SHORT_PROPERTY_NAME);
32783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
328