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