ICU-20111 move text layout properties data into a new ulayout.icu data file

This commit is contained in:
Markus Scherer 2019-02-13 14:35:10 -08:00
parent 6942013a38
commit d2e3a8847d
16 changed files with 592 additions and 1759 deletions

1
.gitignore vendored
View file

@ -76,7 +76,6 @@ icu4c/source/data/build-dir
icu4c/source/data/build-local
icu4c/source/data/data
icu4c/source/data/icupkg.inc
icu4c/source/data/in
icu4c/source/data/makedata.vcproj.*.*.user
icu4c/source/data/obj
icu4c/source/data/out

View file

@ -426,6 +426,7 @@
<ClInclude Include="propname.h" />
<ClInclude Include="ruleiter.h" />
<ClInclude Include="ucase.h" />
<ClInclude Include="ulayout_props.h" />
<ClInclude Include="unisetspan.h" />
<ClInclude Include="uprops.h" />
<ClInclude Include="usc_impl.h" />

View file

@ -855,6 +855,9 @@
<ClInclude Include="ucase.h">
<Filter>properties &amp; sets</Filter>
</ClInclude>
<ClInclude Include="ulayout_props.h">
<Filter>properties &amp; sets</Filter>
</ClInclude>
<ClInclude Include="unisetspan.h">
<Filter>properties &amp; sets</Filter>
</ClInclude>

View file

@ -554,6 +554,7 @@
<ClInclude Include="propname.h" />
<ClInclude Include="ruleiter.h" />
<ClInclude Include="ucase.h" />
<ClInclude Include="ulayout_props.h" />
<ClInclude Include="unisetspan.h" />
<ClInclude Include="uprops.h" />
<ClInclude Include="usc_impl.h" />

View file

@ -0,0 +1,46 @@
// © 2019 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
// ulayout_props.h
// created: 2019feb12 Markus W. Scherer
#ifndef __ULAYOUT_PROPS_H__
#define __ULAYOUT_PROPS_H__
#include "unicode/utypes.h"
// file definitions ------------------------------------------------------------
#define ULAYOUT_DATA_NAME "ulayout"
#define ULAYOUT_DATA_TYPE "icu"
// data format "Layo"
#define ULAYOUT_FMT_0 0x4c
#define ULAYOUT_FMT_1 0x61
#define ULAYOUT_FMT_2 0x79
#define ULAYOUT_FMT_3 0x6f
// indexes into indexes[]
enum {
// Element 0 stores the length of the indexes[] array.
ULAYOUT_IX_INDEXES_LENGTH,
// Elements 1..7 store the tops of consecutive code point tries.
// No trie is stored if the difference between two of these is less than 16.
ULAYOUT_IX_INPC_TRIE_TOP,
ULAYOUT_IX_INSC_TRIE_TOP,
ULAYOUT_IX_VO_TRIE_TOP,
ULAYOUT_IX_RESERVED_TOP,
ULAYOUT_IX_TRIES_TOP = 7,
ULAYOUT_IX_MAX_VALUES = 9,
// Length of indexes[]. Multiple of 4 to 16-align the tries.
ULAYOUT_IX_COUNT = 12
};
constexpr int32_t ULAYOUT_MAX_INPC_SHIFT = 24;
constexpr int32_t ULAYOUT_MAX_INSC_SHIFT = 16;
constexpr int32_t ULAYOUT_MAX_VO_SHIFT = 8;
#endif // __ULAYOUT_PROPS_H__

View file

@ -1,727 +0,0 @@
// © 2018 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
//
// file name: ulayout_props_data.h
//
// machine-generated by: icu/tools/unicode/c/genprops/layoutpropsbuilder.cpp
#ifdef INCLUDED_FROM_UPROPS_CPP
static const int32_t maxInPCValue = 14;
static const uint16_t inpc_trieIndex[799]={
0,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0x80,0xc0,0xff,0x13f,0x17e,0x1be,0x17e,0x1fe,0x23e,0x27e,0x2bc,0x2fc,
0x33c,0x37b,0x23e,0x3bb,0x3fb,0x439,0x477,0x4ad,0x4e1,0x521,0x531,0x571,0x599,0x5d9,0x619,0x656,
0x2d7,0x2e8,0x2f4,0x2e8,0x30f,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0,0x10,0x20,
0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,
0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0x80,0x90,0xa0,
0xb0,0xc0,0xd0,0xe0,0xf0,0xff,0x10f,0x11f,0x12f,0x13f,0x14f,0x15f,0x16f,0x17e,0x18e,0x19e,
0x1ae,0x1be,0x1ce,0x1de,0x1ee,0x17e,0x18e,0x19e,0x1ae,0x1fe,0x20e,0x21e,0x22e,0x23e,0x24e,0x25e,
0x26e,0x27e,0x28e,0x29e,0x2ae,0x2bc,0x2cc,0x2dc,0x2ec,0x2fc,0x30c,0x31c,0x32c,0x33c,0x34c,0x35c,
0x36c,0x37b,0x38b,0x39b,0x3ab,0x23e,0x24e,0x25e,0x26e,0x3bb,0x3cb,0x3db,0x3eb,0x3fb,0x40b,0x41b,
0x42b,0x439,0x449,0x459,0x469,0x477,0x487,0x497,0x4a7,0x4ad,0x4bd,0x4cd,0x4dd,0x4e1,0x4f1,0x501,
0x511,0x521,0x531,0x541,0x551,0x531,0x541,0x551,0x561,0x571,0x581,0x591,0x5a1,0x599,0x5a9,0x5b9,
0x5c9,0x5d9,0x5e9,0x5f9,0x609,0x619,0x629,0x639,0x649,0x656,0x666,0x676,0x686,0,0,0x68b,
0x69a,0,0x6a9,0x6b8,0x6c7,0x6d5,0x6e5,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0x6f3,0,0x6f3,
0,0x701,0,0x701,0,0,0,0x70b,0x71b,0x729,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0x739,0x749,0,0,
0,0,0,0,0,0x759,0x768,0,0,0,0x772,0,0,0,0x77e,0x78d,
0x79b,0,0,0,0,0,0,0,0,0x7ab,0,0,0x7b7,0x7c7,0,0x7cc,
0x52c,0x81,0,0x7dc,0,0,0,0x7ea,0x3fb,0,0,0x7fa,0x807,0,0,0,
0,0,0,0,0,0,0x817,0x827,0x835,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0x2b3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0x2be,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0x843,0,0x850,0,0,0,0,
0,0x101,0,0,0x85c,0x868,0,0x878,0x886,0,0,0x896,0,0x8a4,0x3fb,0,
0,0x80,0,0,0x8b4,0x8c4,0,0x2b9,0,0,0x8cb,0x8da,0x8e7,0,0,0x8f5,
0,0,0,0x905,0x2bd,0,0x915,0x151,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0x925,0,0x934,0,0,0x944,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0x954,0,0,0x95c,0x96a,0,0,0,
0x81,0,0,0x97a,0,0,0,0,0x52d,0,0x985,0x995,0x3cb,0,0,0x1cc,
0x81,0,0,0x9a2,0x9b2,0,0,0,0x9bf,0x9cf,0,0,0,0,0,0,
0,0,0,0x71,0x9df,0,0xff,0,0,0x9ea,0x9fa,0x14f,0xa08,0x52b,0,0,
0,0,0,0,0,0,0x9a0,0xa18,0x16f,0,0,0,0,0,0xa28,0xa37,
0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb,0xa47,0xe3,
0x214,0,0,0,0xa57,0x2be,0,0,0,0,0,0xa67,0xa77,0,0,0,
0,0,0xa7f,0xa8f,0,0,0,0,0,0,0,0,0,0,0,0,
0,0xa9b,0xaaa,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0xab9,0xac9,0,0xad8,
0,0,0xae5,0,0xaf4,0,0,0xb00,0xb0a,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x2eb,
0xb1a,0,0,0,0,0,0xb2a,0xb32,0xb41,0,0,0,0,0,0,0,
0xb50,0xb5f,0,0,0,0xb67,0xb77,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0xb84,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0x45,0x4d,0x4d,0x4d,0x5d,0x7d,0x9d,0xbd,0xdd,
2,2,0xec,0x10a,0x129,0x149,2,0x169,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,0x189,0x1a8,2,2,2,2,2,2,
2,2,2,2,0x1c8,2,2,0x1e8,0x206,0x223,0x241,0x25f,0x27f,0x29d,0x2b7
};
static const uint8_t inpc_trieData[2966]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,8,8,7,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,8,7,1,0,7,4,
7,1,1,1,1,8,8,8,8,7,7,7,7,1,4,7,
0,8,1,8,8,8,1,1,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,0,7,4,7,
1,1,1,1,0,0,4,4,0,0,5,5,1,0,0,0,
0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,
8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,7,4,7,1,
1,0,0,0,0,8,8,0,0,8,8,1,0,0,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,
0,0,0,1,0,0,0,0,0,0,0,0,0,0,7,1,
1,1,1,8,0,8,8,0xd,0,7,7,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,8,8,8,8,8,8,0,8,
7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,7,8,7,1,
1,1,1,0,0,4,0xb,0,0,5,0xc,1,0,0,0,0,
0,0,0,0,8,0xd,0,0,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,7,7,8,7,7,0,
0,0,4,4,4,0,5,5,5,8,0,0,0,0,0,0,
0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,8,7,7,7,
8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,8,8,7,7,7,7,
0,8,8,9,0,8,8,8,8,0,0,0,0,0,0,0,
8,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0xd,7,7,7,7,
0,8,0xd,0xd,0,0xd,0xd,8,8,0,0,0,0,0,0,0,
7,7,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,8,8,7,7,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,8,8,0,7,7,7,1,1,0,4,
4,4,0,5,5,5,8,0,0,0,0,0,0,0,0,0,
7,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,8,0,0,0,0,7,7,7,8,
8,1,0,1,0,7,4,0xb,4,5,0xc,5,7,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,7,8,7,7,8,8,8,8,1,1,1,0,0,0,0,
0,0xe,0xe,0xe,0xe,0xe,7,0,8,8,8,8,8,8,8,8,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,7,8,7,7,8,8,8,8,1,1,1,8,1,0,0,
0,0xe,0xe,0xe,0xe,0xe,0,0,0,8,8,8,8,8,8,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
1,0,8,0,0,0,0,7,4,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,8,9,1,1,9,
9,9,9,8,8,8,8,8,7,8,9,8,8,1,0,8,
8,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,7,7,8,8,1,4,8,8,8,8,
8,1,7,0,8,7,0,1,1,0,0,0,0,0,0,7,
7,1,1,0,0,0,0,1,1,0,7,7,7,0,0,7,
7,7,7,7,7,7,0,0,8,8,8,8,0,0,0,0,
0,0,0,0,0,0,0,1,7,4,8,8,7,7,7,7,
7,7,1,0,7,0,0,0,0,0,0,0,0,0,0,7,
7,7,8,0,0,8,1,1,0,0,0,0,0,0,0,0,
0,0,0,8,1,0,0,0,0,0,0,0,0,0,0,0,
0,7,8,8,8,8,1,1,1,0xb,0xc,5,4,4,4,5,
5,8,7,7,8,8,8,8,8,8,8,0,8,0,0,0,
0,0,0,0,0,0,8,0,0,8,8,1,7,7,0xd,0xd,
8,8,7,7,7,0,0,0,0,7,7,1,7,7,7,7,
7,7,1,8,1,0,0,0,0,7,7,7,7,7,0xe,0xe,
0xe,7,7,0xe,7,7,7,7,7,0,0,0,0,0,0,0,
7,7,0,0,0,0,0,0,0,8,1,4,7,8,0,0,
0,0,0,4,1,7,8,8,8,1,1,1,1,0,7,8,
7,7,8,8,8,8,1,1,8,1,7,4,4,4,8,8,
8,8,8,8,8,8,8,8,0,0,1,8,8,8,8,7,
0,0,0,0,0,0,0,0,0,0,0,8,7,8,8,1,
1,1,3,9,0xa,4,4,5,5,8,0xd,7,0,0,0,0,
0,0,0,0,0,0,0,8,1,8,8,8,0,7,1,1,
8,1,4,7,8,8,7,0,1,1,0,0,0,0,0,0,
8,7,8,8,7,7,7,8,7,8,0,0,0,0,7,7,
7,4,4,0xb,7,7,1,8,8,8,8,4,4,8,1,0,
0,0,0,0,0,0,0,8,8,8,0,6,1,1,1,1,
1,8,8,1,1,1,1,8,7,6,6,6,6,6,6,6,
0,0,0,0,1,0,0,0,0,8,0,0,7,0,0,0,
0,0,0,0,0,8,0,0,0,8,0,0,0,0,8,0,
0,0,0,7,7,1,8,7,0,0,0,0,0,0,0,0,
7,7,7,7,7,7,7,7,7,7,7,7,1,8,0,0,
0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,
0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,
0,1,1,1,0,0,0,0,0,0,0,1,1,1,8,1,
1,1,1,8,0,0,0,8,7,7,8,8,1,1,4,4,
8,7,7,2,3,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,8,8,8,8,1,8,4,8,1,7,4,1,
1,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,
0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,
7,8,7,0,0,8,7,8,8,1,0xe,0xe,8,8,0xe,7,
0xe,0xe,7,8,8,0,0,0,0,0,0,0,0,0,0,0,
4,1,8,4,7,0,0,0,7,7,8,7,7,1,7,7,
0,7,1,0,0,6,1,1,0,8,6,0,0,0,0,0,
1,1,1,8,0,0,0,0,0,0,0,0,8,1,1,0,
0,0,0,0,7,8,7,0,0,0,0,0,0,0,0,0,
0,0,0,0,8,8,8,8,1,1,1,1,8,8,8,8,
8,0,0,0,0,0,0,0,0,0,7,4,7,1,1,8,
8,7,7,1,1,0,0,0,0,0,0,0,8,8,8,1,
1,4,8,9,9,8,1,1,0,8,0,0,0,0,0,0,
0,0,0,0,0,7,4,7,1,1,1,1,1,1,8,8,
8,0xd,7,0,0,0,0,0,0,0,0,1,0,8,1,0,
0,0,0,0,0,0,0,0,0,0,0,7,7,7,1,8,
8,0xd,0xd,8,7,8,8,0,0,0,0,0,0,8,0,7,
4,7,1,1,8,8,8,8,1,1,0,0,0,0,0,0,
0,0,0,0,0,1,1,0,7,7,8,7,7,7,7,0,
0,4,4,0,0,5,5,7,0,0,7,7,0,0,8,8,
8,8,8,8,8,0,0,0,7,7,1,8,8,7,1,0,
0,0,0,0,0,0,0,0,7,4,7,1,1,1,1,1,
1,4,8,0xb,5,7,5,8,7,1,1,0,0,0,0,0,
0,0,0,0,0,0,0,4,7,1,1,1,1,0,0,4,
0xb,5,0xc,8,8,7,1,7,7,7,1,1,1,1,1,1,
8,8,7,7,8,7,1,0,0,0,0,0,0,0,0,0,
0,0,8,7,8,4,7,1,1,8,8,8,8,7,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,1,0,8,7,
7,8,8,1,1,4,8,1,8,8,8,0,0,0,0,0,
0,0,0,0,0,0,0,7,4,7,1,1,1,8,8,8,
8,8,7,1,1,0,0,0,0,0,7,8,7,1,1,1,
1,0,0,8,8,7,7,7,7,1,0,0,0,4,0,0,
0,0,0,0,0,0,0,0,0,8,1,1,8,8,8,8,
8,8,1,0,0,0,0,0,1,1,8,8,8,8,7,0,
1,1,1,1,0,8,1,1,8,8,8,7,7,1,1,1,
0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,
8,7,8,0,0,0,0,0,0,0,8,8,1,1,1,1,
1,0,8,8,8,8,8,8,7,1,0,0,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,0,7,1,1,1,1,
1,1,4,1,8,7,8,8,0,0,0,0,0,0,0,0,
0,8,8,8,8,8,1,0,0,0,8,0,8,8,0,8,
8,1,8,1,0,0,1,0,0,0,0,0,0,0,0,0,
0,7,7,7,7,7,0,8,8,0,7,7,8,7,0,0,
0,0,0,0,0,0,0,8,1,4,7,0,0,0,0,0,
0,0,0,0,0,0
};
static const UCPTrie inpc_trie={
inpc_trieIndex,
{ inpc_trieData },
799, 2966,
0x12000, 0x12,
1, 2,
0, 0,
0x2, 0x0,
0x0,
};
static const int32_t maxInSCValue = 35;
static const uint16_t insc_trieIndex[841]={
0,0x40,0x60,0x94,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0xd4,0x112,0x152,0x190,0x1cf,0x20d,0x24c,0x28a,0x2ca,0x308,0x346,0x384,
0x3c4,0x402,0x442,0x480,0x4c0,0x4fe,0x53e,0x57e,0x5bd,0x5fd,0x63c,0x67c,0x69c,0x6dc,0x71c,0x759,
0x2ff,0x312,0x31e,0x312,0x339,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x60,0x70,0x80,
0x90,0x94,0xa4,0xb4,0xc4,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,
0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,0x70,0x40,0x50,0x60,
0x70,0x40,0x50,0x60,0x70,0xd4,0xe4,0xf4,0x104,0x112,0x122,0x132,0x142,0x152,0x162,0x172,
0x182,0x190,0x1a0,0x1b0,0x1c0,0x1cf,0x1df,0x1ef,0x1ff,0x20d,0x21d,0x22d,0x23d,0x24c,0x25c,0x26c,
0x27c,0x28a,0x29a,0x2aa,0x2ba,0x2ca,0x2da,0x2ea,0x2fa,0x308,0x318,0x328,0x338,0x346,0x356,0x366,
0x376,0x384,0x394,0x3a4,0x3b4,0x3c4,0x3d4,0x3e4,0x3f4,0x402,0x412,0x422,0x432,0x442,0x452,0x462,
0x472,0x480,0x490,0x4a0,0x4b0,0x4c0,0x4d0,0x4e0,0x4f0,0x4fe,0x50e,0x51e,0x52e,0x53e,0x54e,0x55e,
0x56e,0x57e,0x58e,0x59e,0x5ae,0x5bd,0x5cd,0x5dd,0x5ed,0x5fd,0x60d,0x61d,0x62d,0x63c,0x64c,0x65c,
0x66c,0x67c,0x68c,0x69c,0x6ac,0x69c,0x6ac,0x6bc,0x6cc,0x6dc,0x6ec,0x6fc,0x70c,0x71c,0x72c,0x73c,
0x74c,0x759,0x769,0x779,0x789,0xe9,0xe9,0x799,0x7a4,0x7b4,0x7c4,0x7d3,0x7e2,0x7f0,0x800,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x810,0x81e,0xe6,0x81e,0xe6,0x82e,0x810,0x83e,0xe9,0xe9,0x84e,
0x85a,0x864,0x873,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x883,0x16c,0x893,0x8a3,0x22d,0xe9,0x8b3,0x8c3,0xe9,0xe9,0x374,0x8d3,
0x8e2,0x30,0x40,0x40,0xe9,0x8f2,0xe9,0xe9,0x902,0x90f,0x91f,0x92b,0x30,0x30,0x40,0x40,
0x40,0x40,0x40,0x40,0x93b,0xe6,0xe9,0x94b,0x957,0x30,0x40,0x40,0x967,0xe9,0x976,0x986,
0xe9,0xe9,0x996,0x9a6,0xe9,0xe9,0x9b6,0x9c3,0x9d3,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x9e3,0x9f1,0x9ff,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0xa0a,0xa16,0xa26,0x40,0x40,0x40,0x40,0x40,0x75b,0xa34,0x40,0x40,0x40,
0x40,0x40,0x40,0xa44,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x74,0x40,0x40,0x40,0xa54,0xe9,0xa61,0x40,0xe9,0xa71,0xa7f,0xa8e,0xd6,0xe7,0xe9,0xa9e,
0xaaa,0x30,0xaba,0xac8,0xad8,0xe9,0xae6,0xe9,0xaf6,0xb05,0x40,0x40,0xb15,0xe9,0xe9,0xb24,
0x297,0x30,0xb34,0xb44,0xe3,0xe9,0x88a,0xb54,0xb64,0x30,0xe9,0xb73,0xe9,0xe9,0xe9,0xb83,
0xb93,0x40,0xba3,0xbb3,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0xbc3,0xbd3,0xbe0,0x30,0xbf0,0xc00,0xe9,0xc0a,0x31,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0xc1a,0xe6,0xe9,0x88b,0xc2a,0xc38,0xc42,0xc52,0xc62,0xe9,0xe9,0xc72,
0x40,0x40,0x40,0x40,0xc82,0xe9,0x88c,0xc92,0xca2,0xcb2,0xe9,0xcbf,0xd5,0xe8,0xe9,0xccf,
0xcdf,0x30,0x6bb,0x35,0xe1,0x3eb,0x887,0xcef,0x40,0x40,0x40,0x40,0xcff,0x16d,0xd0e,0xdf,
0xe9,0xd1e,0xd2e,0x30,0xd3e,0x162,0x172,0xd4e,0x308,0xd5e,0xd6e,0x9ee,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0xdb,0xe9,0xe9,0xd7e,0xd8c,0xd9c,0x40,0x40,0xdac,0xe9,0xe9,0x920,
0xdbc,0x30,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xdb,0xe9,0xff,0xdcc,
0xddc,0xde4,0x40,0x40,0xdb,0xe9,0xe9,0xdf4,0xe04,0x30,0x40,0x40,0xdf,0xe9,0xe14,0xe21,
0x30,0x40,0x40,0x40,0xe9,0xe31,0xe41,0xe51,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0xdf,0xe9,0x887,0xe61,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xe71,0xe9,
0xe9,0xe80,0xe90,0x40,0xea0,0xe9,0xe9,0xead,0xebd,0xecd,0xe9,0xe9,0xed9,0xee3,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0xef3,0xe9,0xff,0xf03,0xf13,0x6bc,0xf23,0x556,0xe9,0xf31,0x72c,0xf41,
0x40,0x40,0x40,0x40,0xf51,0xe9,0xe9,0xf60,0xf70,0x30,0xf80,0xe9,0xf8c,0xf99,0x30,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xe9,0xfa9,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x45,
0x55,0x55,0x55,0x65,0x85,0xa5,0xc5,0xe5,4,4,0xf5,0x114,0x134,0x154,4,0x174,
4,0x184,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,0x1a4,0x1c4,4,4,4,4,4,4,4,4,4,4,0x1e4,4,
4,0x204,0x224,0x244,0x264,0x284,0x2a4,0x2c4,0x2df
};
static const uint8_t insc_trieData[4026]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0xc,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0x1c,0x1c,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0xc,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,2,2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x22,0x22,
0x17,1,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,
0x22,0x22,0,4,4,0,0,0x22,0x22,0x22,5,5,5,5,5,5,
5,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0,0,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,5,5,
5,5,0xc,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,
0,0x23,0x23,0,0,0x23,0x23,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,
5,5,5,0,5,0,0,0,5,5,5,5,0,0,0x17,1,
0x22,0x22,0x22,0x22,0x22,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,6,0,
0,0,0,0,0,0,0,0x22,0,0,0,0,5,5,0,5,
0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
5,5,0,0,0,0,0,0,0,0,0,0,2,0,0x1c,0,
2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0,0,0x23,0x23,
0,0,0x23,0x23,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,
0,5,5,0,5,5,0,5,5,0,0,0x17,0,0x22,0x22,0x22,
0,0,0,0,0x22,0x22,0,0,0x22,0x22,0x1f,0,0,0,4,0,
0,0,0,0,0,0,5,5,5,5,0,5,0,0,0,0,
0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,2,0x12,0xc,
0xc,0,0xb,0,0,0,0,0,0,0,0,0,0,2,2,0x20,
0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,0,0x23,
0x23,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,0,5,5,5,5,5,5,5,0,5,5,
0,5,5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0x22,
0,0x22,0x22,0x22,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0x23,0x23,0x22,0x22,0,0,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0,
0,0,0,5,4,4,4,0x17,0x17,0x17,0,2,2,0x20,0,0x23,
0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,0x23,0,0,0x23,0x23,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,0,5,5,5,5,5,5,5,0,5,5,0,5,
5,5,5,5,0,0,0x17,1,0x22,0x22,0x22,0x22,0x22,0,0,0x22,
0x22,0,0,0x22,0x22,0x1f,0,0,0,0,0,0,0,0,0x22,0x22,
0,0,0,0,5,5,0,5,0x23,0x23,0x22,0x22,0,0,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,5,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,2,0x15,0,0x23,0x23,0x23,0x23,0x23,
0x23,0,0,0,0x23,0x23,0x23,0,0x23,0x23,0x23,5,0,0,0,5,
5,0,5,0,5,5,0,0,0,5,5,0,0,0,5,5,
5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,
0,0,0,0,0x22,0x22,0x22,0,0,0,0x22,0x22,0x22,0,0x22,0x22,
0x22,0x1f,0,0,0,0,0,0,0,0,0,0x22,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,2,2,2,0x20,2,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
0x23,0,0x23,0x23,0x23,0,0x23,0x23,0x23,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,
0,1,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,
0,0,0,0,0,0,0,0x22,0x22,0,5,5,5,0,0,0,
0,0,0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,2,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,
0x23,0x23,0x23,0,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,
5,5,5,5,5,5,0,5,5,5,5,5,0,0,0x17,1,
0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0,0,
0,0,0,0,0,0x22,0x22,0,0,0,0,0,0,0,5,0,
0x23,0x23,0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0,0x11,0x11,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,
0x23,0,0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,0x1a,0x1a,1,0x22,0x22,
0x22,0x22,0x22,0,0x22,0x22,0x22,0,0x22,0x22,0x22,0x1f,0xd,0,0,0,
0,0,6,6,6,0x22,0,0,0,0,0,0,0,0x23,0x23,0x23,
0x22,0x22,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,
0,0,0,0,0,0,0,0,6,6,6,6,6,6,0,0,
2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
0x23,0x23,0x23,0x23,0x23,0,0,0,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
0,5,5,5,5,5,5,5,5,5,0,5,0,0,5,5,
5,5,5,5,5,0,0,0,0x1f,0,0,0,0,0x22,0x22,0x22,
0x22,0x22,0x22,0,0x22,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0,
0,0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,
0x22,0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,0,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,0,0,0x22,0x22,0x22,
0x22,0x22,0x22,0,0x22,0x1e,0x1e,0x1e,0x1e,0xa,2,0x1a,0,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,0,
5,0,5,5,5,5,5,0,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
0,5,0,5,5,5,5,5,5,5,5,0,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0x22,0xb,0xb,0,0,0x22,0x22,0x22,0x22,
0x22,0,0,0,0x1e,0x1e,0x1e,0x1e,0,2,0,0,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0,0,5,5,5,5,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0,0x1c,0,0x1c,0,0x17,0,0,0,0,0,0,5,5,5,5,
5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,5,0,0,0,0,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x22,2,2,
0x1a,1,0,0,8,8,8,8,8,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
0xf,0xf,0xf,0xf,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0,0,0,0,0,0,0x1c,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,5,0x23,0x23,0x23,0x23,0x23,0x23,
0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,2,0x1e,0x20,0x13,0x1a,0xb,
0xb,0xb,0xb,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0xc,
0,0,0xc,0,5,5,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,5,5,
5,5,0xb,0xb,5,0x22,0x1e,0x1e,5,5,0x22,0x22,0x1e,0x1e,0x1e,0x1e,
0x1e,5,5,0x22,0x22,0x22,0x22,5,5,5,5,5,5,5,5,5,
5,5,0xb,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,5,0x1e,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1e,0x1e,0x22,0x22,0,0,
0x23,0x23,0x23,5,5,5,5,5,5,5,5,5,5,0,5,5,
0x22,0x22,0x1a,0,0,0,0,0,0,0,0,0,0,0,5,5,
0x22,0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,0,
0x22,0x22,0,0,0,0,0,0,0,0,0,0,0,0,5,5,
5,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x22,0x1b,0x1b,0x1c,
0x10,0xa,0x1c,0x1c,0x1a,0x13,0x1c,0,0,0,0,0,0,0,0,1,
0x1c,0,0,0xc,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xf,0xf,0xf,0,
0,0,0,7,7,2,7,7,7,7,7,7,7,0x22,0x1c,0,
0,0,0,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
0x21,0,0,0x1d,0x1d,0x1d,0x1d,0x1d,0,0,0,0,0,0,0,0,
0,0,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,7,7,7,7,7,7,7,0x1e,0x1e,0,0,0,0,
0,0,5,5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0,
0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,0x23,
0x23,0x23,5,5,0xb,0xb,0xf,7,7,9,0xf,0xf,0xf,0xf,0,0x13,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,
0x1e,0x1e,0x1e,0x1e,0x1e,0x1a,0x1c,0x1c,0,0,0x1c,2,2,2,0x10,0x20,
0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,5,5,5,0x17,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,5,5,5,5,
5,5,5,0,0,0,0,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,0x23,
0x23,5,5,5,5,5,5,0xf,0xf,0xf,0x22,0x22,0x22,0x22,0x22,0x22,
0x1a,0x13,0xf,0xf,5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
1,5,5,5,7,7,5,5,5,5,0x23,0x23,0x17,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,7,7,0x1a,0x1a,0,0,0,0,0,0,
0,0,0,0,0,0,5,5,5,5,0xf,0xf,0x22,0x22,0x22,0x22,
0x22,0x22,0x22,7,7,7,7,2,2,0x1c,0x17,0,0,0,0,0,
0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,
5,5,5,4,4,4,0,4,4,4,4,4,4,4,4,4,
4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,6,6,4,0x11,0x11,4,4,4,0xc,0,0,0,0,0,0,
0,0,0,0,0,0x1c,0,0,0,0,0,0,0,0,0,0,
0,0,0x16,0x14,0,0,0xc,0xc,0xc,0xc,0xc,0,0,0,0,0,
0,0,0,0,0,0,0x1c,0x1c,0x1c,0,0,0,0,0,0,0,
0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0x23,0x23,0x22,0x23,0x23,0x23,0x1a,5,5,5,5,2,
5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0,0,0,0,0,0,
0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0x21,
0x21,5,5,5,5,0x21,0xf,0xf,5,5,5,5,5,5,5,0xf,
5,2,0,0,0,0,0,0,0,0,0,0,0,0,5,5,
5,5,0xb,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,
0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,2,2,0,0,0,0,
0,0,0,0,0,0,0x23,0x22,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,5,5,5,5,5,5,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,
0x21,0x1e,0x1e,0x1e,0,0,5,5,5,5,5,5,5,0x22,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,7,7,7,0x1a,0,0,0,0,0,0,0,
0,0,0,0,0,2,2,0x10,0x20,0x23,0x23,0x23,0x23,0x23,5,5,
5,0x23,0x23,0x23,5,5,5,0x17,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0xf,0xb,0xb,5,5,5,5,5,0x22,0,5,5,5,5,5,
5,5,5,5,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,5,5,
5,5,5,0,0x22,0x22,0x22,0xb,0xb,0xb,0xb,0,0,0,0,0,
0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,0,0,5,5,5,0xc,0xc,0xc,0,0,0,5,0x1e,0x1e,
0x1e,5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,0x22,0x1e,0x1d,0x1e,0x1d,0,0,0,0,0,0,0,0,0,0,
0,0,0,0x23,0x23,5,5,5,5,5,5,5,5,5,0x22,0x22,
0x22,0x22,0x22,0,0,0,0,0,0x20,0x13,0,0,0,0,0,0,
0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,0x23,0x23,5,0x23,5,5,5,5,5,5,5,5,5,7,7,
7,7,7,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x1e,0x1a,0,0,
5,0x22,0x22,0x22,0,0x22,0x22,0,0,0,0,0,0x22,0x22,2,0x20,
5,5,5,5,0,5,5,5,0,5,5,5,5,5,5,5,
0,0,0x17,0x17,0x17,0,0,0,0,0x13,2,2,0x20,0x11,0x11,0x23,
0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,
0x1f,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0x19,2,2,0x20,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,
5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x17,0,0,0,
0,0,2,2,0x20,0x23,0x23,0x23,0x23,5,5,5,5,5,5,5,
5,5,0x22,0x22,0x22,0x13,0x1a,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0,0,0,0,5,0x22,0x22,0,0,0,0,0,0,0,
0,0,0x21,0x21,0x21,0x21,0x21,5,5,5,5,5,5,5,5,5,
5,5,0x17,0,0,0,0,0,0,0,0,0,0,0,0,5,
5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,
1,0xe,0xe,0,0,0,0,0,0x1c,0x17,0x22,0x22,0,0,0,0x22,
0x22,0x22,0x22,2,0x1f,0x17,0x12,0,0,0,0,0,0,4,0,0x23,
0x23,0x23,0x23,5,5,5,0,5,0,5,5,5,5,0,5,5,
5,5,5,5,5,5,5,0,0,0,0,0,0,0,5,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,2,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x17,0x1a,0,0,0,0,0,2,2,
2,0x20,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,5,0,
5,5,0,5,5,5,5,5,0,0x17,0x17,1,0x22,0x22,0,0,
0,0,0,0,0,0x22,0,0,0,0,0,0,2,2,0x23,0x23,
0x22,0x22,0,0,4,4,4,4,4,4,4,0,0,0,5,5,
5,5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,2,
2,0x20,0x17,1,0,0,0,0,0,0,0,0,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,0,0x1c,2,0,0x23,0x23,0x23,
0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,5,2,0x20,0x1f,0x17,
1,0,0,0,0,0,0,0,0,0,0,0,0x22,0x22,0x22,0x22,
0x22,0x22,0,0,0x22,0x22,0x22,0x22,2,2,0x20,0x1f,0x17,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0x23,0x23,0x23,0x23,
0x22,0x22,0,0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
0x22,2,0x20,0x1f,0x22,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,2,
0x20,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x17,5,0,0,0,0,0,0,
0,5,5,5,5,5,5,5,5,5,5,5,0,0,0xb,0xb,
0xb,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0,0,0,
0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0,0,0,
0,0x22,0x22,0x22,0x22,0x22,0x22,0x22,2,0x20,0x1f,0x17,0,0,0,0,
0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0,0x23,0x23,0x23,0x23,5,
5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0,0x22,0x22,0x22,0x22,2,0x20,
0x1f,1,0,0,0x22,0,0,0,0,0,0,0,0,0,0,0,
0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,5,
0x1c,0x1a,2,2,2,2,0x20,0xe,0xb,0xb,0xb,0xb,0xc,0,0,0,
0,0,0xc,0,0x13,0,0,0,0,0,0,0,0,0x23,0x22,0x22,
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,5,5,5,5,0xe,0xe,0xe,
0xe,0xe,0xe,7,7,7,7,7,7,2,0x20,0x12,0x13,0,0,0,
1,0,0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0x23,
0x23,5,5,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,0x22,0x22,2,
2,0x20,0x1f,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0,0,0,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,
0xf,0x22,0x22,0x22,0x22,0x22,2,2,0,0,0,0,0,0,0,0,
0,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,5,5,5,
5,0x22,0x22,0x22,0x22,0x22,0x22,0,0,0,0x22,0,0x22,0x22,0,0x22,
2,0x20,0x17,0x22,0x1a,0x13,0xd,0xb,0,0,0,0,0,0,0,0,
0x23,0x23,0x23,0x23,0x23,0x23,0,0x23,0x23,0,0x23,0x23,5,5,5,5,
5,5,5,5,5,5,0x22,0x22,0x22,0x22,0x22,0,0x22,0x22,2,0x20,
0x13,0,0,0,0,0,0,0,0,5,5,0xc,0x22,0x22,0x22,0x22,
0,0,0,0,0,0,0,0,0,0
};
static const UCPTrie insc_trie={
insc_trieIndex,
{ insc_trieData },
841, 4026,
0x12000, 0x12,
1, 2,
0, 0,
0x4, 0x40,
0x0,
};
static const int32_t maxVoValue = 3;
static const uint16_t vo_trieIndex[1054]={
0,0x40,0x59,0x98,0,0,0,0,0,0,0,0xd0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x30d,0x327,0x335,0x34b,0x36b,0x389,0x3a4,0x3be,0x327,0x327,0x327,0x3de,0x327,0x327,0x327,0x3de,
0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,
0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,
0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x3fe,0x327,0x327,0x327,0x3de,
0x327,0x327,0x327,0x3de,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x59,0x69,0x79,0x89,
0x98,0xa8,0xb8,0xc8,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,
0,0x10,0x20,0x30,0xd0,0xe0,0xf0,0x100,0,0x10,0x20,0x30,0,0x10,0x20,0x30,
0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,
0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x10f,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0x110,0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0xa9,0x96,0x11e,0x12c,0xae,0xaa,0,0,0,0,0,
0,0x103,0x13c,0,0x14c,0x158,0x166,0x10b,0x175,0x110,0x110,0x110,0x184,0,0,0,
0,0,0,0,0x72,0,0xf6,0,0,0,0,0,0,0,0,0,
0,0,0,0x190,0x110,0x198,0,0,0,0,0x103,0x110,0x115,0,0xec,0x1a8,
0x1b6,0x10e,0x110,0x110,0x1c6,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,
0x110,0x110,0x116,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x118,0x10a,0x110,0x1d2,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0x10e,0x110,0,0,
0x116,0,0,0,0,0,0x108,0x110,0x1e2,0x114,0x110,0,0,0,0,0,
0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x1f1,0x1ff,0x110,0x20e,0x21d,
0x110,0x22a,0x110,0x237,0x246,0x256,0x110,0x22a,0x110,0x237,0x261,0x110,0x110,0x26e,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x27e,0x27e,0x27e,0x27e,0x27e,
0x286,0x110,0x28e,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0,0,
0,0,0,0x110,0,0x110,0x117,0x29b,0x2aa,0,0,0,0,0,0,0,
0,0,0x2ba,0x2c9,0x110,0x2d9,0x110,0x2e9,0x2f8,0,0,0,0,0,0,0,
0x308,0x318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0x110,0x110,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0,0,0,0,0,0,0,0,0x328,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,
0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x110,0x112,0x84,0x98,0xa8,
0xa8,0xa8,0xa8,0xa8,0xa8,0xc8,0xc,0xe8,0x100,0x115,0xc,0xc,0xc,0x134,0x153,0x172,
0x191,0xc,0x1ab,0xc,0x1cb,0x1eb,0x20b,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
0x223,0x223,0x223,0x223,0x223,0x223,0x223,0xfb,0xc,0x243,0xc,0x223,0x223,0x223,0x223,0x223,
0x223,0x223,0x223,0x223,0x223,0x223,0x223,0xc,0xc,0xc,0xc,0x223,0x223,0x223,0x223,0x223,
0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0x262,0xc,0xc,0xc,0xc,0x282,
0xc,0xc,0xc,0xc,0xc,0x29c,0xc,0xc,0xfd,0xc,0xc,0xc,0xc,0xc,0xc,0xc,
0xc,0xc,0xc,0x223,0x223,0x2b8,0xc,0xc,0xc,0xc,0xc,0x223,0x100,0xc,0xc,0xc,
0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,
0x2bc,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0xf8,0xc,0xc,0xc,0xc,0xc,0xc,
0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x223,0xf8,0xc,0xc,
0xc,0xc,0xc,0xc,0xc,0xc,0x223,0x2cc,0xc,0xc,0x223,0xfd,0xc,0xc,0xc,0xc,
0xc,0xc,0xc,0xc,0xc,0xc,0x223,0x2ec,0x223,0x223,0xc8,0xfe,0xc,0xc,0x223,0x223,
0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,
0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x223,0x2ed,0xc,0xc,
0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,
0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc
};
static const uint8_t vo_trieData[828]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,0,3,0,0,0,0,3,0,0,3,0,0,0,0,0,
0,0,0,0,0,3,3,3,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
0,0,0,0,0,0,0,0,0,3,3,0,0,0,3,0,
0,0,0,3,3,3,0,0,0,0,0,0,3,0,3,3,
3,0,0,0,0,0,0,0,0,0,0,0,3,3,0,3,
3,3,3,3,3,3,0,0,0,0,0,3,3,0,3,3,
0,0,0,0,0,0,3,3,3,3,0,3,0,3,0,3,
0,0,0,0,3,0,0,0,0,0,3,3,3,3,3,3,
0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,0,
3,3,3,3,3,3,3,3,0,0,0,0,3,3,3,3,
3,1,1,3,0,0,0,0,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,
3,3,0,0,0,0,3,3,3,0,3,3,3,3,3,3,
3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,
0,0,3,3,0,3,3,3,3,3,3,3,3,3,3,3,
3,3,2,2,3,3,3,3,3,1,1,1,1,1,1,1,
1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,
2,3,2,3,2,3,2,3,3,3,3,3,3,2,3,3,
3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,3,
3,3,3,3,3,2,3,3,3,3,3,2,2,3,3,3,
3,2,2,3,3,3,1,2,3,2,3,2,3,2,3,2,
3,3,3,3,3,3,2,2,3,3,3,3,3,1,3,3,
3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,
3,3,3,3,3,3,3,3,3,2,2,2,2,2,3,3,
3,3,3,0,1,1,1,1,1,1,3,3,3,0,0,0,
0,3,3,3,3,3,3,3,3,3,0,2,3,3,3,3,
3,3,1,1,3,3,2,0,2,3,3,3,3,3,3,3,
3,3,3,1,1,0,0,0,2,3,3,3,3,3,3,3,
3,3,3,3,1,3,1,3,1,3,3,3,3,3,3,3,
3,3,3,3,1,1,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,3,3,3,1,3,3,3,3,
0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,
3,0,0,0,3,3,0,0,2,2,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,0,0,0,0
};
static const UCPTrie vo_trie={
vo_trieIndex,
{ vo_trieData },
1054, 828,
0x110000, 0x110,
1, 2,
0, 0,
0xc, 0x0,
0x0,
};
#endif // INCLUDED_FROM_UPROPS_CPP

View file

@ -26,23 +26,131 @@
#include "unicode/utypes.h"
#include "unicode/uchar.h"
#include "unicode/ucptrie.h"
#include "unicode/udata.h"
#include "unicode/unorm2.h"
#include "unicode/uscript.h"
#include "unicode/ustring.h"
#include "cstring.h"
#include "mutex.h"
#include "normalizer2impl.h"
#include "umutex.h"
#include "ubidi_props.h"
#include "uprops.h"
#include "ucase.h"
#include "ucln_cmn.h"
#include "ulayout_props.h"
#include "ustr_imp.h"
// ulayout_props_data.h is machine-generated by genprops
#define INCLUDED_FROM_UPROPS_CPP
#include "ulayout_props_data.h"
U_NAMESPACE_USE
// Unicode text layout properties data -----------------------------------------
namespace {
icu::UInitOnce gLayoutInitOnce = U_INITONCE_INITIALIZER;
UDataMemory *gLayoutMemory = nullptr;
UCPTrie *gInpcTrie = nullptr; // Indic_Positional_Category
UCPTrie *gInscTrie = nullptr; // Indic_Syllabic_Category
UCPTrie *gVoTrie = nullptr; // Vertical_Orientation
int32_t gMaxInpcValue = 0;
int32_t gMaxInscValue = 0;
int32_t gMaxVoValue = 0;
UBool U_CALLCONV uprops_cleanup() {
udata_close(gLayoutMemory);
gLayoutMemory = nullptr;
ucptrie_close(gInpcTrie);
gInpcTrie = nullptr;
ucptrie_close(gInscTrie);
gInscTrie = nullptr;
ucptrie_close(gVoTrie);
gVoTrie = nullptr;
gMaxInpcValue = 0;
gMaxInscValue = 0;
gMaxVoValue = 0;
gLayoutInitOnce.reset();
return TRUE;
}
UBool U_CALLCONV
ulayout_isAcceptable(void * /*context*/,
const char * /* type */, const char * /*name*/,
const UDataInfo *pInfo) {
return pInfo->size >= 20 &&
pInfo->isBigEndian == U_IS_BIG_ENDIAN &&
pInfo->charsetFamily == U_CHARSET_FAMILY &&
pInfo->dataFormat[0] == ULAYOUT_FMT_0 &&
pInfo->dataFormat[1] == ULAYOUT_FMT_1 &&
pInfo->dataFormat[2] == ULAYOUT_FMT_2 &&
pInfo->dataFormat[3] == ULAYOUT_FMT_3 &&
pInfo->formatVersion[0] == 1;
}
// UInitOnce singleton initialization function
void U_CALLCONV ulayout_load(UErrorCode &errorCode) {
gLayoutMemory = udata_openChoice(
nullptr, ULAYOUT_DATA_TYPE, ULAYOUT_DATA_NAME,
ulayout_isAcceptable, nullptr, &errorCode);
if (U_FAILURE(errorCode)) { return; }
const uint8_t *inBytes = (const uint8_t *)udata_getMemory(gLayoutMemory);
const int32_t *inIndexes = (const int32_t *)inBytes;
int32_t indexesLength = inIndexes[ULAYOUT_IX_INDEXES_LENGTH];
if (indexesLength < 12) {
errorCode = U_INVALID_FORMAT_ERROR; // Not enough indexes.
return;
}
int32_t offset = indexesLength * 4;
int32_t top = inIndexes[ULAYOUT_IX_INPC_TRIE_TOP];
int32_t trieSize = top - offset;
if (trieSize >= 16) {
gInpcTrie = ucptrie_openFromBinary(
UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY,
inBytes + offset, trieSize, nullptr, &errorCode);
}
offset = top;
top = inIndexes[ULAYOUT_IX_INSC_TRIE_TOP];
trieSize = top - offset;
if (trieSize >= 16) {
gInscTrie = ucptrie_openFromBinary(
UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY,
inBytes + offset, trieSize, nullptr, &errorCode);
}
offset = top;
top = inIndexes[ULAYOUT_IX_VO_TRIE_TOP];
trieSize = top - offset;
if (trieSize >= 16) {
gVoTrie = ucptrie_openFromBinary(
UCPTRIE_TYPE_ANY, UCPTRIE_VALUE_BITS_ANY,
inBytes + offset, trieSize, nullptr, &errorCode);
}
uint32_t maxValues = inIndexes[ULAYOUT_IX_MAX_VALUES];
gMaxInpcValue = maxValues >> ULAYOUT_MAX_INPC_SHIFT;
gMaxInscValue = (maxValues >> ULAYOUT_MAX_INSC_SHIFT) & 0xff;
gMaxVoValue = (maxValues >> ULAYOUT_MAX_VO_SHIFT) & 0xff;
ucln_common_registerCleanup(UCLN_COMMON_UPROPS, uprops_cleanup);
}
UBool ulayout_ensureData(UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return FALSE; }
umtx_initOnce(gLayoutInitOnce, &ulayout_load, errorCode);
return U_SUCCESS(errorCode);
}
UBool ulayout_ensureData() {
UErrorCode errorCode = U_ZERO_ERROR;
return ulayout_ensureData(errorCode);
}
} // namespace
/* general properties API functions ----------------------------------------- */
struct BinaryProperty;
@ -434,15 +542,29 @@ static int32_t getTrailCombiningClass(const IntProperty &/*prop*/, UChar32 c, UP
#endif
static int32_t getInPC(const IntProperty &, UChar32 c, UProperty) {
return ucptrie_get(&inpc_trie, c);
return ulayout_ensureData() && gInpcTrie != nullptr ? ucptrie_get(gInpcTrie, c) : 0;
}
static int32_t getInSC(const IntProperty &, UChar32 c, UProperty) {
return ucptrie_get(&insc_trie, c);
return ulayout_ensureData() && gInscTrie != nullptr ? ucptrie_get(gInscTrie, c) : 0;
}
static int32_t getVo(const IntProperty &, UChar32 c, UProperty) {
return ucptrie_get(&vo_trie, c);
return ulayout_ensureData() && gVoTrie != nullptr ? ucptrie_get(gVoTrie, c) : 0;
}
static int32_t layoutGetMaxValue(const IntProperty &/*prop*/, UProperty which) {
if (!ulayout_ensureData()) { return 0; }
switch (which) {
case UCHAR_INDIC_POSITIONAL_CATEGORY:
return gMaxInpcValue;
case UCHAR_INDIC_SYLLABIC_CATEGORY:
return gMaxInscValue;
case UCHAR_VERTICAL_ORIENTATION:
return gMaxVoValue;
default:
return 0;
}
}
static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={
@ -480,9 +602,9 @@ static const IntProperty intProps[UCHAR_INT_LIMIT-UCHAR_INT_START]={
{ 2, UPROPS_SB_MASK, UPROPS_SB_SHIFT, defaultGetValue, defaultGetMaxValue },
{ 2, UPROPS_WB_MASK, UPROPS_WB_SHIFT, defaultGetValue, defaultGetMaxValue },
{ UPROPS_SRC_BIDI, 0, 0, getBiDiPairedBracketType, biDiGetMaxValue },
{ UPROPS_SRC_INPC, 0, maxInPCValue, getInPC, getMaxValueFromShift },
{ UPROPS_SRC_INSC, 0, maxInSCValue, getInSC, getMaxValueFromShift },
{ UPROPS_SRC_VO, 0, maxVoValue, getVo, getMaxValueFromShift },
{ UPROPS_SRC_INPC, 0, 0, getInPC, layoutGetMaxValue },
{ UPROPS_SRC_INSC, 0, 0, getInSC, layoutGetMaxValue },
{ UPROPS_SRC_VO, 0, 0, getVo, layoutGetMaxValue },
};
U_CAPI int32_t U_EXPORT2
@ -586,23 +708,28 @@ uprops_getSource(UProperty which) {
U_CFUNC void U_EXPORT2
uprops_addPropertyStarts(UPropertySource src, const USetAdder *sa, UErrorCode *pErrorCode) {
if (U_FAILURE(*pErrorCode)) { return; }
if (!ulayout_ensureData(*pErrorCode)) { return; }
const UCPTrie *trie;
switch (src) {
case UPROPS_SRC_INPC:
trie = &inpc_trie;
trie = gInpcTrie;
break;
case UPROPS_SRC_INSC:
trie = &insc_trie;
trie = gInscTrie;
break;
case UPROPS_SRC_VO:
trie = &vo_trie;
trie = gVoTrie;
break;
default:
*pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
if (trie == nullptr) {
*pErrorCode = U_MISSING_RESOURCE_ERROR;
return;
}
// Add the start code point of each same-value range of the trie.
UChar32 start = 0, end;
while ((end = ucptrie_getRange(trie, start, UCPMAP_RANGE_NORMAL, 0,

View file

@ -30,6 +30,7 @@ def generate(config, glob, common_vars):
requests += generate_normalization(config, glob, common_vars)
requests += generate_coll_ucadata(config, glob, common_vars)
requests += generate_unames(config, glob, common_vars)
requests += generate_ulayout(config, glob, common_vars)
requests += generate_misc(config, glob, common_vars)
requests += generate_curr_supplemental(config, glob, common_vars)
requests += generate_translit(config, glob, common_vars)
@ -325,6 +326,25 @@ def generate_unames(config, glob, common_vars):
]
def generate_ulayout(config, glob, common_vars):
# Unicode text layout properties
basename = "ulayout"
input_file = InFile("in/%s.icu" % basename)
output_file = OutFile("%s.icu" % basename)
return [
SingleExecutionRequest(
name = basename,
category = basename,
dep_targets = [],
input_files = [input_file],
output_files = [output_file],
tool = IcuTool("icupkg"),
args = "-t{ICUDATA_CHAR} {IN_DIR}/{INPUT_FILES[0]} {OUT_DIR}/{OUTPUT_FILES[0]}",
format_with = {}
)
]
def generate_misc(config, glob, common_vars):
# Misc Data Res Files
input_files = [InFile(filename) for filename in glob("misc/*.txt")]

Binary file not shown.

View file

@ -60,6 +60,9 @@ http://www.unicode.org/reports/tr44/tr44-23.html
ICU-20203 Unicode 12
https://github.com/markusicu/icu/tree/uni12
ICU-20111 move text layout properties data into a data file
https://github.com/markusicu/icu/tree/layout-props
cldrbug 11478: Unicode 12
Accidentally used ^/trunk instead of ^/branches/markus/uni12
@ -201,13 +204,6 @@ set(ICU4C_SRC_DIR /usr/local/google/home/mscherer/icu/uni/src/icu4c)
- Unicode 6.0..12.0: U+2260, U+226E, U+226F
- nothing new in this Unicode version, no test file to update
* update Java hardcoded properties
- genprops writes /tmp/ulayout_props_data.txt,
update UCharacterProperty.java:
+ update the trie initializer strings for class InPCTrie etc.
+ update the maxInPCValue values etc. in
new IntProperty(SRC_INPC)...getMaxValue() etc.
* run & fix ICU4C tests
- update test of default bidi classes:
Bidi range \U0001ED00-\U0001ED4F changes default from R to AL,

View file

@ -41,6 +41,7 @@
#include "uarrsort.h"
#include "ucmndata.h"
#include "udataswp.h"
#include "ulayout_props.h"
/* swapping implementations in common */
@ -640,6 +641,106 @@ unorm_swap(const UDataSwapper *ds,
#endif
// Unicode text layout properties data swapping --------------------------------
static int32_t U_CALLCONV
ulayout_swap(const UDataSwapper *ds,
const void *inData, int32_t length, void *outData,
UErrorCode *pErrorCode) {
// udata_swapDataHeader checks the arguments.
int32_t headerSize = udata_swapDataHeader(ds, inData, length, outData, pErrorCode);
if (pErrorCode == nullptr || U_FAILURE(*pErrorCode)) {
return 0;
}
// Check data format and format version.
const UDataInfo *pInfo = (const UDataInfo *)((const char *)inData + 4);
if (!(
pInfo->dataFormat[0] == ULAYOUT_FMT_0 && // dataFormat="Layo"
pInfo->dataFormat[1] == ULAYOUT_FMT_1 &&
pInfo->dataFormat[2] == ULAYOUT_FMT_2 &&
pInfo->dataFormat[3] == ULAYOUT_FMT_3 &&
pInfo->formatVersion[0] == 1)) {
udata_printError(ds,
"ulayout_swap(): data format %02x.%02x.%02x.%02x (format version %02x) "
"is not recognized as text layout properties data\n",
pInfo->dataFormat[0], pInfo->dataFormat[1],
pInfo->dataFormat[2], pInfo->dataFormat[3],
pInfo->formatVersion[0]);
*pErrorCode = U_UNSUPPORTED_ERROR;
return 0;
}
const uint8_t *inBytes = (const uint8_t *)inData + headerSize;
uint8_t *outBytes = (uint8_t *)outData + headerSize;
const int32_t *inIndexes = (const int32_t *)inBytes;
if (length >= 0) {
length -= headerSize;
if (length < 12 * 4) {
udata_printError(ds,
"ulayout_swap(): too few bytes (%d after header) for text layout properties data\n",
length);
*pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
}
}
int32_t indexesLength = udata_readInt32(ds, inIndexes[ULAYOUT_IX_INDEXES_LENGTH]);
if (indexesLength < 12) {
udata_printError(ds,
"ulayout_swap(): too few indexes (%d) for text layout properties data\n",
indexesLength);
*pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
}
// Read the data offsets before swapping anything.
int32_t indexes[ULAYOUT_IX_TRIES_TOP + 1];
for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) {
indexes[i] = udata_readInt32(ds, inIndexes[i]);
}
int32_t size = indexes[ULAYOUT_IX_TRIES_TOP];
if (length >= 0) {
if (length < size) {
udata_printError(ds,
"ulayout_swap(): too few bytes (%d after header) "
"for all of text layout properties data\n",
length);
*pErrorCode = U_INDEX_OUTOFBOUNDS_ERROR;
return 0;
}
// Copy the data for inaccessible bytes.
if (inBytes != outBytes) {
uprv_memcpy(outBytes, inBytes, size);
}
// Swap the int32_t indexes[].
int32_t offset = 0;
int32_t count = indexesLength * 4;
ds->swapArray32(ds, inBytes, count, outBytes, pErrorCode);
offset += count;
// Swap each trie.
for (int32_t i = ULAYOUT_IX_INPC_TRIE_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) {
int32_t top = indexes[i];
count = top - offset;
U_ASSERT(count >= 0);
if (count >= 16) {
utrie_swapAnyVersion(ds, inBytes + offset, count, outBytes + offset, pErrorCode);
}
offset = top;
}
U_ASSERT(offset == size);
}
return headerSize + size;
}
/* Swap 'Test' data from gentest */
static int32_t U_CALLCONV
test_swap(const UDataSwapper *ds,
@ -731,6 +832,10 @@ static const struct {
{ { 0x4e, 0x6f, 0x72, 0x6d }, unorm_swap }, /* dataFormat="Norm" */
{ { 0x4e, 0x72, 0x6d, 0x32 }, unorm2_swap }, /* dataFormat="Nrm2" */
#endif
{ { ULAYOUT_FMT_0, ULAYOUT_FMT_1, ULAYOUT_FMT_2, ULAYOUT_FMT_3 },
ulayout_swap }, // dataFormat="Layo"
#if !UCONFIG_NO_COLLATION
{ { 0x55, 0x43, 0x6f, 0x6c }, ucol_swap }, /* dataFormat="UCol" */
{ { 0x49, 0x6e, 0x76, 0x43 }, ucol_swapInverseUCA },/* dataFormat="InvC" */

View file

@ -68,7 +68,7 @@ public final class CharacterPropertiesImpl {
case UCharacterProperty.SRC_INPC:
case UCharacterProperty.SRC_INSC:
case UCharacterProperty.SRC_VO:
UCharacterProperty.INSTANCE.ulayout_addPropertyStarts(src, incl);
UCharacterProperty.ulayout_addPropertyStarts(src, incl);
break;
default:
throw new IllegalStateException("getInclusions(unknown src " + src + ")");

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bff554a5fd35fddf6a105bb560ec56d120cee51c4655e941f2306a90297ebe53
size 12696138
oid sha256:894170fe283160e26a879efdc5a367d519555a99e293111d5fdda028ab0aac27
size 12699933

View file

@ -204,8 +204,7 @@ main(int argc, char* argv[]) {
casePropsBuilder->writeCSourceFile(sourceCommon.data(), errorCode);
casePropsBuilder->writeBinaryData(sourceDataIn.data(), withCopyright, errorCode);
namesPropsBuilder->writeBinaryData(sourceDataIn.data(), withCopyright, errorCode);
layoutPropsBuilder->writeCSourceFile(sourceCommon.data(), errorCode);
layoutPropsBuilder->writeJavaSourceFile("", errorCode);
layoutPropsBuilder->writeBinaryData(sourceDataIn.data(), withCopyright, errorCode);
return errorCode;
}

View file

@ -16,19 +16,74 @@
#include "genprops.h"
#include "ppucd.h"
#include "uassert.h"
#include "writesrc.h"
#include "ulayout_props.h"
#include "unewdata.h"
/* Unicode layout properties file format ---------------------------------------
The file format prepared and written here contains several data
structures that store indexes or data.
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.
The following is a description of format version 1.0 .
The file contains the following structures:
const int32_t indexes[i0] with values i0, i1, ...:
(see ULAYOUT_IX_... constants for names of indexes)
i0 indexesLength; -- length of indexes[] (ULAYOUT_IX_COUNT)
i1 inpcTop; -- limit byte offset of the InPC trie
i2 inscTop; -- limit byte offset of the InSC trie
i3 voTop; -- limit byte offset of the vo trie
i4..i7 -- reserved, same as the last limit byte offset
i8 -- reserved, 0
i9 maxValues; -- max values of the InPC, InSC, vo properties
(8 bits each; lowest 8 bits reserved, 0)
i10..i11 -- reserved, 0
After the indexes array follow consecutive, serialized,
single-property code point tries for the following properties,
each built "small" or "fast",
each padded to a multiple of 16 bytes:
- InPC
- InSC
- vo
----------------------------------------------------------------------------- */
U_NAMESPACE_USE
// UDataInfo cf. udata.h
static UDataInfo dataInfo = {
sizeof(UDataInfo),
0,
U_IS_BIG_ENDIAN,
U_CHARSET_FAMILY,
U_SIZEOF_UCHAR,
0,
// dataFormat="Layo"
{ ULAYOUT_FMT_0, ULAYOUT_FMT_1, ULAYOUT_FMT_2, ULAYOUT_FMT_3 },
{ 1, 0, 0, 0 }, // formatVersion
{ 12, 0, 0, 0 } // dataVersion
};
class LayoutPropsBuilder : public PropsBuilder {
public:
LayoutPropsBuilder(UErrorCode &errorCode);
virtual ~LayoutPropsBuilder() U_OVERRIDE;
virtual void setUnicodeVersion(const UVersionInfo version) U_OVERRIDE;
virtual void setProps(const UniProps &props, const UnicodeSet &newValues, UErrorCode &errorCode) U_OVERRIDE;
virtual void build(UErrorCode &errorCode) U_OVERRIDE;
virtual void writeCSourceFile(const char *path, UErrorCode &errorCode) U_OVERRIDE;
virtual void writeJavaSourceFile(const char *path, UErrorCode &errorCode) U_OVERRIDE;
virtual void writeBinaryData(const char *path, UBool withCopyright, UErrorCode &errorCode) U_OVERRIDE;
private:
void setIntProp(const UniProps &, const UnicodeSet &newValues,
@ -38,9 +93,6 @@ private:
return maxIntValues[prop - UCHAR_INT_START];
}
void checkMaxIntValue(UProperty prop, int32_t maxMax, UErrorCode &errorCode) const;
void writeMaxIntValue(FILE *f, const char *name, UProperty prop) const {
fprintf(f, "static const int32_t max%sValue = %ld;\n\n", name, (long)getMaxIntValue(prop));
}
int32_t maxIntValues[UCHAR_INT_LIMIT - UCHAR_INT_START];
UMutableCPTrie *inpcMutableTrie;
@ -73,6 +125,11 @@ LayoutPropsBuilder::~LayoutPropsBuilder() {
ucptrie_close(voTrie);
}
void
LayoutPropsBuilder::setUnicodeVersion(const UVersionInfo version) {
uprv_memcpy(dataInfo.dataVersion, version, 4);
}
void
LayoutPropsBuilder::setProps(const UniProps &props, const UnicodeSet &newValues,
UErrorCode &errorCode) {
@ -127,6 +184,24 @@ UCPTrie *buildUCPTrie(const char *name, UMutableCPTrie *mutableTrie,
return trie;
}
constexpr int32_t TRIE_BLOCK_CAPACITY = 100000;
uint8_t inpcBytes[TRIE_BLOCK_CAPACITY];
uint8_t inscBytes[TRIE_BLOCK_CAPACITY];
uint8_t voBytes[TRIE_BLOCK_CAPACITY];
int32_t inpcLength = 0;
int32_t inscLength = 0;
int32_t voLength = 0;
int32_t writeTrieBytes(const UCPTrie *trie, uint8_t block[], UErrorCode &errorCode) {
int32_t length = ucptrie_toBinary(trie, block, TRIE_BLOCK_CAPACITY, &errorCode);
while ((length & 0xf) != 0) {
block[length++] = 0xaa;
}
return length;
}
} // namespace
void
@ -145,6 +220,15 @@ LayoutPropsBuilder::build(UErrorCode &errorCode) {
UCPTRIE_TYPE_SMALL, UCPTRIE_VALUE_BITS_8, errorCode);
voTrie = buildUCPTrie("vo", voMutableTrie,
UCPTRIE_TYPE_SMALL, UCPTRIE_VALUE_BITS_8, errorCode);
inpcLength = writeTrieBytes(inpcTrie, inpcBytes, errorCode);
inscLength = writeTrieBytes(inscTrie, inscBytes, errorCode);
voLength = writeTrieBytes(voTrie, voBytes, errorCode);
if (!beQuiet) {
int32_t size = ULAYOUT_IX_COUNT * 4 + inpcLength + inscLength + voLength;
printf("data size: %5d\n", (int)size);
}
}
void LayoutPropsBuilder::checkMaxIntValue(UProperty prop, int32_t maxMax,
@ -156,126 +240,62 @@ void LayoutPropsBuilder::checkMaxIntValue(UProperty prop, int32_t maxMax,
}
}
// In ICU 63, we had functions writeCSourceFile() and writeJavaSourceFile().
// For Java, each serialized trie was written as a String constant with
// one byte per char and an optimization for byte 0,
// to optimize for Java .class file size.
// (See ICU 63 if we need to resurrect some of that code.)
// Since ICU 64, we write a binary ulayout.icu file for use in both C++ & Java.
void
LayoutPropsBuilder::writeCSourceFile(const char *path, UErrorCode &errorCode) {
LayoutPropsBuilder::writeBinaryData(const char *path, UBool withCopyright, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return; }
FILE *f = usrc_create(path, "ulayout_props_data.h", 2018,
"icu/tools/unicode/c/genprops/layoutpropsbuilder.cpp");
if (f == nullptr) {
errorCode = U_FILE_ACCESS_ERROR;
return;
}
fputs("#ifdef INCLUDED_FROM_UPROPS_CPP\n\n", f);
writeMaxIntValue(f, "InPC", UCHAR_INDIC_POSITIONAL_CATEGORY);
usrc_writeUCPTrie(f, "inpc", inpcTrie);
writeMaxIntValue(f, "InSC", UCHAR_INDIC_SYLLABIC_CATEGORY);
usrc_writeUCPTrie(f, "insc", inscTrie);
writeMaxIntValue(f, "Vo", UCHAR_VERTICAL_ORIENTATION);
usrc_writeUCPTrie(f, "vo", voTrie);
fputs("#endif // INCLUDED_FROM_UPROPS_CPP\n", f);
fclose(f);
}
namespace {
// Write one byte as one char in a Java String literal.
// Java class file string literals use one byte per U+0001..U+007F,
// and two bytes per U+0000 or U+0080..U+07FF.
// This is reasonably compact if small byte values are more common, as usual.
// Since 0 is very common but takes two bytes, we swap it with U+007A 'z'.
int32_t appendByte(char *s, int32_t length, uint8_t b) {
if (b == 0) {
s[length++] = 'z';
} else if (b == 0x7a) {
s[length++] = '\\';
s[length++] = '0';
} else {
// Write all other bytes as octal escapes. (Java does not support \xhh.)
// We could make the source file smaller by writing ASCII characters
// directly where possible, but that would not make the class file any smaller,
// and we would have to be careful to still escape certain characters,
// and to escape digits after short octal escapes.
s[length++] = '\\';
if (b >= 0100) {
s[length++] = '0' + (b >> 6);
}
if (b >= 010) {
s[length++] = '0' + ((b >> 3) & 7);
}
s[length++] = '0' + (b & 7);
}
return length;
}
void writeBytesAsJavaString(FILE *f, const uint8_t *bytes, int32_t length) {
// Quotes, line feed, etc., with up to 16 bytes per line, up to 4 bytes "\377" each.
char line[80];
int32_t lineLength = 0;
for (int32_t i = 0;;) {
if ((i & 0xf) == 0) { // start of a line of 16 bytes
line[0] = '"';
lineLength = 1;
}
if (i < length) {
lineLength = appendByte(line, lineLength, bytes[i++]);
}
if (i == length) { // end of the string
line[lineLength++] = '"';
line[lineLength++] = '\n';
line[lineLength++] = '\n';
line[lineLength++] = 0;
fputs(line, f);
break;
}
if ((i & 0xf) == 0) { // end of a line of 16 bytes
line[lineLength++] = '"';
line[lineLength++] = ' ';
line[lineLength++] = '+';
line[lineLength++] = '\n';
line[lineLength++] = 0;
fputs(line, f);
}
}
}
static uint8_t trieBlock[100000];
void writeUCPTrieAsJavaString(FILE *f, const UCPTrie *trie, UErrorCode &errorCode) {
int32_t length = ucptrie_toBinary(trie, trieBlock, UPRV_LENGTHOF(trieBlock), &errorCode);
writeBytesAsJavaString(f, trieBlock, length);
}
} // namespace
// So far, this writes initializers to be copied into Java code, but not a complete Java file.
// We should probably write a regular, binary ICU data file and read that into Java.
void
LayoutPropsBuilder::writeJavaSourceFile(const char * /*path*/, UErrorCode &errorCode) {
if (U_FAILURE(errorCode)) { return; }
FILE *f = usrc_create("/tmp", "ulayout_props_data.txt", 2018,
"icu/tools/unicode/c/genprops/layoutpropsbuilder.cpp");
if (f == nullptr) {
errorCode = U_FILE_ACCESS_ERROR;
UNewDataMemory *pData = udata_create(
path, ULAYOUT_DATA_TYPE, ULAYOUT_DATA_NAME, &dataInfo,
withCopyright ? U_COPYRIGHT_STRING : NULL, &errorCode);
if (U_FAILURE(errorCode)) {
fprintf(stderr, "genprops: udata_create(%s, ulayout.icu) failed - %s\n",
path, u_errorName(errorCode));
return;
}
writeMaxIntValue(f, "InPC", UCHAR_INDIC_POSITIONAL_CATEGORY);
writeUCPTrieAsJavaString(f, inpcTrie, errorCode);
int32_t indexes[ULAYOUT_IX_COUNT] = { ULAYOUT_IX_COUNT };
int32_t top = ULAYOUT_IX_COUNT * 4;
writeMaxIntValue(f, "InSC", UCHAR_INDIC_SYLLABIC_CATEGORY);
writeUCPTrieAsJavaString(f, inscTrie, errorCode);
indexes[ULAYOUT_IX_INPC_TRIE_TOP] = (top += inpcLength);
indexes[ULAYOUT_IX_INSC_TRIE_TOP] = (top += inscLength);
indexes[ULAYOUT_IX_VO_TRIE_TOP] = (top += voLength);
writeMaxIntValue(f, "Vo", UCHAR_VERTICAL_ORIENTATION);
writeUCPTrieAsJavaString(f, voTrie, errorCode);
// Set reserved trie-top values to the top of the last trie
// so that they look empty until a later file format version
// uses one or more of these slots.
for (int32_t i = ULAYOUT_IX_RESERVED_TOP; i <= ULAYOUT_IX_TRIES_TOP; ++i) {
indexes[i] = top;
}
fclose(f);
puts(" ++ Java initializers written to /tmp/ulayout_props_data.txt");
indexes[ULAYOUT_IX_MAX_VALUES] =
((getMaxIntValue(UCHAR_INDIC_POSITIONAL_CATEGORY)) << ULAYOUT_MAX_INPC_SHIFT) |
((getMaxIntValue(UCHAR_INDIC_SYLLABIC_CATEGORY)) << ULAYOUT_MAX_INSC_SHIFT) |
((getMaxIntValue(UCHAR_VERTICAL_ORIENTATION)) << ULAYOUT_MAX_VO_SHIFT);
udata_writeBlock(pData, indexes, sizeof(indexes));
udata_writeBlock(pData, inpcBytes, inpcLength);
udata_writeBlock(pData, inscBytes, inscLength);
udata_writeBlock(pData, voBytes, voLength);
long dataLength = udata_finish(pData, &errorCode);
if (U_FAILURE(errorCode)) {
fprintf(stderr, "genprops: error %s writing the output file\n", u_errorName(errorCode));
return;
}
if (dataLength != (long)top) {
fprintf(stderr,
"udata_finish(ulayout.icu) reports %ld bytes written but should be %ld\n",
dataLength, (long)top);
errorCode = U_INTERNAL_PROGRAM_ERROR;
}
}
PropsBuilder *