1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (c) 2002-2011, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Author: Alan Liu 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Created: October 30 2002 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Since: ICU 2.4 9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* 2010nov19 Markus Scherer Rewrite for formatVersion 2. 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru********************************************************************** 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef PROPNAME_H 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PROPNAME_H 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/bytestrie.h" 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uchar.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "udataswp.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uprops.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This header defines the in-memory layout of the property names data 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * structure representing the UCD data files PropertyAliases.txt and 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * PropertyValueAliases.txt. It is used by: 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * propname.cpp - reads data 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * genpname - creates data 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* low-level char * property name comparison -------------------------------- */ 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_BEGIN 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \var uprv_comparePropertyNames 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Unicode property names and property value names are compared "loosely". 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UCD.html 4.0.1 says: 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * For all property names, property value names, and for property values for 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Enumerated, Binary, or Catalog properties, use the following 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * loose matching rule: 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * LM3. Ignore case, whitespace, underscore ('_'), and hyphens. 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This function does just that, for (char *) name strings. 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * It is almost identical to ucnv_compareNames() but also ignores 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * C0 White_Space characters (U+0009..U+000d, and U+0085 on EBCDIC). 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_compareASCIIPropertyNames(const char *name1, const char *name2); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_compareEBCDICPropertyNames(const char *name1, const char *name2); 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if U_CHARSET_FAMILY==U_ASCII_FAMILY 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# define uprv_comparePropertyNames uprv_compareASCIIPropertyNames 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# define uprv_comparePropertyNames uprv_compareEBCDICPropertyNames 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# error U_CHARSET_FAMILY is not valid 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_END 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* UDataMemory structure and signatures ------------------------------------- */ 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PNAME_DATA_NAME "pnames" 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PNAME_DATA_TYPE "icu" 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Fields in UDataInfo: */ 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* PNAME_SIG[] is encoded as numeric literals for compatibility with the HP compiler */ 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PNAME_SIG_0 ((uint8_t)0x70) /* p */ 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PNAME_SIG_1 ((uint8_t)0x6E) /* n */ 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PNAME_SIG_2 ((uint8_t)0x61) /* a */ 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define PNAME_SIG_3 ((uint8_t)0x6D) /* m */ 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass PropNameData { 83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehopublic: 84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho enum { 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Byte offsets from the start of the data, after the generic header. 86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_VALUE_MAPS_OFFSET, 87b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_BYTE_TRIES_OFFSET, 88b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_NAME_GROUPS_OFFSET, 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_RESERVED3_OFFSET, 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_RESERVED4_OFFSET, 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_TOTAL_SIZE, 92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho // Other values. 94b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_MAX_NAME_LENGTH, 95b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_RESERVED7, 96b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho IX_COUNT 97b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho }; 98b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 99b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const char *getPropertyName(int32_t property, int32_t nameChoice); 100b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const char *getPropertyValueName(int32_t property, int32_t value, int32_t nameChoice); 101b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 102b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static int32_t getPropertyEnum(const char *alias); 103b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static int32_t getPropertyValueEnum(int32_t property, const char *alias); 104b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 105b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoprivate: 106b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static int32_t findProperty(int32_t property); 107b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static int32_t findPropertyValueNameGroup(int32_t valueMapIndex, int32_t value); 108b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const char *getName(const char *nameGroup, int32_t nameIndex); 109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static UBool containsName(BytesTrie &trie, const char *name); 110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static int32_t getPropertyOrValueEnum(int32_t bytesTrieOffset, const char *alias); 112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const int32_t indexes[]; 114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const int32_t valueMaps[]; 115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const uint8_t bytesTries[]; 116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho static const char nameGroups[]; 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* 120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * pnames.icu formatVersion 2 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * formatVersion 2 is new in ICU 4.8. 123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * In ICU 4.8, the pnames.icu data file is used only in ICU4J. 124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * ICU4C 4.8 has the same data structures hardcoded in source/common/propname_data.h. 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * For documentation of pnames.icu formatVersion 1 see ICU4C 4.6 (2010-dec-01) 127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * or earlier versions of this header file (source/common/propname.h). 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The pnames.icu begins with the standard ICU DataHeader/UDataInfo. 130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * After that: 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 132b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t indexes[8]; 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 134b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (See the PropNameData::IX_... constants.) 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 136b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The first 6 indexes are byte offsets from the beginning of the data 137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (beginning of indexes[]) to following structures. 138b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The length of each structure is the difference between its offset 139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * and the next one. 140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * All offsets are filled in: Where there is no data between two offsets, 141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * those two offsets are the same. 142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The last offset (indexes[PropNameData::IX_TOTAL_SIZE]) indicates the 143b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * total number of bytes in the file. (Not counting the standard headers.) 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 145b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The sixth index (indexes[PropNameData::IX_MAX_NAME_LENGTH]) has the 146b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * maximum length of any Unicode property (or property value) alias. 147b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (Without normalization, that is, including underscores etc.) 148b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 149b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t valueMaps[]; 150b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The valueMaps[] begins with a map from UProperty enums to properties, 152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * followed by the per-property value maps from property values to names, 153b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * for those properties that have named values. 154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (Binary & enumerated, plus General_Category_Mask.) 155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * valueMaps[0] contains the number of UProperty enum ranges. 157b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * For each range: 158b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t start, limit -- first and last+1 UProperty enum of a dense range 159b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Followed by (limit-start) pairs of 160b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t nameGroupOffset; 161b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Offset into nameGroups[] for the property's names/aliases. 162b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t valueMapIndex; 163b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Offset of the property's value map in the valueMaps[] array. 164b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * If the valueMapIndex is 0, then the property does not have named values. 165b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 166b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * For each property's value map: 167b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t bytesTrieOffset; -- Offset into bytesTries[] for name->value mapping. 168b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t numRanges; 169b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * If numRanges is in the range 1..15, then that many ranges of values follow. 170b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Per range: 171b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t start, limit -- first and last+1 UProperty enum of a range 172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Followed by (limit-start) entries of 173b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * int32_t nameGroupOffset; 174b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Offset into nameGroups[] for the property value's names/aliases. 175b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * If the nameGroupOffset is 0, then this is not a named value for this property. 176b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * (That is, the ranges need not be dense.) 177b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * If numRanges is >=0x10, then (numRanges-0x10) sorted values 178b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * and then (numRanges-0x10) corresponding nameGroupOffsets follow. 179b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Values are sorted as signed integers. 180b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * In this case, the set of values is dense; no nameGroupOffset will be 0. 181b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 182b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * For both properties and property values, ranges are sorted by their start/limit values. 183b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 184b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * uint8_t bytesTries[]; 185b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 186b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * This is a sequence of BytesTrie structures, byte-serialized tries for 187b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * mapping from names/aliases to values. 188b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The first one maps from property names/aliases to UProperty enum constants. 189b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The following ones are indexed by property value map bytesTrieOffsets 190b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * for mapping each property's names/aliases to their property values. 191b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 192b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * char nameGroups[]; 193b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 194b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * This is a sequence of property name groups. 195b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Each group is a list of names/aliases (invariant-character strings) for 196b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * one property or property value, in the order of UCharNameChoice. 197b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The first byte of each group is the number of names in the group. 198b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * It is followed by that many NUL-terminated strings. 199b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The first string is for the short name; if there is no short name, 200b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * then the first string is empty. 201b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The second string is the long name. Further strings are additional aliases. 202b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * 203b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * The first name group is for a property rather than a property value, 204b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * so that a nameGroupOffset of 0 can be used to indicate "no value" 205b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * in a property's sparse value ranges. 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 208b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_NAMESPACE_END 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 211