scuffed-code/icu4c/source/common/unorm.cpp
Syn Wee Quek 29f85bb9b6 ICU-833
Updated checkFCD implementation to use 2 bytes instead of the original 1byte FCD value.

X-SVN-Rev: 4363
2001-03-28 00:04:49 +00:00

1115 lines
54 KiB
C++

/*
******************************************************************************
* Copyright (c) 1996-2001, International Business Machines
* Corporation and others. All Rights Reserved.
******************************************************************************
* File unorm.cpp
*
* Created by: Vladimir Weinstein 12052000
*
* Modification history :
*
* Date Name Description
* 02/01/01 synwee Added normalization quickcheck enum and method.
* 02/12/01 synwee Commented out quickcheck util api has been approved
* Added private method for doing FCD checks
* 02/23/01 synwee Modified quickcheck and checkFCE to run through
* string for codepoints < 0x300 for the normalization
* mode NFC.
*/
#include "unicode/unorm.h"
#include "unicode/normlzr.h"
#include "unicode/ustring.h"
#include "cpputils.h"
#include "ustr_imp.h"
/* added by synwee */
#include "unicode/uchar.h"
#include "unicode/utf16.h"
/* added by synwee for trie manipulation*/
#define STAGE_1_SHIFT_ 10
#define STAGE_2_SHIFT_ 4
#define STAGE_2_MASK_AFTER_SHIFT_ 0x3F
#define STAGE_3_MASK_ 0xF
#define LAST_BYTE_MASK_ 0xFF
#define SECOND_LAST_BYTE_SHIFT_ 8
/* added by synwee for fast route in quickcheck and fcd */
#define NFC_ZERO_CC_BLOCK_LIMIT_ 0x300
/**
* Array of mask for determining normalization quick check values.
* Indexes follows the values in UNormalizationMode
*/
static const uint8_t UQUICK_CHECK_MASK_[] = {0, 0, 0x11, 0x22, 0x44, 0x88};
/*
* Array of minimum codepoints that has UNORM_MAYBE or UNORM_NO quick check
* values. Indexes follows the values in UNormalizationMode.
* Generated values! Edit at your own risk.
*/
static const UChar32 UQUICK_CHECK_MIN_VALUES_[] = {0, 0, 0xc0, 0xa0, 0x300,
0xa0};
/**
* Minimum value to determine if quickcheck value contains a MAYBE
*/
static const uint8_t MIN_UNORM_MAYBE_ = 0x10;
U_CAPI int32_t
unorm_normalize(const UChar* source,
int32_t sourceLength,
UNormalizationMode mode,
int32_t option,
UChar* result,
int32_t resultLength,
UErrorCode* status)
{
if(U_FAILURE(*status)) return -1;
/* synwee : removed hard coded conversion */
Normalizer::EMode normMode = Normalizer::getNormalizerEMode(mode, *status);
if (U_FAILURE(*status))
return -1;
int32_t len = (sourceLength == -1 ? u_strlen(source) : sourceLength);
const UnicodeString src(sourceLength == -1, source, len);
UnicodeString dst(result, 0, resultLength);
/* synwee : note quickcheck is added in C ++ normalize method */
if ((option & UNORM_IGNORE_HANGUL) != 0)
option = Normalizer::IGNORE_HANGUL;
Normalizer::normalize(src, normMode, option, dst, *status);
return uprv_fillOutputString(dst, result, resultLength, status);
}
/**
* Array of normalization form corresponding to the index code point.
* Hence codepoint 0xABCD will have normalization form QUICK_CHECK_DATA[0xABCD].
* UQUICK_CHECK_DATA[0xABCD] is a byte containing 2 sets of 4 bits information
* representing UNORM_MAYBE and UNORM_YES.<br>
* bits 1 2 3 4 5678<br>
* NFKC NFC NFKD NFD MAYBES NFKC NFC NFKD NFD YES<br>
* ie if UQUICK_CHECK_DATA[0xABCD] = 10000001, this means that 0xABCD is in
* NFD form and maybe in NFKC form
*
* Generated data!! Change at your own risk.
* Situated here temporary.
*/
static const uint32_t QUICKCHECK_STAGE_1_[] =
{
0x0, 0x40, 0x6e, 0xac, 0xea, 0x107, 0x107, 0x127, 0x167, 0x1a1,
0x107, 0x1b8, 0x1f8, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x238, 0x238, 0x238, 0x238, 0x238, 0x238, 0x238,
0x238, 0x238, 0x238, 0x23e, 0x27e, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x2be, 0x2fc, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x33c, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x33c, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x33c, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x33c,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x33c, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x33c, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x33c, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x33c, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x33c,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x33c, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x33c, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x33c, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x33c, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x33c,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x33c, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107,
0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x107, 0x33c
};
static const uint32_t QUICKCHECK_STAGE_2_[] =
{
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x10, 0x1d, 0x2d, 0x3d, 0x2d, 0x4c, 0x5b, 0x6b, 0x65, 0x7a,
0x89, 0x69, 0x65, 0x95, 0x0, 0x0, 0xa5, 0xb4, 0xc0, 0xcd,
0x67, 0xdc, 0x5b, 0x5f, 0xec, 0xf8, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x108, 0x0, 0x111, 0x11a, 0x0, 0x12a, 0x138,
0x145, 0x152, 0x162, 0x0, 0x0, 0x16e, 0x17d, 0xb4, 0x18d, 0xb4,
0x19d, 0x1ad, 0x0, 0x1bd, 0x1cd, 0xab, 0x0, 0xab, 0x0, 0x1cd,
0x0, 0x1dc, 0x0, 0x0, 0x0, 0x0, 0x1e1, 0x1f1, 0x1f9, 0x203,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20d, 0x0,
0x0, 0x219, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x227, 0x0,
0x0, 0x234, 0x0, 0x23f, 0x0, 0x0, 0x0, 0x0, 0x24f, 0xb1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xab, 0x25e,
0x0, 0x26b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27b, 0x28a, 0x297,
0x0, 0x0, 0x0, 0x0, 0x0, 0x2a7, 0x0, 0x2ae, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x27b, 0x2bd, 0x2ca, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x27b,
0x2d8, 0x216, 0x0, 0x0, 0x0, 0x0, 0xac, 0x217, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2e8, 0x2f4, 0x0, 0x0, 0x0, 0x0,
0x0, 0x27b, 0x2d8, 0x216, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x2fb, 0x30b, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31b, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x31b, 0x0, 0x31f, 0x0, 0x0,
0x4, 0x0, 0x0, 0x0, 0x32d, 0x338, 0x345, 0x352, 0x361, 0x32d,
0x338, 0x345, 0x0, 0x0, 0x0, 0x0, 0x36b, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37a, 0x384, 0x0, 0x0,
0x38c, 0x394, 0x3a1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x3b1, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0xf2, 0x5b, 0x1fb, 0x5b, 0x5b, 0x1fb, 0x3c1, 0x5b,
0x3d0, 0x5b, 0x5b, 0x5b, 0x3e0, 0x3ef, 0x3ff, 0x40f, 0x41f, 0x42f,
0x43e, 0x44a, 0x456, 0x465, 0x0, 0x0, 0x475, 0x479, 0x0, 0x8,
0x0, 0x0, 0x0, 0x0, 0x0, 0x484, 0x490, 0x4a0, 0x4ac, 0x0,
0x476, 0x4bc, 0x4bc, 0x0, 0x28b, 0x363, 0x0, 0x1e4, 0x0, 0x0,
0x0, 0x4cc, 0x0, 0x4d9, 0x4e8, 0x4f7, 0x0, 0x4fe, 0x50c, 0x50c,
0x0, 0x1e5, 0x0, 0x0, 0x0, 0x51c, 0x0, 0x0, 0x0, 0x52a,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc,
0x4bc, 0x53a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31b, 0x4bc, 0x4bc,
0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc,
0x4bc, 0x119, 0x0, 0x0, 0x4e8, 0x0, 0x0, 0x545, 0x550, 0x55c,
0x568, 0x578, 0x0, 0x586, 0x550, 0x55c, 0x568, 0x578, 0x0, 0x595,
0x0, 0x0, 0x0, 0x478, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x479, 0x477,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4bc, 0x4bf, 0x4bc, 0x4bc,
0x5a5, 0x0, 0x4bc, 0x4c0, 0x4bc, 0x4bc, 0x4bc, 0x4e8, 0x4c0, 0x4bc,
0x4bc, 0x479, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x5b5,
0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4be, 0x4bc, 0x479, 0x5b, 0x5b,
0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b, 0x5b,
0x5b, 0x5b, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c5,
0x5c5, 0x5c5, 0x5c5, 0x5c5, 0x5c7, 0x5d7, 0x5e5, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x5f5, 0x602, 0x612, 0x61c, 0x62c, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc,
0x4bc, 0x63b, 0x0, 0x476, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc,
0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc,
0x4bc, 0x4bc, 0x4bc, 0x4be, 0x0, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x477,
0x4bc, 0x4bc, 0x109, 0x0, 0x0, 0x4c0, 0x0, 0x0, 0x0, 0x4bc,
0x64b, 0x658, 0x661, 0x671, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x4bc,
0x4bc, 0x4bf, 0x478, 0x4bc, 0x4bc, 0x4bc, 0x4bc, 0x479, 0x478, 0x4bc,
0x4bc, 0x4bc, 0x4bc, 0x479, 0x681, 0x689, 0x699, 0x6a8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x6a8
};
static const uint8_t QUICKCHECK_STAGE_3_[] =
{
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x5, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0x5, 0xf, 0x5, 0xf, 0xf, 0xf,
0xf, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0x5, 0x5, 0x5,
0xf, 0x5, 0x5, 0x5, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0xf,
0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0xf, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xf, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc,
0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0xf, 0xc,
0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xf, 0x5, 0x5, 0xc, 0xc, 0xc, 0xc,
0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0x5, 0xf, 0xf,
0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0x5, 0xf, 0xf, 0xc,
0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xc, 0x5, 0xc, 0xc, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0xc,
0xc, 0x5, 0x5, 0x5, 0xc, 0xc, 0xf, 0xf, 0xc, 0xc,
0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xc3,
0xc3, 0xc3, 0xc3, 0xf, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3,
0xc3, 0xf, 0xf, 0xc3, 0xf, 0xc3, 0xc3, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xc3, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xc3,
0xc3, 0xc3, 0xc3, 0xc3, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xc3,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0x0, 0x0, 0xc3, 0x0, 0x0, 0xc3,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x0, 0xf, 0xf, 0xf, 0xf, 0xf, 0x5, 0xf, 0xf, 0xf,
0x0, 0xf, 0xf, 0xf, 0xf, 0x5, 0x4, 0xc, 0x0, 0xc,
0xc, 0xc, 0xf, 0xc, 0xf, 0xc, 0xc, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0x5,
0x5, 0x5, 0x4, 0x4, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x5, 0x5, 0x5, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc, 0xc, 0xf, 0xc, 0xf, 0xf, 0xf, 0xc, 0xf,
0xf, 0xf, 0xf, 0xc, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xc, 0xc,
0xc, 0xf, 0xf, 0xc, 0xc, 0xf, 0xf, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xf, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xf, 0xf, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc3, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xc3, 0xc3,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc, 0xf, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xf, 0xf,
0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc3,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xc3, 0xf, 0xf, 0xf, 0xf, 0x0, 0x0, 0xf, 0x0, 0xf,
0xf, 0xf, 0x0, 0xf, 0xf, 0x0, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0x0, 0x0, 0xf, 0xf,
0x0, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc,
0xf, 0xf, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xc3, 0xc3, 0xf, 0xf, 0xf, 0xf, 0x0, 0x0, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xc,
0xc, 0xf, 0xf, 0xf, 0xc, 0xf, 0xc3, 0xf, 0xf, 0xf,
0xf, 0xc, 0xc, 0xf, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc3, 0xc3, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xc3, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc,
0xf, 0xc, 0xc, 0xc, 0xc3, 0xf, 0xf, 0xf, 0x5, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x5, 0x5, 0xf, 0xf, 0xf, 0x0, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xf, 0xf, 0xf,
0xf, 0x0, 0xf, 0xf, 0xf, 0xf, 0x0, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0x0, 0xf, 0x0, 0x0, 0x5, 0x0, 0x5,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc3,
0xf, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3,
0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc3, 0xc3, 0xc3, 0xc3,
0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3,
0xc3, 0xc3, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc,
0xc, 0xc, 0xc, 0xc, 0xc, 0x5, 0x4, 0xf, 0xf, 0xf,
0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf,
0xc, 0xf, 0xc, 0xf, 0xc, 0xf, 0xc, 0x0, 0xc, 0x0,
0xc, 0x0, 0xc, 0x0, 0xc, 0x0, 0xc, 0x0, 0xc, 0x0,
0xf, 0xf, 0xc, 0xc, 0xc, 0xc, 0xc, 0xf, 0xc, 0xc,
0xc, 0xc, 0xc, 0x0, 0xc, 0x5, 0x0, 0x5, 0x4, 0xc,
0xc, 0xc, 0xf, 0xc, 0xc, 0xc, 0x0, 0xc, 0x0, 0xc,
0x4, 0x4, 0x4, 0xc, 0xc, 0xc, 0x0, 0xf, 0xf, 0xc,
0xc, 0xc, 0xc, 0xc, 0x0, 0xf, 0x4, 0x4, 0x4, 0xc,
0xc, 0xc, 0x0, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc,
0x0, 0xc, 0x4, 0x0, 0x0, 0xf, 0xf, 0xc, 0xc, 0xc,
0xf, 0xc, 0xc, 0xc, 0x0, 0xc, 0x0, 0xc, 0x0, 0x5,
0xf, 0x0, 0x0, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf, 0x5, 0xf, 0xf,
0xf, 0xf, 0xf, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0x5, 0x5, 0xf, 0x5, 0x5, 0xf, 0xf,
0xf, 0xf, 0x5, 0xf, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x5, 0xf, 0xf, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5,
0xf, 0x5, 0x5, 0x5, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0xf, 0x5, 0x5, 0xf, 0xf, 0x5, 0x5, 0x5,
0x5, 0x5, 0xf, 0xf, 0x5, 0x5, 0x5, 0xf, 0x5, 0xf,
0x0, 0xf, 0x5, 0xf, 0x0, 0x0, 0x5, 0x5, 0xf, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf,
0xf, 0xf, 0xc, 0xf, 0xf, 0xf, 0xf, 0xc, 0xf, 0xf,
0xc, 0xf, 0xf, 0xf, 0xf, 0xc, 0xf, 0xc, 0xf, 0xf,
0xf, 0xf, 0xf, 0x5, 0x5, 0xf, 0x5, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xc, 0xf, 0xf, 0xc, 0xf, 0xf, 0xc, 0xf,
0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc, 0xc, 0xc, 0xf, 0xf, 0xc, 0xc, 0xf, 0xf,
0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xc,
0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xc,
0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x0, 0x0, 0xf, 0xf, 0xf, 0xf, 0xf, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x5, 0xf, 0x5, 0x5, 0x5,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xc, 0xf, 0xc, 0xf, 0xc, 0xf, 0xc, 0xf,
0xc, 0xf, 0xc, 0xf, 0xc, 0xf, 0xc, 0xf, 0xf, 0xc,
0xf, 0xc, 0xf, 0xc, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xc, 0xc, 0xf, 0xc, 0xc, 0xf, 0xc, 0xc, 0xf, 0xc,
0xc, 0xf, 0xc, 0xc, 0xf, 0xf, 0xf, 0xf, 0xc, 0xf,
0xf, 0xf, 0xf, 0xc3, 0xc3, 0x5, 0x5, 0xf, 0xc, 0xf,
0xf, 0xf, 0xf, 0xc, 0xf, 0xf, 0xc, 0xc, 0xc, 0xc,
0xf, 0xf, 0xf, 0xc, 0xf, 0x5, 0x5, 0x5, 0x5, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf,
0xf, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xf, 0x0, 0xf, 0x0, 0xf, 0xf,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xf, 0x0, 0xf, 0xf, 0x0, 0x0, 0xf, 0xf, 0xf, 0x0,
0x0, 0x0, 0x0, 0xf, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf,
0xf, 0xc, 0xf, 0x0, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0xf,
0x0, 0x0, 0xf, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x5, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf,
0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5,
0xf, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0x5,
0x5, 0x5, 0xf, 0x5, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0xf, 0xf, 0x5, 0x5, 0x5, 0x5, 0x5,
0x5, 0xf, 0xf, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0x5,
0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0xf, 0x5, 0x5, 0x5,
0x5, 0x5, 0x5, 0x5, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0x0
};
/**
* Performing quick check on a string, to quickly determine if the string is
* in a particular normalization format.
* Three types of result can be returned UNORM_YES, UNORM_NO or
* UNORM_MAYBE. Result UNORM_YES indicates that the argument
* string is in the desired normalized format, UNORM_NO determines that
* argument string is not in the desired normalized format. A
* UNORM_MAYBE result indicates that a more thorough check is required,
* the user may have to put the string in its normalized form and compare the
* results.
* @param source string for determining if it is in a normalized format
* @param sourcelength length of source to test
* @param mode normalization format from the enum UNormalizationMode
* @param status A pointer to an UErrorCode to receive any errors
* @return UNORM_YES, UNORM_NO or UNORM_MAYBE
*/
U_CAPI UNormalizationCheckResult
unorm_quickCheck(const UChar *source,
int32_t sourcelength,
UNormalizationMode mode,
UErrorCode* status)
{
uint8_t oldcombiningclass = 0;
uint8_t combiningclass;
uint8_t quickcheckvalue;
uint8_t mask = UQUICK_CHECK_MASK_[mode];
UChar32 min = UQUICK_CHECK_MIN_VALUES_[mode];
UChar32 codepoint;
UNormalizationCheckResult result = UNORM_YES;
const UChar *psource;
const UChar *pend;
if (U_FAILURE(*status)) {
return UNORM_MAYBE;
}
/* checking argument*/
if (mode >= UNORM_MODE_COUNT || mode < UNORM_NONE) {
*status = U_ILLEGAL_ARGUMENT_ERROR;
return UNORM_MAYBE;
}
if (sourcelength >= 0) {
psource = source;
pend = source + sourcelength;
for (;;) {
if (psource >= pend) {
return UNORM_YES;
}
/* fast route : since codepoints < min has combining class 0 and YES
looking at the minimum values, surrogates are not a problem */
if (*psource >= min) {
break;
}
psource ++;
}
}
else {
psource = source;
for (;;) {
if (*psource == 0) {
return UNORM_YES;
}
/* fast route : since codepoints < min has combining class 0 and YES
looking at the minimum values, surrogates are not a problem */
if (*psource >= min) {
break;
}
psource ++;
}
}
if (sourcelength >= 0) {
for (;;) {
int count = 0;
if (psource >= pend) {
break;
}
UTF_NEXT_CHAR(psource, count, pend - psource, codepoint);
combiningclass = u_getCombiningClass(codepoint);
/* not in canonical order */
if (oldcombiningclass > combiningclass && combiningclass != 0) {
return UNORM_NO;
}
oldcombiningclass = combiningclass;
/* trie access */
quickcheckvalue = QUICKCHECK_STAGE_3_[
QUICKCHECK_STAGE_2_[QUICKCHECK_STAGE_1_[codepoint >> STAGE_1_SHIFT_] +
((codepoint >> STAGE_2_SHIFT_) & STAGE_2_MASK_AFTER_SHIFT_)] +
(codepoint & STAGE_3_MASK_)] & mask;
/* value is a byte containing 2 sets of 4 bits information.
bits 1 2 3 4 5678<br>
NFKC NFC NFKD NFD MAYBES NFKC NFC NFKD NFD YES<br>
ie if quick[0xABCD] = 10000001, this means that 0xABCD is in NFD form
and maybe in NFKC form. */
if (quickcheckvalue == 0) {
return UNORM_NO;
}
if (quickcheckvalue >= MIN_UNORM_MAYBE_) {
result = UNORM_MAYBE;
}
psource += count;
}
}
else {
for (;;) {
int count = 0;
UTF_NEXT_CHAR(psource, count, pend - psource, codepoint);
if (codepoint == 0) {
break;
}
combiningclass = u_getCombiningClass(codepoint);
/* not in canonical order */
if (oldcombiningclass > combiningclass && combiningclass != 0) {
return UNORM_NO;
}
oldcombiningclass = combiningclass;
/* trie access */
quickcheckvalue = QUICKCHECK_STAGE_3_[
QUICKCHECK_STAGE_2_[QUICKCHECK_STAGE_1_[codepoint >> STAGE_1_SHIFT_] +
((codepoint >> STAGE_2_SHIFT_) & STAGE_2_MASK_AFTER_SHIFT_)] +
(codepoint & STAGE_3_MASK_)] & mask;
/* value is a byte containing 2 sets of 4 bits information.
bits 1 2 3 4 5678<br>
NFKC NFC NFKD NFD MAYBES NFKC NFC NFKD NFD YES<br>
ie if quick[0xABCD] = 10000001, this means that 0xABCD is in NFD form
and maybe in NFKC form. */
if (quickcheckvalue == 0) {
return UNORM_NO;
}
if (quickcheckvalue >= MIN_UNORM_MAYBE_) {
result = UNORM_MAYBE;
}
psource += count;
}
}
return result;
}
/* private data members ----------------------------------------------------- */
/**
* Trie data for FCD.
* Each index corresponds to each code point. Trie value is the combining class
* of the last character of the NFD of the codepoint.
* Generated data!! Change at your own risk.
* Situated here temporary.
* size uint16_t for the first 2 stages instead of uint32_t to reduce size.
*/
static const uint16_t FCD_STAGE_1_[] =
{
0x0, 0x40, 0x75, 0xb2, 0xef, 0xf3, 0x131, 0x151, 0x191, 0x1c0,
0x1c0, 0x1c0, 0x1fe, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x20e, 0x243, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0,
0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0
};
static const uint16_t FCD_STAGE_2_[] =
{
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x10, 0x20, 0x10, 0x2f, 0x3e, 0x4e, 0x5c, 0x6c,
0x7b, 0x89, 0x95, 0xa3, 0x0, 0x0, 0xb3, 0xc2, 0x3, 0xd2,
0xe0, 0xef, 0xf7, 0xff, 0x10f, 0x11b, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x12b, 0x136,
0x145, 0x151, 0x15e, 0x0, 0x16e, 0x0, 0x179, 0x188, 0x6, 0x188,
0x18e, 0x19d, 0x0, 0x0, 0x1ad, 0x1bc, 0x0, 0x1bc, 0x0, 0x1ad,
0x0, 0x1c6, 0x1d3, 0x0, 0x0, 0x0, 0x186, 0x1e3, 0x1eb, 0x1f5,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x204,
0x212, 0x222, 0x232, 0x0, 0x0, 0x0, 0x0, 0x0, 0x240, 0x0,
0x247, 0x257, 0x0, 0x267, 0x0, 0x0, 0x0, 0x0, 0x277, 0x284,
0x293, 0x0, 0x0, 0x2a2, 0x0, 0x2b2, 0x2c1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x2cc, 0x2db, 0x2e8, 0x2f7, 0x0,
0x0, 0x0, 0x0, 0x0, 0x307, 0x2e8, 0x314, 0x0, 0x0, 0x0,
0x0, 0x0, 0x324, 0x2e8, 0x331, 0x0, 0x0, 0x0, 0x0, 0x0,
0x307, 0x2e8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x307, 0x2e8,
0x340, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e8, 0x0, 0x0,
0x0, 0x0, 0x34e, 0x35c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x2e8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e8, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x363, 0x36e, 0x0, 0x0,
0x0, 0x0, 0x0, 0x37c, 0x387, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x393, 0x39d, 0x0, 0x0, 0x0, 0x0, 0x3a9, 0x0, 0x3b4,
0x0, 0x0, 0x0, 0x3c3, 0x3d3, 0x0, 0x0, 0x0, 0x3dd, 0x0,
0x0, 0x0, 0x3e6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x3f4, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x3fb, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x40b,
0x41b, 0x427, 0x435, 0x443, 0x44f, 0x45b, 0x467, 0x477, 0x485, 0x495,
0x477, 0x49b, 0xf7, 0x4a3, 0x4b3, 0xf7, 0x1ed, 0xf7, 0xf7, 0x1ed,
0x4c3, 0xf7, 0x4d2, 0x4e2, 0x4e2, 0x4e2, 0x4f2, 0x501, 0x50e, 0x51b,
0x52a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x53a, 0x549, 0x0, 0x0, 0x0, 0x54e,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55a, 0x566, 0x0, 0x575,
0x0, 0x0, 0x0, 0x585, 0x0, 0x592, 0x0, 0x5a1, 0x0, 0x5a8,
0x5b6, 0x5b6, 0x0, 0x5c0, 0x0, 0x0, 0x0, 0x5cc, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x5da, 0x0, 0x5ea, 0x5f6, 0x602, 0x612, 0x0, 0x620,
0x5ea, 0x5f6, 0x602, 0x612, 0x0, 0x62f, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x63e, 0x64e, 0x65e, 0x66e, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x67e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0
};
static const uint16_t FCD_STAGE_3_[] =
{
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0x0, 0xca, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0,
0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0xca, 0xca, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xca, 0xca, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xca, 0xca, 0xe6, 0xe6, 0x0, 0x0,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xca, 0xca, 0xe6, 0x0,
0x0, 0x0, 0xe6, 0xe6, 0xca, 0xca, 0x0, 0xe6, 0xe6, 0xca,
0xca, 0xe6, 0xe6, 0x0, 0x0, 0x0, 0xe6, 0xe6, 0xca, 0xca,
0xe6, 0xe6, 0x0, 0x0, 0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0x0,
0x0, 0xe6, 0xe6, 0xca, 0xca, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xca, 0xca, 0xe6, 0xe6, 0x0, 0x0, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xca, 0xca, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0xd8,
0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0,
0xe6, 0xe6, 0xe6, 0xe6, 0xca, 0xca, 0xe6, 0xe6, 0xe6, 0xe6,
0x0, 0x0, 0x0, 0xe6, 0xe6, 0x0, 0x0, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xdc, 0xdc, 0xdc, 0xdc, 0x0, 0x0, 0xe6,
0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0xe6, 0xca,
0xca, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6e6,
0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6,
0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe8e8, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc,
0xe8e8, 0xd8d8, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc, 0xcaca, 0xcaca, 0xdcdc, 0xdcdc,
0xdcdc, 0xdcdc, 0xcaca, 0xcaca, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc,
0xdcdc, 0x101, 0x101, 0x101, 0x101, 0x101, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc,
0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xf0f0, 0xe6e6, 0xdcdc, 0xdcdc, 0xdcdc,
0xe6e6, 0xe6e6, 0xe6e6, 0xdcdc, 0xdcdc, 0x0, 0xeaea, 0xeaea, 0xe9e9, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xe6, 0xe6, 0x0, 0xe6, 0xe6, 0xe6, 0x0, 0xe6,
0x0, 0xe6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0x0, 0x0, 0x0, 0xe6, 0xe6, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6,
0xe6, 0x0, 0xe6, 0x0, 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0,
0x0, 0xe6, 0xe6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xe6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0, 0xe6,
0xe6, 0x0, 0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0,
0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0, 0xe6,
0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdcdc, 0xe6e6, 0xe6e6,
0xe6e6, 0xe6e6, 0xdcdc, 0xe6e6, 0xe6e6, 0xe6e6, 0xdede, 0xdcdc, 0xe6e6, 0xe6e6,
0xe6e6, 0xe6e6, 0x0, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc, 0xdcdc, 0xe6e6, 0xe6e6,
0xdcdc, 0xe6e6, 0xe6e6, 0xdede, 0xe4e4, 0xe6e6, 0xa0a, 0xb0b, 0xc0c, 0xd0d,
0xe0e, 0xf0f, 0x1010, 0x1111, 0x1212, 0x1313, 0x0, 0x1414, 0x1515, 0x1616,
0x0, 0x1717, 0x0, 0x1818, 0x1919, 0x0, 0xe6e6, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0xe6,
0xe6, 0xdc, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1b1b, 0x1c1c, 0x1d1d, 0x1e1e, 0x1f1f, 0x2020,
0x2121, 0x2222, 0xe6e6, 0xe6e6, 0xdcdc, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x2323, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xe6, 0x0, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x0, 0x0,
0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0x0, 0x0, 0xe6e6,
0xe6e6, 0xe6e6, 0xdcdc, 0xe6e6, 0x0, 0x0, 0xe6e6, 0xe6e6, 0x0, 0xdcdc,
0xe6e6, 0xe6e6, 0xdcdc, 0x0, 0x0, 0x2424, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xe6e6, 0xdcdc, 0xe6e6, 0xe6e6, 0xdcdc, 0xe6e6, 0xe6e6, 0xdcdc, 0xdcdc, 0xdcdc,
0xe6e6, 0xdcdc, 0xdcdc, 0xe6e6, 0xdcdc, 0xe6e6, 0xe6e6, 0xdcdc, 0xe6e6, 0xdcdc,
0xe6e6, 0xdcdc, 0xe6e6, 0xdcdc, 0xe6e6, 0xe6e6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x7, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x707, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x909, 0x0, 0x0,
0xe6e6, 0xdcdc, 0xe6e6, 0xe6e6, 0x0, 0x0, 0x0, 0x7, 0x7, 0x7,
0x7, 0x7, 0x7, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x707, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7, 0x7, 0x0, 0x7, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0,
0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x707, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x7, 0x7, 0x0,
0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x5b, 0x0, 0x0, 0x0, 0x0, 0x909,
0x0, 0x0, 0x0, 0x0, 0x0, 0x5454, 0x5b5b, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x909, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x0,
0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x6767, 0x6767, 0x909, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x6b6b, 0x6b6b, 0x6b6b, 0x6b6b, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7676, 0x7676, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7a7a, 0x7a7a, 0x7a7a, 0x7a7a, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xdcdc, 0xdcdc, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0xdcdc, 0x0, 0xdcdc, 0x0, 0xd8d8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x8181, 0x8282, 0x8182, 0x8484, 0x8184, 0x82,
0x0, 0x82, 0x0, 0x8282, 0x8282, 0x8282, 0x8282, 0x0, 0x0, 0x8282,
0x8182, 0xe6e6, 0xe6e6, 0x909, 0x0, 0xe6e6, 0xe6e6, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xdcdc, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x707, 0x0, 0x909, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x909, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4e4, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0xdc, 0xdc, 0xe6, 0xe6, 0xdc,
0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xdc, 0xdc, 0xdc,
0xdc, 0xca, 0xca, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xdc,
0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xdc, 0xdc, 0xe6,
0xe6, 0xca, 0xca, 0xdc, 0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xdc,
0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xdc, 0xdc, 0xdc,
0xdc, 0xe6, 0xe6, 0xdc, 0xdc, 0xe6, 0xe6, 0xdc, 0xdc, 0xdc,
0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xdc, 0xdc, 0xe6, 0xe6, 0xdc, 0xdc, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xdc, 0xdc, 0xdc,
0xdc, 0xdc, 0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xdc,
0xdc, 0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0x0, 0xe6, 0x0,
0x0, 0x0, 0x0, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xdc,
0xdc, 0xdc, 0xdc, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xdc, 0xdc, 0xe6, 0xe6, 0xdc, 0xdc, 0xe6,
0xe6, 0xe6, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0xe6, 0x0,
0xe6, 0x0, 0xe6, 0x0, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe6, 0xe6, 0xf0, 0xf0,
0xf0, 0x0, 0xe6, 0xf0, 0xe6, 0xe6, 0xe6, 0xe6, 0xf0, 0x0,
0x0, 0x0, 0xe6, 0xf0, 0xf0, 0xf0, 0x0, 0xe6, 0xf0, 0xe6,
0xe6, 0xe6, 0xe6, 0xf0, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0x0,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0x0, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6,
0xe6, 0xe6, 0x0, 0x0, 0xf0, 0xf0, 0xf0, 0x0, 0xe6, 0xf0,
0xe6, 0xe6, 0xe6, 0xe6, 0xf0, 0x0, 0x0, 0x0, 0xe6e6, 0xe6e6,
0x101, 0x101, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0x101, 0x101, 0x101, 0xe6e6,
0xe6e6, 0x0, 0x0, 0x0, 0xe6e6, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0,
0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x0,
0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0,
0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdada, 0xe4e4,
0xe8e8, 0xdede, 0xe0e0, 0xe0e0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x8, 0x0,
0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0,
0x8, 0x0, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x0, 0x8, 0x8, 0x0,
0x8, 0x8, 0x0, 0x8, 0x8, 0x0, 0x8, 0x8, 0x0, 0x0,
0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x808, 0x808, 0x0,
0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0,
0x8, 0x8, 0x8, 0x8, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xe, 0x1a1a, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x18, 0x19, 0x18, 0x19, 0x11, 0x12,
0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0, 0x15, 0x15,
0x15, 0x15, 0x15, 0x0, 0x15, 0x0, 0x15, 0x15, 0x0, 0x15,
0x15, 0x0, 0x15, 0x15, 0x15, 0x15, 0x15, 0x13, 0x17, 0x17,
0x17, 0x0, 0xe6e6, 0xe6e6, 0xe6e6, 0xe6e6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
};
/* private methods ---------------------------------------------------------- */
/**
* Private method which performs a quick FCD check on a string, to quickly
* determine if a string is in a required FCD format.
* FCD is the set of strings such that for each character in the string,
* decomposition without any canonical reordering will produce a NFD.
* @param source string for determining if it is in a normalized format
* @param sourcelength length of source to test
* @paran mode normalization format from the enum UNormalizationMode
* @param status A pointer to an UErrorCode to receive any errors
* @return TRUE if source is in FCD format, FALSE otherwise
*/
U_CAPI UBool
checkFCD(const UChar* source, int32_t sourcelength, UErrorCode* status)
{
UChar32 codepoint;
const UChar *psource;
const UChar *pend;
uint8_t oldfcdtrail = 0;
uint16_t fcd = 0;
if (U_FAILURE(*status))
return FALSE;
if (sourcelength >= 0) {
psource = source;
pend = source + sourcelength;
for (;;) {
if (psource >= pend) {
return TRUE;
}
/* fast route : since codepoints < NFC_ZER_CC_BLOCK_LIMIT_ has
combining class 0.
looking at the minimum values, surrogates are not a problem */
if (*psource >= NFC_ZERO_CC_BLOCK_LIMIT_) {
break;
}
psource ++;
}
}
else {
psource = source;
for (;;) {
if (*psource == 0) {
return TRUE;
}
/* fast route : since codepoints < min has combining class 0 and YES
looking at the minimum values, surrogates are not a problem */
if (*psource >= NFC_ZERO_CC_BLOCK_LIMIT_) {
break;
}
psource ++;
}
}
/* not end of string and yet failed simple compare
safe to shift back one char because the previous char has to be < 0x300 or the
start of a string */
if (psource == source) {
oldfcdtrail = 0;
}
else {
codepoint = *(psource - 1);
oldfcdtrail = (uint8_t)(FCD_STAGE_3_[
FCD_STAGE_2_[FCD_STAGE_1_[codepoint >> STAGE_1_SHIFT_] +
((codepoint >> STAGE_2_SHIFT_) & STAGE_2_MASK_AFTER_SHIFT_)]
+ (codepoint & STAGE_3_MASK_)] & LAST_BYTE_MASK_);
}
if (sourcelength >= 0) {
for (;;) {
int count = 0;
uint8_t lead;
if (psource >= pend) {
return TRUE;
}
UTF_NEXT_CHAR(psource, count, pend - psource, codepoint);
/* trie access */
fcd = FCD_STAGE_3_[
FCD_STAGE_2_[FCD_STAGE_1_[codepoint >> STAGE_1_SHIFT_] +
((codepoint >> STAGE_2_SHIFT_) & STAGE_2_MASK_AFTER_SHIFT_)] +
(codepoint & STAGE_3_MASK_)];
lead = (uint8_t)(fcd >> SECOND_LAST_BYTE_SHIFT_);
if (lead != 0 && oldfcdtrail > lead) {
return FALSE;
}
oldfcdtrail = (uint8_t)(fcd & LAST_BYTE_MASK_);
psource += count;
}
}
else {
for (;;) {
int count = 0;
uint8_t lead;
UTF_NEXT_CHAR(psource, count, pend - psource, codepoint);
if (codepoint == 0) {
return TRUE;
}
/* trie access */
fcd = FCD_STAGE_3_[
FCD_STAGE_2_[FCD_STAGE_1_[codepoint >> STAGE_1_SHIFT_] +
((codepoint >> STAGE_2_SHIFT_) & STAGE_2_MASK_AFTER_SHIFT_)] +
(codepoint & STAGE_3_MASK_)];
lead = (uint8_t)(fcd >> SECOND_LAST_BYTE_SHIFT_);
if (lead != 0 && oldfcdtrail > lead) {
return FALSE;
}
oldfcdtrail = (uint8_t)(fcd & LAST_BYTE_MASK_);
psource += count;
}
}
}