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