1999-12-13 22:25:50 +00:00
|
|
|
/*
|
|
|
|
*******************************************************************************
|
|
|
|
*
|
2010-07-23 23:51:14 +00:00
|
|
|
* Copyright (C) 1999-2010, International Business Machines
|
1999-12-13 22:25:50 +00:00
|
|
|
* Corporation and others. All Rights Reserved.
|
|
|
|
*
|
|
|
|
*******************************************************************************
|
|
|
|
* file name: store.c
|
|
|
|
* encoding: US-ASCII
|
|
|
|
* tab size: 8 (not used)
|
|
|
|
* indentation:4
|
|
|
|
*
|
|
|
|
* created on: 1999dec11
|
|
|
|
* created by: Markus W. Scherer
|
|
|
|
*
|
|
|
|
* Store Unicode character properties efficiently for
|
|
|
|
* random access.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
1999-12-28 23:57:50 +00:00
|
|
|
#include "unicode/utypes.h"
|
|
|
|
#include "unicode/uchar.h"
|
1999-12-13 22:25:50 +00:00
|
|
|
#include "cmemory.h"
|
|
|
|
#include "cstring.h"
|
2001-12-06 01:23:47 +00:00
|
|
|
#include "utrie.h"
|
1999-12-28 23:57:50 +00:00
|
|
|
#include "unicode/udata.h"
|
1999-12-13 22:25:50 +00:00
|
|
|
#include "unewdata.h"
|
2005-04-30 03:16:28 +00:00
|
|
|
#include "writesrc.h"
|
2002-02-25 18:48:30 +00:00
|
|
|
#include "uprops.h"
|
1999-12-13 22:25:50 +00:00
|
|
|
#include "genprops.h"
|
|
|
|
|
1999-12-15 04:42:56 +00:00
|
|
|
#define DO_DEBUG_OUT 0
|
|
|
|
|
1999-12-13 22:25:50 +00:00
|
|
|
/* Unicode character properties file format ------------------------------------
|
|
|
|
|
|
|
|
The file format prepared and written here contains several data
|
|
|
|
structures that store indexes or data.
|
|
|
|
|
1999-12-17 21:28:21 +00:00
|
|
|
Before the data contents described below, there are the headers required by
|
|
|
|
the udata API for loading ICU data. Especially, a UDataInfo structure
|
|
|
|
precedes the actual data. It contains platform properties values and the
|
|
|
|
file format version.
|
|
|
|
|
2009-11-13 19:25:21 +00:00
|
|
|
The following is a description of format version 6 .
|
2008-04-04 22:47:43 +00:00
|
|
|
|
1999-12-17 21:28:21 +00:00
|
|
|
Data contents:
|
|
|
|
|
1999-12-13 22:25:50 +00:00
|
|
|
The contents is a parsed, binary form of several Unicode character
|
2000-04-18 16:56:02 +00:00
|
|
|
database files, most prominently UnicodeData.txt.
|
1999-12-13 22:25:50 +00:00
|
|
|
|
|
|
|
Any Unicode code point from 0 to 0x10ffff can be looked up to get
|
|
|
|
the properties, if any, for that code point. This means that the input
|
|
|
|
to the lookup are 21-bit unsigned integers, with not all of the
|
|
|
|
21-bit range used.
|
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
It is assumed that client code keeps a uint32_t pointer
|
1999-12-13 22:25:50 +00:00
|
|
|
to the beginning of the data:
|
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
const uint32_t *p32;
|
1999-12-13 22:25:50 +00:00
|
|
|
|
|
|
|
Formally, the file contains the following structures:
|
|
|
|
|
2002-03-01 01:58:49 +00:00
|
|
|
const int32_t indexes[16] with values i0..i15:
|
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
i0 indicates the length of the main trie.
|
2009-11-13 19:25:21 +00:00
|
|
|
i0..i3 all have the same value in format versions 4.0 and higher;
|
2005-01-02 00:22:48 +00:00
|
|
|
the related props32[] and exceptions[] and uchars[] were used in format version 3
|
|
|
|
|
2002-03-01 01:58:49 +00:00
|
|
|
i0 propsIndex; -- 32-bit unit index to the table of 32-bit properties words
|
|
|
|
i1 exceptionsIndex; -- 32-bit unit index to the table of 32-bit exception words
|
|
|
|
i2 exceptionsTopIndex; -- 32-bit unit index to the array of UChars for special mappings
|
1999-12-15 19:04:11 +00:00
|
|
|
|
2002-03-01 01:58:49 +00:00
|
|
|
i3 additionalTrieIndex; -- 32-bit unit index to the additional trie for more properties
|
|
|
|
i4 additionalVectorsIndex; -- 32-bit unit index to the table of properties vectors
|
|
|
|
i5 additionalVectorsColumns; -- number of 32-bit words per properties vector
|
|
|
|
|
|
|
|
i6 reservedItemIndex; -- 32-bit unit index to the top of the properties vectors table
|
2002-07-04 16:47:57 +00:00
|
|
|
i7..i9 reservedIndexes; -- reserved values; 0 for now
|
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
i10 maxValues; -- maximum code values for vector word 0, see uprops.h (new in format version 3.1+)
|
|
|
|
i11 maxValues2; -- maximum code values for vector word 2, see uprops.h (new in format version 3.2)
|
2003-03-07 21:43:18 +00:00
|
|
|
i12..i15 reservedIndexes; -- reserved values; 0 for now
|
1999-12-15 19:04:11 +00:00
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
PT serialized properties trie, see utrie.h (byte size: 4*(i0-16))
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2009-11-13 19:25:21 +00:00
|
|
|
P, E, and U are not used (empty) in format versions 4 and above
|
2005-01-02 00:22:48 +00:00
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
P const uint32_t props32[i1-i0];
|
|
|
|
E const uint32_t exceptions[i2-i1];
|
|
|
|
U const UChar uchars[2*(i3-i2)];
|
|
|
|
|
2002-03-01 01:58:49 +00:00
|
|
|
AT serialized trie for additional properties (byte size: 4*(i4-i3))
|
|
|
|
PV const uint32_t propsVectors[(i6-i4)/i5][i5]==uint32_t propsVectors[i6-i4];
|
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
Trie lookup and properties:
|
1999-12-13 22:25:50 +00:00
|
|
|
|
|
|
|
In order to condense the data for the 21-bit code space, several properties of
|
|
|
|
the Unicode code assignment are exploited:
|
|
|
|
- The code space is sparse.
|
1999-12-15 04:42:56 +00:00
|
|
|
- There are several 10k of consecutive codes with the same properties.
|
1999-12-13 22:25:50 +00:00
|
|
|
- Characters and scripts are allocated in groups of 16 code points.
|
|
|
|
- Inside blocks for scripts the properties are often repetitive.
|
|
|
|
- The 21-bit space is not fully used for Unicode.
|
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
The lookup of properties for a given code point is done with a trie lookup,
|
|
|
|
using the UTrie implementation.
|
2005-01-02 00:22:48 +00:00
|
|
|
The trie lookup result is a 16-bit properties word.
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
With a given Unicode code point
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
UChar32 c;
|
2000-04-18 16:56:02 +00:00
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
and 0<=c<0x110000, the lookup is done like this:
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
uint16_t props;
|
|
|
|
UTRIE_GET16(trie, c, props);
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
Each 16-bit properties word contains:
|
1999-12-13 22:25:50 +00:00
|
|
|
|
|
|
|
0.. 4 general category
|
2009-11-13 19:25:21 +00:00
|
|
|
5 reserved
|
|
|
|
6..15 numeric type and value (ntv)
|
|
|
|
|
|
|
|
Encoding of numeric type and value in the 10-bit ntv field:
|
|
|
|
ntv type value
|
|
|
|
0 U_NT_NONE 0
|
|
|
|
1..10 U_NT_DECIMAL 0..9
|
|
|
|
11..20 U_NT_DIGIT 0..9
|
|
|
|
21..0x2ff U_NT_NUMERIC see below
|
|
|
|
0x300..0x3ff reserved
|
|
|
|
|
|
|
|
For U_NT_NUMERIC:
|
|
|
|
ntv value
|
|
|
|
21..0xaf integer 0..154
|
|
|
|
0xb0..0x1df fraction ((ntv>>4)-12) / ((ntv&0xf)+1) = -1..17 / 1..16
|
|
|
|
0x1e0..0x2ff large int ((ntv>>5)-14) * 10^((ntv&0x1f)+2) = (1..9)*(10^2..10^33)
|
|
|
|
(only one significant decimal digit)
|
1999-12-17 21:28:21 +00:00
|
|
|
|
2002-03-01 01:58:49 +00:00
|
|
|
--- Additional properties (new in format version 2.1) ---
|
|
|
|
|
|
|
|
The second trie for additional properties (AT) is also a UTrie with 16-bit data.
|
|
|
|
The data words consist of 32-bit unit indexes (not row indexes!) into the
|
|
|
|
table of unique properties vectors (PV).
|
2002-03-04 01:31:42 +00:00
|
|
|
Each vector contains a set of properties.
|
|
|
|
The width of a vector (number of uint32_t per row) may change
|
2002-03-01 01:58:49 +00:00
|
|
|
with the formatVersion, it is stored in i5.
|
|
|
|
|
2002-03-04 01:31:42 +00:00
|
|
|
Current properties: see icu/source/common/uprops.h
|
2002-03-01 01:58:49 +00:00
|
|
|
|
2003-03-07 21:43:18 +00:00
|
|
|
--- Changes in format version 3.1 ---
|
|
|
|
|
|
|
|
See i10 maxValues above, contains only UBLOCK_COUNT and USCRIPT_CODE_LIMIT.
|
|
|
|
|
|
|
|
--- Changes in format version 3.2 ---
|
|
|
|
|
|
|
|
- The tries use linear Latin-1 ranges.
|
|
|
|
- The additional properties bits store full properties XYZ instead
|
|
|
|
of partial Other_XYZ, so that changes in the derivation formulas
|
|
|
|
need not be tracked in runtime library code.
|
|
|
|
- Joining Type and Line Break are also stored completely, so that uprops.c
|
|
|
|
needs no runtime formulas for enumerated properties either.
|
|
|
|
- Store the case-sensitive flag in the main properties word.
|
|
|
|
- i10 also contains U_LB_COUNT and U_EA_COUNT.
|
|
|
|
- i11 contains maxValues2 for vector word 2.
|
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
--- Changes in format version 4 ---
|
|
|
|
|
|
|
|
The format changes between version 3 and 4 because the properties related to
|
|
|
|
case mappings and bidi/shaping are pulled out into separate files
|
|
|
|
for modularization.
|
|
|
|
In order to reduce the need for code changes, some of the previous data
|
|
|
|
structures are omitted, rather than rearranging everything.
|
|
|
|
|
|
|
|
(The change to format version 4 is for ICU 3.4. The last CVS revision of
|
|
|
|
genprops/store.c for format version 3.2 is 1.48.)
|
|
|
|
|
|
|
|
The main trie's data is significantly simplified:
|
|
|
|
- The trie's 16-bit data word is used directly instead of as an index
|
|
|
|
into props32[].
|
|
|
|
- The trie uses the default trie folding functions instead of custom ones.
|
|
|
|
- Numeric values are stored directly in the trie data word, with special
|
|
|
|
encodings.
|
|
|
|
- No more exception data (the data that needed it was pulled out, or, in the
|
|
|
|
case of numeric values, encoded differently).
|
|
|
|
- No more string data (pulled out - was for case mappings).
|
|
|
|
|
|
|
|
Also, some of the previously used properties vector bits are reserved again.
|
|
|
|
|
|
|
|
The indexes[] values for the omitted structures are still filled in
|
|
|
|
(indicating zero-length arrays) so that the swapper code remains unchanged.
|
|
|
|
|
2008-04-04 22:47:43 +00:00
|
|
|
--- Changes in format version 5 ---
|
|
|
|
|
2009-11-13 19:25:21 +00:00
|
|
|
Format version 5 became necessary because the bit field for script codes
|
|
|
|
overflowed. The changes are incompatible because
|
|
|
|
old code would have seen nonsensically low values for new, higher script codes.
|
|
|
|
|
|
|
|
Rearranged bit fields in the second trie (AT) and widened three (Script, Block,
|
|
|
|
Word_Break) by one bit each.
|
|
|
|
|
2008-04-04 22:47:43 +00:00
|
|
|
Modified bit fields in icu/source/common/uprops.h
|
|
|
|
|
2009-11-13 19:25:21 +00:00
|
|
|
--- Changes in format version 6 ---
|
|
|
|
|
|
|
|
Format version 6 became necessary because Unicode 5.2 adds fractions with
|
|
|
|
denominators 9, 10 and 16, and it was easier to redesign the encoding of numeric
|
|
|
|
types and values rather than add another variant to the previous format.
|
|
|
|
|
1999-12-13 22:25:50 +00:00
|
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
/* UDataInfo cf. udata.h */
|
2000-04-18 16:56:02 +00:00
|
|
|
static UDataInfo dataInfo={
|
1999-12-13 22:25:50 +00:00
|
|
|
sizeof(UDataInfo),
|
|
|
|
0,
|
|
|
|
|
|
|
|
U_IS_BIG_ENDIAN,
|
|
|
|
U_CHARSET_FAMILY,
|
|
|
|
U_SIZEOF_UCHAR,
|
|
|
|
0,
|
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
{ 0x55, 0x50, 0x72, 0x6f }, /* dataFormat="UPro" */
|
2009-11-13 19:25:21 +00:00
|
|
|
{ 6, 0, UTRIE_SHIFT, UTRIE_INDEX_SHIFT }, /* formatVersion */
|
2008-04-04 22:47:43 +00:00
|
|
|
{ 5, 1, 0, 0 } /* dataVersion */
|
1999-12-13 22:25:50 +00:00
|
|
|
};
|
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
static UNewTrie *pTrie=NULL;
|
1999-12-13 22:25:50 +00:00
|
|
|
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
|
|
|
2000-04-18 16:56:02 +00:00
|
|
|
extern void
|
|
|
|
setUnicodeVersion(const char *v) {
|
|
|
|
UVersionInfo version;
|
2001-02-14 00:45:29 +00:00
|
|
|
u_versionFromString(version, v);
|
2000-04-18 16:56:02 +00:00
|
|
|
uprv_memcpy(dataInfo.dataVersion, version, 4);
|
|
|
|
}
|
|
|
|
|
1999-12-13 22:25:50 +00:00
|
|
|
extern void
|
|
|
|
initStore() {
|
2005-01-02 00:22:48 +00:00
|
|
|
pTrie=utrie_open(NULL, NULL, 40000, 0, 0, TRUE);
|
2001-12-06 01:23:47 +00:00
|
|
|
if(pTrie==NULL) {
|
|
|
|
fprintf(stderr, "error: unable to create a UNewTrie\n");
|
|
|
|
exit(U_MEMORY_ALLOCATION_ERROR);
|
|
|
|
}
|
|
|
|
|
2002-03-04 01:31:42 +00:00
|
|
|
initAdditionalProperties();
|
1999-12-13 22:25:50 +00:00
|
|
|
}
|
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
extern void
|
|
|
|
exitStore() {
|
|
|
|
utrie_close(pTrie);
|
|
|
|
exitAdditionalProperties();
|
|
|
|
}
|
|
|
|
|
1999-12-13 22:25:50 +00:00
|
|
|
/* store a character's properties ------------------------------------------- */
|
|
|
|
|
2001-03-15 20:38:36 +00:00
|
|
|
extern uint32_t
|
|
|
|
makeProps(Props *p) {
|
2005-01-02 00:22:48 +00:00
|
|
|
uint32_t den;
|
2009-11-13 19:25:21 +00:00
|
|
|
int32_t type, value, exp, ntv;
|
1999-12-15 04:42:56 +00:00
|
|
|
|
2005-07-11 20:45:46 +00:00
|
|
|
/* encode numeric type & value */
|
|
|
|
type=p->numericType;
|
|
|
|
value=p->numericValue;
|
|
|
|
den=p->denominator;
|
|
|
|
exp=p->exponent;
|
|
|
|
|
2009-11-13 19:25:21 +00:00
|
|
|
ntv=-1; /* the numeric type and value cannot be encoded if ntv remains -1 */
|
|
|
|
switch(type) {
|
|
|
|
case U_NT_NONE:
|
|
|
|
if(value==0 && den==0 && exp==0) {
|
|
|
|
ntv=UPROPS_NTV_NONE;
|
2005-07-11 20:45:46 +00:00
|
|
|
}
|
2009-11-13 19:25:21 +00:00
|
|
|
break;
|
|
|
|
case U_NT_DECIMAL:
|
|
|
|
if(0<=value && value<=9 && den==0 && exp==0) {
|
|
|
|
ntv=UPROPS_NTV_DECIMAL_START+value;
|
2005-07-11 20:45:46 +00:00
|
|
|
}
|
2009-11-13 19:25:21 +00:00
|
|
|
break;
|
|
|
|
case U_NT_DIGIT:
|
|
|
|
if(0<=value && value<=9 && den==0 && exp==0) {
|
|
|
|
ntv=UPROPS_NTV_DIGIT_START+value;
|
2005-07-11 20:45:46 +00:00
|
|
|
}
|
2009-11-13 19:25:21 +00:00
|
|
|
break;
|
|
|
|
case U_NT_NUMERIC:
|
|
|
|
if(den==0) {
|
|
|
|
if(exp==2 && (value*100)<=UPROPS_NTV_MAX_SMALL_INT) {
|
|
|
|
/* small integer parsed like a large one */
|
|
|
|
ntv=UPROPS_NTV_NUMERIC_START+value*100;
|
|
|
|
} else if(exp==0 && value>=0) {
|
|
|
|
if(value<=UPROPS_NTV_MAX_SMALL_INT) {
|
|
|
|
/* small integer */
|
|
|
|
ntv=UPROPS_NTV_NUMERIC_START+value;
|
|
|
|
} else {
|
|
|
|
/* large integer parsed like a small one */
|
|
|
|
/* split the value into mantissa and exponent, base 10 */
|
|
|
|
int32_t mant=value;
|
|
|
|
while((mant%10)==0) {
|
|
|
|
mant/=10;
|
|
|
|
++exp;
|
|
|
|
}
|
|
|
|
if(mant<=9) {
|
|
|
|
ntv=((mant+14)<<5)+(exp-2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if(2<=exp && exp<=33 && 1<=value && value<=9) {
|
|
|
|
/* large, single-significant-digit integer */
|
|
|
|
ntv=((value+14)<<5)+(exp-2);
|
|
|
|
}
|
|
|
|
} else if(exp==0) {
|
|
|
|
if(-1<=value && value<=17 && 1<=den && den<=16) {
|
|
|
|
/* fraction */
|
|
|
|
ntv=((value+12)<<4)+(den-1);
|
2005-07-11 20:45:46 +00:00
|
|
|
}
|
2000-04-18 16:56:02 +00:00
|
|
|
}
|
2009-11-13 19:25:21 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if(ntv<0) {
|
|
|
|
fprintf(stderr, "genprops error: unable to encode numeric type %d & value %ld/%lu E%d\n",
|
|
|
|
(int)type, (long)value, (unsigned long)den, exp);
|
|
|
|
exit(U_ILLEGAL_ARGUMENT_ERROR);
|
2005-07-11 20:45:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* encode the properties */
|
|
|
|
return
|
|
|
|
(uint32_t)p->generalCategory |
|
2009-11-13 19:25:21 +00:00
|
|
|
(ntv<<UPROPS_NUMERIC_TYPE_VALUE_SHIFT);
|
1999-12-15 04:42:56 +00:00
|
|
|
}
|
|
|
|
|
2001-03-15 20:38:36 +00:00
|
|
|
extern void
|
|
|
|
addProps(uint32_t c, uint32_t x) {
|
2001-12-16 21:15:09 +00:00
|
|
|
if(!utrie_set32(pTrie, (UChar32)c, x)) {
|
|
|
|
fprintf(stderr, "error: too many entries for the properties trie\n");
|
|
|
|
exit(U_BUFFER_OVERFLOW_ERROR);
|
|
|
|
}
|
2001-03-15 20:38:36 +00:00
|
|
|
}
|
|
|
|
|
2003-03-14 22:00:19 +00:00
|
|
|
extern uint32_t
|
|
|
|
getProps(uint32_t c) {
|
|
|
|
return utrie_get32(pTrie, (UChar32)c, NULL);
|
|
|
|
}
|
|
|
|
|
1999-12-15 04:42:56 +00:00
|
|
|
/* areas of same properties ------------------------------------------------- */
|
|
|
|
|
|
|
|
extern void
|
2001-03-15 20:38:36 +00:00
|
|
|
repeatProps(uint32_t first, uint32_t last, uint32_t x) {
|
2001-12-16 21:15:09 +00:00
|
|
|
if(!utrie_setRange32(pTrie, (UChar32)first, (UChar32)(last+1), x, FALSE)) {
|
|
|
|
fprintf(stderr, "error: too many entries for the properties trie\n");
|
|
|
|
exit(U_BUFFER_OVERFLOW_ERROR);
|
|
|
|
}
|
1999-12-15 19:04:11 +00:00
|
|
|
}
|
|
|
|
|
1999-12-13 22:25:50 +00:00
|
|
|
/* generate output data ----------------------------------------------------- */
|
|
|
|
|
|
|
|
extern void
|
2005-04-30 03:16:28 +00:00
|
|
|
generateData(const char *dataDir, UBool csource) {
|
2002-02-25 22:41:40 +00:00
|
|
|
static int32_t indexes[UPROPS_INDEX_COUNT]={
|
2001-12-06 01:23:47 +00:00
|
|
|
0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0,
|
|
|
|
0, 0, 0, 0,
|
1999-12-17 21:28:21 +00:00
|
|
|
0, 0, 0, 0
|
1999-12-16 01:50:39 +00:00
|
|
|
};
|
2001-12-06 01:23:47 +00:00
|
|
|
static uint8_t trieBlock[40000];
|
2002-03-04 01:31:42 +00:00
|
|
|
static uint8_t additionalProps[120000];
|
1999-12-16 01:50:39 +00:00
|
|
|
|
1999-12-13 22:25:50 +00:00
|
|
|
UNewDataMemory *pData;
|
|
|
|
UErrorCode errorCode=U_ZERO_ERROR;
|
2006-03-22 09:22:46 +00:00
|
|
|
uint32_t size = 0;
|
2002-02-25 18:48:30 +00:00
|
|
|
int32_t trieSize, additionalPropsSize, offset;
|
1999-12-13 22:25:50 +00:00
|
|
|
long dataLength;
|
1999-12-15 19:04:11 +00:00
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
trieSize=utrie_serialize(pTrie, trieBlock, sizeof(trieBlock), NULL, TRUE, &errorCode);
|
2001-12-06 01:23:47 +00:00
|
|
|
if(U_FAILURE(errorCode)) {
|
2002-02-08 04:53:41 +00:00
|
|
|
fprintf(stderr, "error: utrie_serialize failed: %s (length %ld)\n", u_errorName(errorCode), (long)trieSize);
|
2001-12-06 01:23:47 +00:00
|
|
|
exit(errorCode);
|
1999-12-15 19:04:11 +00:00
|
|
|
}
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2001-12-06 01:23:47 +00:00
|
|
|
offset=sizeof(indexes)/4; /* uint32_t offset to the properties trie */
|
2000-12-04 21:02:16 +00:00
|
|
|
|
2005-01-02 00:22:48 +00:00
|
|
|
/* round up trie size to 4-alignment */
|
2001-12-06 01:23:47 +00:00
|
|
|
trieSize=(trieSize+3)&~3;
|
|
|
|
offset+=trieSize>>2;
|
2005-01-02 00:22:48 +00:00
|
|
|
indexes[UPROPS_PROPS32_INDEX]= /* set indexes to the same offsets for empty */
|
|
|
|
indexes[UPROPS_EXCEPTIONS_INDEX]= /* structures from the old format version 3 */
|
|
|
|
indexes[UPROPS_EXCEPTIONS_TOP_INDEX]= /* so that less runtime code has to be changed */
|
2002-02-25 18:48:30 +00:00
|
|
|
indexes[UPROPS_ADDITIONAL_TRIE_INDEX]=offset;
|
1999-12-15 19:04:11 +00:00
|
|
|
|
|
|
|
if(beVerbose) {
|
2004-05-30 09:03:43 +00:00
|
|
|
printf("trie size in bytes: %5u\n", (int)trieSize);
|
2002-02-25 18:48:30 +00:00
|
|
|
}
|
|
|
|
|
2005-04-30 03:16:28 +00:00
|
|
|
if(csource) {
|
|
|
|
/* write .c file for hardcoded data */
|
|
|
|
UTrie trie={ NULL };
|
2008-10-22 19:50:07 +00:00
|
|
|
UTrie2 *trie2;
|
2005-04-30 03:16:28 +00:00
|
|
|
FILE *f;
|
|
|
|
|
|
|
|
utrie_unserialize(&trie, trieBlock, trieSize, &errorCode);
|
|
|
|
if(U_FAILURE(errorCode)) {
|
|
|
|
fprintf(
|
|
|
|
stderr,
|
2005-05-03 23:14:54 +00:00
|
|
|
"genprops error: failed to utrie_unserialize(uprops.icu main trie) - %s\n",
|
2005-04-30 03:16:28 +00:00
|
|
|
u_errorName(errorCode));
|
2008-10-22 19:50:07 +00:00
|
|
|
exit(errorCode);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* use UTrie2 */
|
|
|
|
trie2=utrie2_fromUTrie(&trie, 0, &errorCode);
|
|
|
|
if(U_FAILURE(errorCode)) {
|
|
|
|
fprintf(
|
|
|
|
stderr,
|
|
|
|
"genprops error: utrie2_fromUTrie() failed - %s\n",
|
|
|
|
u_errorName(errorCode));
|
|
|
|
exit(errorCode);
|
|
|
|
}
|
|
|
|
{
|
|
|
|
/* delete lead surrogate code unit values */
|
|
|
|
UChar lead;
|
|
|
|
trie2=utrie2_cloneAsThawed(trie2, &errorCode);
|
|
|
|
for(lead=0xd800; lead<0xdc00; ++lead) {
|
|
|
|
utrie2_set32ForLeadSurrogateCodeUnit(trie2, lead, trie2->initialValue, &errorCode);
|
|
|
|
}
|
|
|
|
utrie2_freeze(trie2, UTRIE2_16_VALUE_BITS, &errorCode);
|
|
|
|
if(U_FAILURE(errorCode)) {
|
|
|
|
fprintf(
|
|
|
|
stderr,
|
|
|
|
"genprops error: deleting lead surrogate code unit values failed - %s\n",
|
|
|
|
u_errorName(errorCode));
|
|
|
|
exit(errorCode);
|
|
|
|
}
|
2005-04-30 03:16:28 +00:00
|
|
|
}
|
2002-02-25 18:48:30 +00:00
|
|
|
|
2005-04-30 03:16:28 +00:00
|
|
|
f=usrc_create(dataDir, "uchar_props_data.c");
|
|
|
|
if(f!=NULL) {
|
2009-11-13 19:25:21 +00:00
|
|
|
/* unused
|
2005-04-30 03:16:28 +00:00
|
|
|
usrc_writeArray(f,
|
|
|
|
"static const UVersionInfo formatVersion={",
|
|
|
|
dataInfo.formatVersion, 8, 4,
|
|
|
|
"};\n\n");
|
2009-11-13 19:25:21 +00:00
|
|
|
*/
|
2005-04-30 03:16:28 +00:00
|
|
|
usrc_writeArray(f,
|
|
|
|
"static const UVersionInfo dataVersion={",
|
|
|
|
dataInfo.dataVersion, 8, 4,
|
|
|
|
"};\n\n");
|
2008-10-22 19:50:07 +00:00
|
|
|
usrc_writeUTrie2Arrays(f,
|
2005-04-30 03:16:28 +00:00
|
|
|
"static const uint16_t propsTrie_index[%ld]={\n", NULL,
|
2008-10-22 19:50:07 +00:00
|
|
|
trie2,
|
2005-04-30 03:16:28 +00:00
|
|
|
"\n};\n\n");
|
2008-10-22 19:50:07 +00:00
|
|
|
usrc_writeUTrie2Struct(f,
|
|
|
|
"static const UTrie2 propsTrie={\n",
|
|
|
|
trie2, "propsTrie_index", NULL,
|
2005-04-30 03:16:28 +00:00
|
|
|
"};\n\n");
|
|
|
|
|
|
|
|
additionalPropsSize=writeAdditionalData(f, additionalProps, sizeof(additionalProps), indexes);
|
|
|
|
size=4*offset+additionalPropsSize; /* total size of data */
|
|
|
|
|
|
|
|
usrc_writeArray(f,
|
|
|
|
"static const int32_t indexes[UPROPS_INDEX_COUNT]={",
|
|
|
|
indexes, 32, UPROPS_INDEX_COUNT,
|
|
|
|
"};\n\n");
|
|
|
|
fclose(f);
|
|
|
|
}
|
2008-10-22 19:50:07 +00:00
|
|
|
utrie2_close(trie2);
|
2005-04-30 03:16:28 +00:00
|
|
|
} else {
|
|
|
|
/* write the data */
|
|
|
|
pData=udata_create(dataDir, DATA_TYPE, DATA_NAME, &dataInfo,
|
|
|
|
haveCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode);
|
|
|
|
if(U_FAILURE(errorCode)) {
|
2010-07-23 23:51:14 +00:00
|
|
|
fprintf(stderr, "genprops: udata_create(%s, %s.%s) failed - %s\n",
|
|
|
|
dataDir, DATA_NAME, DATA_TYPE,
|
|
|
|
u_errorName(errorCode));
|
2005-04-30 03:16:28 +00:00
|
|
|
exit(errorCode);
|
|
|
|
}
|
1999-12-15 19:04:11 +00:00
|
|
|
|
2005-04-30 03:16:28 +00:00
|
|
|
additionalPropsSize=writeAdditionalData(NULL, additionalProps, sizeof(additionalProps), indexes);
|
|
|
|
size=4*offset+additionalPropsSize; /* total size of data */
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2005-04-30 03:16:28 +00:00
|
|
|
udata_writeBlock(pData, indexes, sizeof(indexes));
|
|
|
|
udata_writeBlock(pData, trieBlock, trieSize);
|
|
|
|
udata_writeBlock(pData, additionalProps, additionalPropsSize);
|
1999-12-13 22:25:50 +00:00
|
|
|
|
2005-04-30 03:16:28 +00:00
|
|
|
/* finish up */
|
|
|
|
dataLength=udata_finish(pData, &errorCode);
|
|
|
|
if(U_FAILURE(errorCode)) {
|
|
|
|
fprintf(stderr, "genprops: error %d writing the output file\n", errorCode);
|
|
|
|
exit(errorCode);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(dataLength!=(long)size) {
|
|
|
|
fprintf(stderr, "genprops: data length %ld != calculated size %lu\n",
|
|
|
|
dataLength, (unsigned long)size);
|
|
|
|
exit(U_INTERNAL_PROGRAM_ERROR);
|
|
|
|
}
|
1999-12-13 22:25:50 +00:00
|
|
|
}
|
|
|
|
|
2005-04-30 03:16:28 +00:00
|
|
|
if(beVerbose) {
|
|
|
|
printf("data size: %6lu\n", (unsigned long)size);
|
1999-12-13 22:25:50 +00:00
|
|
|
}
|
|
|
|
}
|
2000-02-29 18:42:28 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Hey, Emacs, please set the following:
|
|
|
|
*
|
|
|
|
* Local Variables:
|
|
|
|
* indent-tabs-mode: nil
|
|
|
|
* End:
|
|
|
|
*
|
|
|
|
*/
|